Skip to main content

azul_css/props/
property.rs

1//! Defines the core `CssProperty` enum, which represents any single parsed CSS property,
2//! as well as top-level functions for parsing CSS keys and values.
3
4use alloc::{
5    boxed::Box,
6    collections::btree_map::BTreeMap,
7    string::{String, ToString},
8    vec::Vec,
9};
10use core::fmt;
11
12use crate::{
13    corety::AzString,
14    css::{BoxOrStatic, CssPropertyValue},
15    props::basic::{error::InvalidValueErr, pixel::PixelValueWithAuto},
16};
17// Import all property types from their new locations
18use crate::{
19    format_rust_code::FormatAsRustCode,
20    props::{
21        basic::{
22            color::{parse_css_color, ColorU, CssColorParseError, CssColorParseErrorOwned},
23            font::{
24                parse_style_font_family, CssStyleFontFamilyParseError,
25                CssStyleFontFamilyParseErrorOwned, StyleFontFamilyVec, *,
26            },
27            length::{parse_float_value, parse_percentage_value, FloatValue, PercentageValue},
28            pixel::{
29                parse_pixel_value, CssPixelValueParseError, CssPixelValueParseErrorOwned,
30                PixelValue,
31            },
32            DurationParseError, DurationParseErrorOwned, InterpolateResolver, InvalidValueErrOwned,
33            PercentageParseError,
34        },
35        formatter::PrintAsCssValue,
36        layout::{
37            column::*, dimensions::*, display::*, flex::*, flow::*, fragmentation::*, grid::*,
38            overflow::*, position::*, shape::*, spacing::*, table::*, text::*, wrapping::*,
39        },
40        style::{
41            azul_exclusion::*, background::*, border::*, border_radius::*, box_shadow::*,
42            content::*, effects::*, filter::*, lists::*, scrollbar::*, text::*, transform::*,
43            SelectionBackgroundColor, SelectionColor, SelectionRadius,
44        },
45    },
46};
47
48const COMBINED_CSS_PROPERTIES_KEY_MAP: [(CombinedCssPropertyType, &str); 27] = [
49    (CombinedCssPropertyType::BorderRadius, "border-radius"),
50    (CombinedCssPropertyType::Overflow, "overflow"),
51    (CombinedCssPropertyType::Padding, "padding"),
52    (CombinedCssPropertyType::Margin, "margin"),
53    (CombinedCssPropertyType::Border, "border"),
54    (CombinedCssPropertyType::BorderLeft, "border-left"),
55    (CombinedCssPropertyType::BorderRight, "border-right"),
56    (CombinedCssPropertyType::BorderTop, "border-top"),
57    (CombinedCssPropertyType::BorderBottom, "border-bottom"),
58    (CombinedCssPropertyType::BorderColor, "border-color"),
59    (CombinedCssPropertyType::BorderStyle, "border-style"),
60    (CombinedCssPropertyType::BorderWidth, "border-width"),
61    (CombinedCssPropertyType::BoxShadow, "box-shadow"),
62    (CombinedCssPropertyType::BackgroundColor, "background-color"),
63    (CombinedCssPropertyType::BackgroundImage, "background-image"),
64    (CombinedCssPropertyType::Background, "background"),
65    (CombinedCssPropertyType::Flex, "flex"),
66    (CombinedCssPropertyType::Grid, "grid"),
67    (CombinedCssPropertyType::Gap, "gap"),
68    (CombinedCssPropertyType::GridGap, "grid-gap"),
69    (CombinedCssPropertyType::Font, "font"),
70    (CombinedCssPropertyType::Columns, "columns"),
71    (CombinedCssPropertyType::GridArea, "grid-area"),
72    (CombinedCssPropertyType::ColumnRule, "column-rule"),
73    (CombinedCssPropertyType::TextBox, "text-box"),
74    // +spec:writing-modes:798cca - inset-block/inset-inline shorthand properties
75    (CombinedCssPropertyType::InsetBlock, "inset-block"),
76    (CombinedCssPropertyType::InsetInline, "inset-inline"),
77];
78
79const CSS_PROPERTY_KEY_MAP: [(CssPropertyType, &str); 178] = [
80    (CssPropertyType::Display, "display"),
81    (CssPropertyType::Float, "float"),
82    (CssPropertyType::BoxSizing, "box-sizing"),
83    (CssPropertyType::TextColor, "color"),
84    (CssPropertyType::FontSize, "font-size"),
85    (CssPropertyType::FontFamily, "font-family"),
86    (CssPropertyType::FontWeight, "font-weight"),
87    (CssPropertyType::FontStyle, "font-style"),
88    (CssPropertyType::TextAlign, "text-align"),
89    (CssPropertyType::TextJustify, "text-justify"),
90    (CssPropertyType::VerticalAlign, "vertical-align"),
91    (CssPropertyType::LetterSpacing, "letter-spacing"),
92    (CssPropertyType::LineHeight, "line-height"),
93    (CssPropertyType::WordSpacing, "word-spacing"),
94    (CssPropertyType::TabSize, "tab-size"),
95    (CssPropertyType::WhiteSpace, "white-space"),
96    (CssPropertyType::Hyphens, "hyphens"),
97    (CssPropertyType::WordBreak, "word-break"),
98    (CssPropertyType::OverflowWrap, "overflow-wrap"),
99    (CssPropertyType::OverflowWrap, "word-wrap"), // +spec:line-breaking:45074d - word-wrap is legacy name alias for overflow-wrap
100    (CssPropertyType::LineBreak, "line-break"),
101    (CssPropertyType::ObjectFit, "object-fit"),
102    (CssPropertyType::ObjectPosition, "object-position"),
103    (CssPropertyType::AspectRatio, "aspect-ratio"),
104    (CssPropertyType::TextOrientation, "text-orientation"),
105    (CssPropertyType::TextAlignLast, "text-align-last"),
106    (CssPropertyType::Direction, "direction"),
107    (CssPropertyType::UserSelect, "user-select"),
108    (CssPropertyType::TextDecoration, "text-decoration"),
109    (CssPropertyType::TextIndent, "text-indent"),
110    (CssPropertyType::InitialLetter, "initial-letter"),
111    (CssPropertyType::LineClamp, "line-clamp"),
112    (CssPropertyType::HangingPunctuation, "hanging-punctuation"),
113    (CssPropertyType::TextCombineUpright, "text-combine-upright"),
114    (CssPropertyType::UnicodeBidi, "unicode-bidi"),
115    (CssPropertyType::TextBoxTrim, "text-box-trim"),
116    (CssPropertyType::TextBoxEdge, "text-box-edge"),
117    (CssPropertyType::DominantBaseline, "dominant-baseline"),
118    (CssPropertyType::AlignmentBaseline, "alignment-baseline"),
119    (CssPropertyType::InitialLetterAlign, "initial-letter-align"),
120    (CssPropertyType::InitialLetterWrap, "initial-letter-wrap"),
121    (CssPropertyType::ScrollbarGutter, "scrollbar-gutter"),
122    (CssPropertyType::OverflowClipMargin, "overflow-clip-margin"),
123    // +spec:overflow:297dc3 - clip rect() auto values resolve to border box edges
124    (CssPropertyType::Clip, "clip"),
125    (CssPropertyType::ExclusionMargin, "-azul-exclusion-margin"),
126    (
127        CssPropertyType::HyphenationLanguage,
128        "-azul-hyphenation-language",
129    ),
130    (CssPropertyType::Cursor, "cursor"),
131    (CssPropertyType::Width, "width"),
132    (CssPropertyType::Height, "height"),
133    (CssPropertyType::MinWidth, "min-width"),
134    (CssPropertyType::MinHeight, "min-height"),
135    (CssPropertyType::MaxWidth, "max-width"),
136    (CssPropertyType::MaxHeight, "max-height"),
137    (CssPropertyType::Position, "position"),
138    (CssPropertyType::Top, "top"),
139    (CssPropertyType::Right, "right"),
140    (CssPropertyType::Left, "left"),
141    (CssPropertyType::Bottom, "bottom"),
142    (CssPropertyType::ZIndex, "z-index"),
143    (CssPropertyType::FlexWrap, "flex-wrap"),
144    (CssPropertyType::FlexDirection, "flex-direction"),
145    (CssPropertyType::FlexGrow, "flex-grow"),
146    (CssPropertyType::FlexShrink, "flex-shrink"),
147    (CssPropertyType::FlexBasis, "flex-basis"),
148    (CssPropertyType::JustifyContent, "justify-content"),
149    (CssPropertyType::AlignItems, "align-items"),
150    (CssPropertyType::AlignContent, "align-content"),
151    (CssPropertyType::ColumnGap, "column-gap"),
152    (CssPropertyType::RowGap, "row-gap"),
153    (
154        CssPropertyType::GridTemplateColumns,
155        "grid-template-columns",
156    ),
157    (CssPropertyType::GridTemplateRows, "grid-template-rows"),
158    (CssPropertyType::GridAutoColumns, "grid-auto-columns"),
159    (CssPropertyType::GridAutoRows, "grid-auto-rows"),
160    (CssPropertyType::GridColumn, "grid-column"),
161    (CssPropertyType::GridRow, "grid-row"),
162    (CssPropertyType::GridTemplateAreas, "grid-template-areas"),
163    (CssPropertyType::WritingMode, "writing-mode"),
164    (CssPropertyType::Clear, "clear"),
165    (CssPropertyType::OverflowX, "overflow-x"),
166    (CssPropertyType::OverflowY, "overflow-y"),
167    // +spec:overflow:17654b - overflow-block and overflow-inline logical properties
168    (CssPropertyType::OverflowBlock, "overflow-block"),
169    (CssPropertyType::OverflowInline, "overflow-inline"),
170    (CssPropertyType::PaddingTop, "padding-top"),
171    (CssPropertyType::PaddingLeft, "padding-left"),
172    (CssPropertyType::PaddingRight, "padding-right"),
173    (CssPropertyType::PaddingBottom, "padding-bottom"),
174    (CssPropertyType::PaddingInlineStart, "padding-inline-start"),
175    (CssPropertyType::PaddingInlineEnd, "padding-inline-end"),
176    (CssPropertyType::MarginTop, "margin-top"),
177    (CssPropertyType::MarginLeft, "margin-left"),
178    (CssPropertyType::MarginRight, "margin-right"),
179    (CssPropertyType::MarginBottom, "margin-bottom"),
180    (CssPropertyType::BackgroundContent, "background"),
181    (CssPropertyType::BackgroundPosition, "background-position"),
182    (CssPropertyType::BackgroundSize, "background-size"),
183    (CssPropertyType::BackgroundRepeat, "background-repeat"),
184    (
185        CssPropertyType::BorderTopLeftRadius,
186        "border-top-left-radius",
187    ),
188    (
189        CssPropertyType::BorderTopRightRadius,
190        "border-top-right-radius",
191    ),
192    (
193        CssPropertyType::BorderBottomLeftRadius,
194        "border-bottom-left-radius",
195    ),
196    (
197        CssPropertyType::BorderBottomRightRadius,
198        "border-bottom-right-radius",
199    ),
200    (CssPropertyType::BorderTopColor, "border-top-color"),
201    (CssPropertyType::BorderRightColor, "border-right-color"),
202    (CssPropertyType::BorderLeftColor, "border-left-color"),
203    (CssPropertyType::BorderBottomColor, "border-bottom-color"),
204    (CssPropertyType::BorderTopStyle, "border-top-style"),
205    (CssPropertyType::BorderRightStyle, "border-right-style"),
206    (CssPropertyType::BorderLeftStyle, "border-left-style"),
207    (CssPropertyType::BorderBottomStyle, "border-bottom-style"),
208    (CssPropertyType::BorderTopWidth, "border-top-width"),
209    (CssPropertyType::BorderRightWidth, "border-right-width"),
210    (CssPropertyType::BorderLeftWidth, "border-left-width"),
211    (CssPropertyType::BorderBottomWidth, "border-bottom-width"),
212    (CssPropertyType::BoxShadowTop, "-azul-box-shadow-top"),
213    (CssPropertyType::BoxShadowRight, "-azul-box-shadow-right"),
214    (CssPropertyType::BoxShadowLeft, "-azul-box-shadow-left"),
215    (CssPropertyType::BoxShadowBottom, "-azul-box-shadow-bottom"),
216    (CssPropertyType::ScrollbarTrack, "-azul-scrollbar-track"),
217    (CssPropertyType::ScrollbarThumb, "-azul-scrollbar-thumb"),
218    (CssPropertyType::ScrollbarButton, "-azul-scrollbar-button"),
219    (CssPropertyType::ScrollbarCorner, "-azul-scrollbar-corner"),
220    (CssPropertyType::ScrollbarResizer, "-azul-scrollbar-resizer"),
221    (CssPropertyType::CaretColor, "caret-color"),
222    (
223        CssPropertyType::CaretAnimationDuration,
224        "caret-animation-duration",
225    ),
226    (CssPropertyType::CaretWidth, "-azul-caret-width"),
227    (
228        CssPropertyType::SelectionBackgroundColor,
229        "-azul-selection-background-color",
230    ),
231    (CssPropertyType::SelectionColor, "-azul-selection-color"),
232    (CssPropertyType::SelectionRadius, "-azul-selection-radius"),
233    (CssPropertyType::ScrollbarWidth, "scrollbar-width"),
234    (CssPropertyType::ScrollbarColor, "scrollbar-color"),
235    (CssPropertyType::ScrollbarVisibility, "-azul-scrollbar-visibility"),
236    (CssPropertyType::ScrollbarFadeDelay, "-azul-scrollbar-fade-delay"),
237    (CssPropertyType::ScrollbarFadeDuration, "-azul-scrollbar-fade-duration"),
238    (CssPropertyType::Opacity, "opacity"),
239    (CssPropertyType::Visibility, "visibility"),
240    (CssPropertyType::Transform, "transform"),
241    (CssPropertyType::PerspectiveOrigin, "perspective-origin"),
242    (CssPropertyType::TransformOrigin, "transform-origin"),
243    (CssPropertyType::BackfaceVisibility, "backface-visibility"),
244    (CssPropertyType::MixBlendMode, "mix-blend-mode"),
245    (CssPropertyType::Filter, "filter"),
246    (CssPropertyType::BackdropFilter, "backdrop-filter"),
247    (CssPropertyType::TextShadow, "text-shadow"),
248    (CssPropertyType::GridAutoFlow, "grid-auto-flow"),
249    (CssPropertyType::JustifySelf, "justify-self"),
250    (CssPropertyType::JustifyItems, "justify-items"),
251    (CssPropertyType::Gap, "gap"),
252    (CssPropertyType::GridGap, "grid-gap"),
253    (CssPropertyType::AlignSelf, "align-self"),
254    (CssPropertyType::Font, "font"),
255    (CssPropertyType::BreakBefore, "break-before"),
256    (CssPropertyType::BreakAfter, "break-after"),
257    (CssPropertyType::BreakInside, "break-inside"),
258    // CSS 2.1 legacy aliases for page breaking
259    (CssPropertyType::BreakBefore, "page-break-before"),
260    (CssPropertyType::BreakAfter, "page-break-after"),
261    (CssPropertyType::BreakInside, "page-break-inside"),
262    (CssPropertyType::Orphans, "orphans"),
263    (CssPropertyType::Widows, "widows"),
264    (CssPropertyType::BoxDecorationBreak, "box-decoration-break"),
265    (CssPropertyType::ColumnCount, "column-count"),
266    (CssPropertyType::ColumnWidth, "column-width"),
267    (CssPropertyType::ColumnSpan, "column-span"),
268    (CssPropertyType::ColumnFill, "column-fill"),
269    (CssPropertyType::ColumnRuleWidth, "column-rule-width"),
270    (CssPropertyType::ColumnRuleStyle, "column-rule-style"),
271    (CssPropertyType::ColumnRuleColor, "column-rule-color"),
272    (CssPropertyType::FlowInto, "flow-into"),
273    (CssPropertyType::FlowFrom, "flow-from"),
274    (CssPropertyType::ShapeOutside, "shape-outside"),
275    (CssPropertyType::ShapeInside, "shape-inside"),
276    (CssPropertyType::ClipPath, "clip-path"),
277    (CssPropertyType::ShapeMargin, "shape-margin"),
278    (
279        CssPropertyType::ShapeImageThreshold,
280        "shape-image-threshold",
281    ),
282    (CssPropertyType::Content, "content"),
283    (CssPropertyType::CounterReset, "counter-reset"),
284    (CssPropertyType::CounterIncrement, "counter-increment"),
285    (CssPropertyType::ListStyleType, "list-style-type"),
286    (CssPropertyType::ListStylePosition, "list-style-position"),
287    (CssPropertyType::StringSet, "string-set"),
288];
289
290// Type aliases for `CssPropertyValue<T>`
291pub type CaretColorValue = CssPropertyValue<CaretColor>;
292pub type CaretAnimationDurationValue = CssPropertyValue<CaretAnimationDuration>;
293pub type CaretWidthValue = CssPropertyValue<CaretWidth>;
294pub type SelectionBackgroundColorValue = CssPropertyValue<SelectionBackgroundColor>;
295pub type SelectionColorValue = CssPropertyValue<SelectionColor>;
296pub type SelectionRadiusValue = CssPropertyValue<SelectionRadius>;
297pub type StyleBackgroundContentVecValue = CssPropertyValue<StyleBackgroundContentVec>;
298pub type StyleBackgroundPositionVecValue = CssPropertyValue<StyleBackgroundPositionVec>;
299pub type StyleBackgroundSizeVecValue = CssPropertyValue<StyleBackgroundSizeVec>;
300pub type StyleBackgroundRepeatVecValue = CssPropertyValue<StyleBackgroundRepeatVec>;
301pub type StyleFontSizeValue = CssPropertyValue<StyleFontSize>;
302pub type StyleFontFamilyVecValue = CssPropertyValue<StyleFontFamilyVec>;
303pub type StyleFontWeightValue = CssPropertyValue<StyleFontWeight>;
304pub type StyleFontStyleValue = CssPropertyValue<StyleFontStyle>;
305pub type StyleTextColorValue = CssPropertyValue<StyleTextColor>;
306pub type StyleTextAlignValue = CssPropertyValue<StyleTextAlign>;
307pub type StyleVerticalAlignValue = CssPropertyValue<StyleVerticalAlign>;
308pub type StyleLineHeightValue = CssPropertyValue<StyleLineHeight>;
309pub type StyleLetterSpacingValue = CssPropertyValue<StyleLetterSpacing>;
310pub type StyleTextIndentValue = CssPropertyValue<StyleTextIndent>;
311pub type StyleInitialLetterValue = CssPropertyValue<StyleInitialLetter>;
312pub type StyleLineClampValue = CssPropertyValue<StyleLineClamp>;
313pub type StyleHangingPunctuationValue = CssPropertyValue<StyleHangingPunctuation>;
314pub type StyleTextCombineUprightValue = CssPropertyValue<StyleTextCombineUpright>;
315pub type StyleUnicodeBidiValue = CssPropertyValue<StyleUnicodeBidi>;
316pub type StyleTextBoxTrimValue = CssPropertyValue<StyleTextBoxTrim>;
317pub type StyleTextBoxEdgeValue = CssPropertyValue<StyleTextBoxEdge>;
318pub type StyleDominantBaselineValue = CssPropertyValue<StyleDominantBaseline>;
319pub type StyleAlignmentBaselineValue = CssPropertyValue<StyleAlignmentBaseline>;
320pub type StyleInitialLetterAlignValue = CssPropertyValue<StyleInitialLetterAlign>;
321pub type StyleInitialLetterWrapValue = CssPropertyValue<StyleInitialLetterWrap>;
322pub type StyleScrollbarGutterValue = CssPropertyValue<StyleScrollbarGutter>;
323pub type StyleOverflowClipMarginValue = CssPropertyValue<StyleOverflowClipMargin>;
324pub type StyleClipRectValue = CssPropertyValue<StyleClipRect>;
325pub type StyleExclusionMarginValue = CssPropertyValue<StyleExclusionMargin>;
326pub type StyleHyphenationLanguageValue = CssPropertyValue<StyleHyphenationLanguage>;
327pub type StyleWordSpacingValue = CssPropertyValue<StyleWordSpacing>;
328pub type StyleTabSizeValue = CssPropertyValue<StyleTabSize>;
329pub type StyleCursorValue = CssPropertyValue<StyleCursor>;
330pub type StyleBoxShadowValue = CssPropertyValue<crate::css::BoxOrStaticStyleBoxShadow>;
331pub type StyleBorderTopColorValue = CssPropertyValue<StyleBorderTopColor>;
332pub type StyleBorderLeftColorValue = CssPropertyValue<StyleBorderLeftColor>;
333pub type StyleBorderRightColorValue = CssPropertyValue<StyleBorderRightColor>;
334pub type StyleBorderBottomColorValue = CssPropertyValue<StyleBorderBottomColor>;
335pub type StyleBorderTopStyleValue = CssPropertyValue<StyleBorderTopStyle>;
336pub type StyleBorderLeftStyleValue = CssPropertyValue<StyleBorderLeftStyle>;
337pub type StyleBorderRightStyleValue = CssPropertyValue<StyleBorderRightStyle>;
338pub type StyleBorderBottomStyleValue = CssPropertyValue<StyleBorderBottomStyle>;
339pub type StyleBorderTopLeftRadiusValue = CssPropertyValue<StyleBorderTopLeftRadius>;
340pub type StyleBorderTopRightRadiusValue = CssPropertyValue<StyleBorderTopRightRadius>;
341pub type StyleBorderBottomLeftRadiusValue = CssPropertyValue<StyleBorderBottomLeftRadius>;
342pub type StyleBorderBottomRightRadiusValue = CssPropertyValue<StyleBorderBottomRightRadius>;
343pub type StyleOpacityValue = CssPropertyValue<StyleOpacity>;
344pub type StyleVisibilityValue = CssPropertyValue<StyleVisibility>;
345pub type StyleTransformVecValue = CssPropertyValue<StyleTransformVec>;
346pub type StyleTransformOriginValue = CssPropertyValue<StyleTransformOrigin>;
347pub type StylePerspectiveOriginValue = CssPropertyValue<StylePerspectiveOrigin>;
348pub type StyleBackfaceVisibilityValue = CssPropertyValue<StyleBackfaceVisibility>;
349pub type StyleMixBlendModeValue = CssPropertyValue<StyleMixBlendMode>;
350pub type StyleFilterVecValue = CssPropertyValue<StyleFilterVec>;
351pub type StyleBackgroundContentValue = CssPropertyValue<StyleBackgroundContent>;
352pub type LayoutScrollbarWidthValue = CssPropertyValue<LayoutScrollbarWidth>;
353pub type StyleScrollbarColorValue = CssPropertyValue<StyleScrollbarColor>;
354pub type ScrollbarVisibilityModeValue = CssPropertyValue<ScrollbarVisibilityMode>;
355pub type ScrollbarFadeDelayValue = CssPropertyValue<ScrollbarFadeDelay>;
356pub type ScrollbarFadeDurationValue = CssPropertyValue<ScrollbarFadeDuration>;
357pub type LayoutDisplayValue = CssPropertyValue<LayoutDisplay>;
358pub type StyleHyphensValue = CssPropertyValue<StyleHyphens>;
359pub type StyleWordBreakValue = CssPropertyValue<StyleWordBreak>;
360pub type StyleOverflowWrapValue = CssPropertyValue<StyleOverflowWrap>;
361pub type StyleLineBreakValue = CssPropertyValue<StyleLineBreak>;
362pub type StyleObjectFitValue = CssPropertyValue<StyleObjectFit>;
363pub type StyleObjectPositionValue = CssPropertyValue<StyleObjectPosition>;
364pub type StyleAspectRatioValue = CssPropertyValue<StyleAspectRatio>;
365pub type StyleTextOrientationValue = CssPropertyValue<StyleTextOrientation>;
366pub type StyleTextAlignLastValue = CssPropertyValue<StyleTextAlignLast>;
367pub type StyleDirectionValue = CssPropertyValue<StyleDirection>;
368pub type StyleUserSelectValue = CssPropertyValue<StyleUserSelect>;
369pub type StyleTextDecorationValue = CssPropertyValue<StyleTextDecoration>;
370pub type StyleWhiteSpaceValue = CssPropertyValue<StyleWhiteSpace>;
371pub type LayoutFloatValue = CssPropertyValue<LayoutFloat>;
372pub type LayoutBoxSizingValue = CssPropertyValue<LayoutBoxSizing>;
373pub type LayoutWidthValue = CssPropertyValue<LayoutWidth>;
374pub type LayoutHeightValue = CssPropertyValue<LayoutHeight>;
375pub type LayoutMinWidthValue = CssPropertyValue<LayoutMinWidth>;
376pub type LayoutMinHeightValue = CssPropertyValue<LayoutMinHeight>;
377pub type LayoutMaxWidthValue = CssPropertyValue<LayoutMaxWidth>;
378pub type LayoutMaxHeightValue = CssPropertyValue<LayoutMaxHeight>;
379pub type LayoutPositionValue = CssPropertyValue<LayoutPosition>;
380pub type LayoutTopValue = CssPropertyValue<LayoutTop>;
381pub type LayoutInsetBottomValue = CssPropertyValue<LayoutInsetBottom>;
382pub type LayoutRightValue = CssPropertyValue<LayoutRight>;
383pub type LayoutLeftValue = CssPropertyValue<LayoutLeft>;
384pub type LayoutZIndexValue = CssPropertyValue<LayoutZIndex>;
385pub type LayoutPaddingTopValue = CssPropertyValue<LayoutPaddingTop>;
386pub type LayoutPaddingBottomValue = CssPropertyValue<LayoutPaddingBottom>;
387pub type LayoutPaddingLeftValue = CssPropertyValue<LayoutPaddingLeft>;
388pub type LayoutPaddingRightValue = CssPropertyValue<LayoutPaddingRight>;
389pub type LayoutPaddingInlineStartValue = CssPropertyValue<LayoutPaddingInlineStart>;
390pub type LayoutPaddingInlineEndValue = CssPropertyValue<LayoutPaddingInlineEnd>;
391pub type LayoutMarginTopValue = CssPropertyValue<LayoutMarginTop>;
392pub type LayoutMarginBottomValue = CssPropertyValue<LayoutMarginBottom>;
393pub type LayoutTextJustifyValue = CssPropertyValue<LayoutTextJustify>;
394pub type LayoutMarginLeftValue = CssPropertyValue<LayoutMarginLeft>;
395pub type LayoutMarginRightValue = CssPropertyValue<LayoutMarginRight>;
396pub type LayoutBorderTopWidthValue = CssPropertyValue<LayoutBorderTopWidth>;
397pub type LayoutBorderLeftWidthValue = CssPropertyValue<LayoutBorderLeftWidth>;
398pub type LayoutBorderRightWidthValue = CssPropertyValue<LayoutBorderRightWidth>;
399pub type LayoutBorderBottomWidthValue = CssPropertyValue<LayoutBorderBottomWidth>;
400pub type LayoutOverflowValue = CssPropertyValue<LayoutOverflow>;
401pub type LayoutFlexDirectionValue = CssPropertyValue<LayoutFlexDirection>;
402pub type LayoutFlexWrapValue = CssPropertyValue<LayoutFlexWrap>;
403pub type LayoutFlexGrowValue = CssPropertyValue<LayoutFlexGrow>;
404pub type LayoutFlexShrinkValue = CssPropertyValue<LayoutFlexShrink>;
405pub type LayoutFlexBasisValue = CssPropertyValue<LayoutFlexBasis>;
406pub type LayoutJustifyContentValue = CssPropertyValue<LayoutJustifyContent>;
407pub type LayoutAlignItemsValue = CssPropertyValue<LayoutAlignItems>;
408pub type LayoutAlignContentValue = CssPropertyValue<LayoutAlignContent>;
409pub type LayoutColumnGapValue = CssPropertyValue<LayoutColumnGap>;
410pub type LayoutRowGapValue = CssPropertyValue<LayoutRowGap>;
411pub type LayoutGridTemplateColumnsValue = CssPropertyValue<GridTemplate>;
412pub type LayoutGridTemplateRowsValue = CssPropertyValue<GridTemplate>;
413pub type LayoutGridAutoColumnsValue = CssPropertyValue<GridAutoTracks>;
414pub type LayoutGridAutoRowsValue = CssPropertyValue<GridAutoTracks>;
415pub type LayoutGridColumnValue = CssPropertyValue<GridPlacement>;
416pub type LayoutGridRowValue = CssPropertyValue<GridPlacement>;
417pub type LayoutGridTemplateAreasValue = CssPropertyValue<crate::props::layout::grid::GridTemplateAreas>;
418pub type LayoutWritingModeValue = CssPropertyValue<LayoutWritingMode>;
419pub type LayoutClearValue = CssPropertyValue<LayoutClear>;
420pub type LayoutGridAutoFlowValue = CssPropertyValue<LayoutGridAutoFlow>;
421pub type LayoutJustifySelfValue = CssPropertyValue<LayoutJustifySelf>;
422pub type LayoutJustifyItemsValue = CssPropertyValue<LayoutJustifyItems>;
423pub type LayoutGapValue = CssPropertyValue<LayoutGap>;
424pub type LayoutAlignSelfValue = CssPropertyValue<LayoutAlignSelf>;
425pub type StyleFontValue = CssPropertyValue<StyleFontFamilyVec>;
426pub type PageBreakValue = CssPropertyValue<PageBreak>;
427pub type BreakInsideValue = CssPropertyValue<BreakInside>;
428pub type WidowsValue = CssPropertyValue<Widows>;
429pub type OrphansValue = CssPropertyValue<Orphans>;
430pub type BoxDecorationBreakValue = CssPropertyValue<BoxDecorationBreak>;
431pub type ColumnCountValue = CssPropertyValue<ColumnCount>;
432pub type ColumnWidthValue = CssPropertyValue<ColumnWidth>;
433pub type ColumnSpanValue = CssPropertyValue<ColumnSpan>;
434pub type ColumnFillValue = CssPropertyValue<ColumnFill>;
435pub type ColumnRuleWidthValue = CssPropertyValue<ColumnRuleWidth>;
436pub type ColumnRuleStyleValue = CssPropertyValue<ColumnRuleStyle>;
437pub type ColumnRuleColorValue = CssPropertyValue<ColumnRuleColor>;
438pub type FlowIntoValue = CssPropertyValue<FlowInto>;
439pub type FlowFromValue = CssPropertyValue<FlowFrom>;
440pub type ShapeOutsideValue = CssPropertyValue<ShapeOutside>;
441pub type ShapeInsideValue = CssPropertyValue<ShapeInside>;
442pub type ClipPathValue = CssPropertyValue<ClipPath>;
443pub type ShapeMarginValue = CssPropertyValue<ShapeMargin>;
444pub type ShapeImageThresholdValue = CssPropertyValue<ShapeImageThreshold>;
445pub type LayoutTableLayoutValue = CssPropertyValue<LayoutTableLayout>;
446pub type StyleBorderCollapseValue = CssPropertyValue<StyleBorderCollapse>;
447pub type LayoutBorderSpacingValue = CssPropertyValue<LayoutBorderSpacing>;
448pub type StyleCaptionSideValue = CssPropertyValue<StyleCaptionSide>;
449pub type StyleEmptyCellsValue = CssPropertyValue<StyleEmptyCells>;
450pub type ContentValue = CssPropertyValue<Content>;
451pub type CounterResetValue = CssPropertyValue<CounterReset>;
452pub type CounterIncrementValue = CssPropertyValue<CounterIncrement>;
453pub type StyleListStyleTypeValue = CssPropertyValue<StyleListStyleType>;
454pub type StyleListStylePositionValue = CssPropertyValue<StyleListStylePosition>;
455pub type StringSetValue = CssPropertyValue<StringSet>;
456
457#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
458pub struct CssKeyMap {
459    // Contains all keys that have no shorthand
460    pub non_shorthands: BTreeMap<&'static str, CssPropertyType>,
461    // Contains all keys that act as a shorthand for other types
462    pub shorthands: BTreeMap<&'static str, CombinedCssPropertyType>,
463}
464
465impl CssKeyMap {
466    pub fn get() -> Self {
467        get_css_key_map()
468    }
469}
470
471/// Returns a map useful for parsing the keys of CSS stylesheets
472pub fn get_css_key_map() -> CssKeyMap {
473    CssKeyMap {
474        non_shorthands: CSS_PROPERTY_KEY_MAP.iter().map(|(v, k)| (*k, *v)).collect(),
475        shorthands: COMBINED_CSS_PROPERTIES_KEY_MAP
476            .iter()
477            .map(|(v, k)| (*k, *v))
478            .collect(),
479    }
480}
481
482#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
483#[repr(C)]
484pub enum CombinedCssPropertyType {
485    BorderRadius,
486    Overflow,
487    Margin,
488    Border,
489    BorderLeft,
490    BorderRight,
491    BorderTop,
492    BorderBottom,
493    BorderColor,
494    BorderStyle,
495    BorderWidth,
496    Padding,
497    BoxShadow,
498    BackgroundColor, // BackgroundContent::Color
499    BackgroundImage, // BackgroundContent::Image
500    Background,
501    Flex,
502    Grid,
503    Gap,
504    GridGap,
505    Font,
506    Columns,
507    ColumnRule,
508    GridArea,
509    TextBox,
510    /// `inset-block` shorthand: sets `inset-block-start` + `inset-block-end`
511    /// (maps to `top` + `bottom` in horizontal-tb writing mode)
512    InsetBlock,
513    /// `inset-inline` shorthand: sets `inset-inline-start` + `inset-inline-end`
514    /// (maps to `left` + `right` in horizontal-tb writing mode)
515    InsetInline,
516}
517
518impl fmt::Display for CombinedCssPropertyType {
519    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
520        let key = COMBINED_CSS_PROPERTIES_KEY_MAP
521            .iter()
522            .find(|(v, _)| *v == *self).map(|(k, _)| k)
523            .unwrap();
524        write!(f, "{}", key)
525    }
526}
527
528impl CombinedCssPropertyType {
529    /// Parses a CSS key, such as `width` from a string:
530    ///
531    /// # Example
532    ///
533    /// ```rust
534    /// # use azul_css::props::property::{CombinedCssPropertyType, get_css_key_map};
535    /// let map = get_css_key_map();
536    /// assert_eq!(
537    ///     Some(CombinedCssPropertyType::Border),
538    ///     CombinedCssPropertyType::from_str("border", &map)
539    /// );
540    /// ```
541    pub fn from_str(input: &str, map: &CssKeyMap) -> Option<Self> {
542        let input = input.trim();
543        map.shorthands.get(input).copied()
544    }
545
546    /// Returns the original string that was used to construct this `CssPropertyType`.
547    pub fn to_str(&self, map: &CssKeyMap) -> &'static str {
548        map.shorthands
549            .iter()
550            .find(|(_, v)| *v == self)
551            .map(|(k, _)| k)
552            .unwrap()
553    }
554}
555
556/// Represents one parsed CSS key-value pair, such as `"width: 20px"` =>
557/// `CssProperty::Width(LayoutWidth::px(20.0))`
558#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
559#[repr(C, u8)]
560pub enum CssProperty {
561    CaretColor(CaretColorValue),
562    CaretAnimationDuration(CaretAnimationDurationValue),
563    CaretWidth(CaretWidthValue),
564    SelectionBackgroundColor(SelectionBackgroundColorValue),
565    SelectionColor(SelectionColorValue),
566    SelectionRadius(SelectionRadiusValue),
567    TextColor(StyleTextColorValue),
568    FontSize(StyleFontSizeValue),
569    FontFamily(StyleFontFamilyVecValue),
570    FontWeight(StyleFontWeightValue),
571    FontStyle(StyleFontStyleValue),
572    TextAlign(StyleTextAlignValue),
573    TextJustify(LayoutTextJustifyValue),
574    VerticalAlign(StyleVerticalAlignValue),
575    LetterSpacing(StyleLetterSpacingValue),
576    TextIndent(StyleTextIndentValue),
577    InitialLetter(StyleInitialLetterValue),
578    LineClamp(StyleLineClampValue),
579    HangingPunctuation(StyleHangingPunctuationValue),
580    TextCombineUpright(StyleTextCombineUprightValue),
581    UnicodeBidi(StyleUnicodeBidiValue),
582    TextBoxTrim(StyleTextBoxTrimValue),
583    TextBoxEdge(StyleTextBoxEdgeValue),
584    DominantBaseline(StyleDominantBaselineValue),
585    AlignmentBaseline(StyleAlignmentBaselineValue),
586    InitialLetterAlign(StyleInitialLetterAlignValue),
587    InitialLetterWrap(StyleInitialLetterWrapValue),
588    ScrollbarGutter(StyleScrollbarGutterValue),
589    OverflowClipMargin(StyleOverflowClipMarginValue),
590    Clip(StyleClipRectValue),
591    ExclusionMargin(StyleExclusionMarginValue),
592    HyphenationLanguage(StyleHyphenationLanguageValue),
593    LineHeight(StyleLineHeightValue),
594    WordSpacing(StyleWordSpacingValue),
595    TabSize(StyleTabSizeValue),
596    WhiteSpace(StyleWhiteSpaceValue),
597    Hyphens(StyleHyphensValue),
598    WordBreak(StyleWordBreakValue),
599    OverflowWrap(StyleOverflowWrapValue),
600    LineBreak(StyleLineBreakValue),
601    ObjectFit(StyleObjectFitValue),
602    ObjectPosition(StyleObjectPositionValue),
603    AspectRatio(StyleAspectRatioValue),
604    TextOrientation(StyleTextOrientationValue),
605    TextAlignLast(StyleTextAlignLastValue),
606    Direction(StyleDirectionValue),
607    UserSelect(StyleUserSelectValue),
608    TextDecoration(StyleTextDecorationValue),
609    Cursor(StyleCursorValue),
610    Display(LayoutDisplayValue),
611    Float(LayoutFloatValue),
612    BoxSizing(LayoutBoxSizingValue),
613    Width(LayoutWidthValue),
614    Height(LayoutHeightValue),
615    MinWidth(LayoutMinWidthValue),
616    MinHeight(LayoutMinHeightValue),
617    MaxWidth(LayoutMaxWidthValue),
618    MaxHeight(LayoutMaxHeightValue),
619    Position(LayoutPositionValue),
620    Top(LayoutTopValue),
621    Right(LayoutRightValue),
622    Left(LayoutLeftValue),
623    Bottom(LayoutInsetBottomValue),
624    ZIndex(LayoutZIndexValue),
625    FlexWrap(LayoutFlexWrapValue),
626    FlexDirection(LayoutFlexDirectionValue),
627    FlexGrow(LayoutFlexGrowValue),
628    FlexShrink(LayoutFlexShrinkValue),
629    FlexBasis(LayoutFlexBasisValue),
630    JustifyContent(LayoutJustifyContentValue),
631    AlignItems(LayoutAlignItemsValue),
632    AlignContent(LayoutAlignContentValue),
633    ColumnGap(LayoutColumnGapValue),
634    RowGap(LayoutRowGapValue),
635    GridTemplateColumns(LayoutGridTemplateColumnsValue),
636    GridTemplateRows(LayoutGridTemplateRowsValue),
637    GridAutoColumns(LayoutGridAutoColumnsValue),
638    GridAutoRows(LayoutGridAutoRowsValue),
639    GridColumn(LayoutGridColumnValue),
640    GridRow(LayoutGridRowValue),
641    GridTemplateAreas(LayoutGridTemplateAreasValue),
642    WritingMode(LayoutWritingModeValue),
643    Clear(LayoutClearValue),
644    BackgroundContent(StyleBackgroundContentVecValue),
645    BackgroundPosition(StyleBackgroundPositionVecValue),
646    BackgroundSize(StyleBackgroundSizeVecValue),
647    BackgroundRepeat(StyleBackgroundRepeatVecValue),
648    OverflowX(LayoutOverflowValue),
649    OverflowY(LayoutOverflowValue),
650    OverflowBlock(LayoutOverflowValue),
651    OverflowInline(LayoutOverflowValue),
652    GridAutoFlow(LayoutGridAutoFlowValue),
653    JustifySelf(LayoutJustifySelfValue),
654    JustifyItems(LayoutJustifyItemsValue),
655    Gap(LayoutGapValue),
656    GridGap(LayoutGapValue),
657    AlignSelf(LayoutAlignSelfValue),
658    Font(StyleFontValue),
659    PaddingTop(LayoutPaddingTopValue),
660    PaddingLeft(LayoutPaddingLeftValue),
661    PaddingRight(LayoutPaddingRightValue),
662    PaddingBottom(LayoutPaddingBottomValue),
663    PaddingInlineStart(LayoutPaddingInlineStartValue),
664    PaddingInlineEnd(LayoutPaddingInlineEndValue),
665    MarginTop(LayoutMarginTopValue),
666    MarginLeft(LayoutMarginLeftValue),
667    MarginRight(LayoutMarginRightValue),
668    MarginBottom(LayoutMarginBottomValue),
669    BorderTopLeftRadius(StyleBorderTopLeftRadiusValue),
670    BorderTopRightRadius(StyleBorderTopRightRadiusValue),
671    BorderBottomLeftRadius(StyleBorderBottomLeftRadiusValue),
672    BorderBottomRightRadius(StyleBorderBottomRightRadiusValue),
673    BorderTopColor(StyleBorderTopColorValue),
674    BorderRightColor(StyleBorderRightColorValue),
675    BorderLeftColor(StyleBorderLeftColorValue),
676    BorderBottomColor(StyleBorderBottomColorValue),
677    BorderTopStyle(StyleBorderTopStyleValue),
678    BorderRightStyle(StyleBorderRightStyleValue),
679    BorderLeftStyle(StyleBorderLeftStyleValue),
680    BorderBottomStyle(StyleBorderBottomStyleValue),
681    BorderTopWidth(LayoutBorderTopWidthValue),
682    BorderRightWidth(LayoutBorderRightWidthValue),
683    BorderLeftWidth(LayoutBorderLeftWidthValue),
684    BorderBottomWidth(LayoutBorderBottomWidthValue),
685    BoxShadowLeft(StyleBoxShadowValue),
686    BoxShadowRight(StyleBoxShadowValue),
687    BoxShadowTop(StyleBoxShadowValue),
688    BoxShadowBottom(StyleBoxShadowValue),
689    ScrollbarTrack(StyleBackgroundContentValue),
690    ScrollbarThumb(StyleBackgroundContentValue),
691    ScrollbarButton(StyleBackgroundContentValue),
692    ScrollbarCorner(StyleBackgroundContentValue),
693    ScrollbarResizer(StyleBackgroundContentValue),
694    ScrollbarWidth(LayoutScrollbarWidthValue),
695    ScrollbarColor(StyleScrollbarColorValue),
696    ScrollbarVisibility(ScrollbarVisibilityModeValue),
697    ScrollbarFadeDelay(ScrollbarFadeDelayValue),
698    ScrollbarFadeDuration(ScrollbarFadeDurationValue),
699    Opacity(StyleOpacityValue),
700    Visibility(StyleVisibilityValue),
701    Transform(StyleTransformVecValue),
702    TransformOrigin(StyleTransformOriginValue),
703    PerspectiveOrigin(StylePerspectiveOriginValue),
704    BackfaceVisibility(StyleBackfaceVisibilityValue),
705    MixBlendMode(StyleMixBlendModeValue),
706    Filter(StyleFilterVecValue),
707    BackdropFilter(StyleFilterVecValue),
708    TextShadow(StyleBoxShadowValue),
709    BreakBefore(PageBreakValue),
710    BreakAfter(PageBreakValue),
711    BreakInside(BreakInsideValue),
712    Orphans(OrphansValue),
713    Widows(WidowsValue),
714    BoxDecorationBreak(BoxDecorationBreakValue),
715    ColumnCount(ColumnCountValue),
716    ColumnWidth(ColumnWidthValue),
717    ColumnSpan(ColumnSpanValue),
718    ColumnFill(ColumnFillValue),
719    ColumnRuleWidth(ColumnRuleWidthValue),
720    ColumnRuleStyle(ColumnRuleStyleValue),
721    ColumnRuleColor(ColumnRuleColorValue),
722    FlowInto(FlowIntoValue),
723    FlowFrom(FlowFromValue),
724    ShapeOutside(ShapeOutsideValue),
725    ShapeInside(ShapeInsideValue),
726    ClipPath(ClipPathValue),
727    ShapeMargin(ShapeMarginValue),
728    ShapeImageThreshold(ShapeImageThresholdValue),
729    TableLayout(LayoutTableLayoutValue),
730    BorderCollapse(StyleBorderCollapseValue),
731    BorderSpacing(LayoutBorderSpacingValue),
732    CaptionSide(StyleCaptionSideValue),
733    EmptyCells(StyleEmptyCellsValue),
734    Content(ContentValue),
735    CounterReset(CounterResetValue),
736    CounterIncrement(CounterIncrementValue),
737    ListStyleType(StyleListStyleTypeValue),
738    ListStylePosition(StyleListStylePositionValue),
739    StringSet(StringSetValue),
740}
741
742impl_option!(
743    CssProperty,
744    OptionCssProperty,
745    copy = false,
746    [Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord]
747);
748
749crate::impl_vec!(CssProperty, CssPropertyVec, CssPropertyVecDestructor, CssPropertyVecDestructorType, CssPropertyVecSlice, OptionCssProperty);
750crate::impl_vec_clone!(CssProperty, CssPropertyVec, CssPropertyVecDestructor);
751crate::impl_vec_debug!(CssProperty, CssPropertyVec);
752crate::impl_vec_partialeq!(CssProperty, CssPropertyVec);
753crate::impl_vec_eq!(CssProperty, CssPropertyVec);
754crate::impl_vec_partialord!(CssProperty, CssPropertyVec);
755crate::impl_vec_ord!(CssProperty, CssPropertyVec);
756crate::impl_vec_hash!(CssProperty, CssPropertyVec);
757
758/// Categorizes a CSS property by its effect on the layout pipeline.
759#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
760pub enum CssPropertyCategory {
761    GpuOnly,
762    /// Affects geometry (width, height, margin, padding, font-size, etc.)
763    Layout,
764    /// Affects only appearance (color, background-color, etc.)
765    Paint,
766    /// A layout-affecting property that also requires children to be re-evaluated.
767    InheritedLayout,
768    /// A paint-affecting property that also requires children to be re-evaluated.
769    InheritedPaint,
770}
771
772/// Fine-grained dirty classification for CSS property changes.
773///
774/// Inspired by Taffy's binary dirty flag but extended to 4 levels for CSS-specific
775/// optimizations. Instead of "clean vs dirty", we classify property changes by their
776/// actual layout impact, enabling the engine to skip unnecessary work.
777///
778/// Reference: Taffy (https://github.com/DioxusLabs/taffy) uses a binary dirty flag
779/// (clean/dirty). Our improvement: 4-level classification enables IFC-only reflow,
780/// sizing-only recomputation, and paint-only updates without full subtree relayout.
781#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
782#[repr(C)]
783#[derive(Default)]
784pub enum RelayoutScope {
785    /// No relayout needed — repaint only (e.g., color, background, opacity, transform).
786    /// The node's size and position are unchanged.
787    #[default]
788    None,
789    /// Only the IFC (Inline Formatting Context) containing this node needs re-shaping.
790    /// Block-level siblings are unaffected unless the IFC height changes,
791    /// in which case this auto-upgrades to SizingOnly.
792    IfcOnly,
793    /// This node's sizing needs recomputation. Parent may need repositioning
794    /// of subsequent siblings but doesn't need full recursive relayout.
795    SizingOnly,
796    /// Full subtree relayout required (e.g., display, position, float change).
797    Full,
798}
799
800
801/// Represents a CSS key (for example `"border-radius"` => `BorderRadius`).
802/// You can also derive this key from a `CssProperty` by calling `CssProperty::get_type()`.
803#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
804#[repr(C)]
805pub enum CssPropertyType {
806    CaretColor,
807    CaretAnimationDuration,
808    CaretWidth,
809    SelectionBackgroundColor,
810    SelectionColor,
811    SelectionRadius,
812    TextColor,
813    FontSize,
814    FontFamily,
815    FontWeight,
816    FontStyle,
817    TextAlign,
818    TextJustify,
819    VerticalAlign,
820    LetterSpacing,
821    TextIndent,
822    InitialLetter,
823    LineClamp,
824    HangingPunctuation,
825    TextCombineUpright,
826    UnicodeBidi,
827    TextBoxTrim,
828    TextBoxEdge,
829    DominantBaseline,
830    AlignmentBaseline,
831    InitialLetterAlign,
832    InitialLetterWrap,
833    ScrollbarGutter,
834    OverflowClipMargin,
835    Clip,
836    ExclusionMargin,
837    HyphenationLanguage,
838    LineHeight,
839    WordSpacing,
840    TabSize,
841    WhiteSpace,
842    Hyphens,
843    WordBreak,
844    OverflowWrap,
845    LineBreak,
846    ObjectFit,
847    ObjectPosition,
848    AspectRatio,
849    TextOrientation,
850    TextAlignLast,
851    Direction,
852    UserSelect,
853    TextDecoration,
854    Cursor,
855    Display,
856    Float,
857    BoxSizing,
858    Width,
859    Height,
860    MinWidth,
861    MinHeight,
862    MaxWidth,
863    MaxHeight,
864    Position,
865    Top,
866    Right,
867    Left,
868    Bottom,
869    ZIndex,
870    FlexWrap,
871    FlexDirection,
872    FlexGrow,
873    FlexShrink,
874    FlexBasis,
875    JustifyContent,
876    AlignItems,
877    AlignContent,
878    ColumnGap,
879    RowGap,
880    GridTemplateColumns,
881    GridTemplateRows,
882    GridAutoColumns,
883    GridAutoRows,
884    GridColumn,
885    GridRow,
886    GridTemplateAreas,
887    GridAutoFlow,
888    JustifySelf,
889    JustifyItems,
890    Gap,
891    GridGap,
892    AlignSelf,
893    Font,
894    WritingMode,
895    Clear,
896    BackgroundContent,
897    BackgroundPosition,
898    BackgroundSize,
899    BackgroundRepeat,
900    OverflowX,
901    OverflowY,
902    OverflowBlock,
903    OverflowInline,
904    PaddingTop,
905    PaddingLeft,
906    PaddingRight,
907    PaddingBottom,
908    PaddingInlineStart,
909    PaddingInlineEnd,
910    MarginTop,
911    MarginLeft,
912    MarginRight,
913    MarginBottom,
914    BorderTopLeftRadius,
915    BorderTopRightRadius,
916    BorderBottomLeftRadius,
917    BorderBottomRightRadius,
918    BorderTopColor,
919    BorderRightColor,
920    BorderLeftColor,
921    BorderBottomColor,
922    BorderTopStyle,
923    BorderRightStyle,
924    BorderLeftStyle,
925    BorderBottomStyle,
926    BorderTopWidth,
927    BorderRightWidth,
928    BorderLeftWidth,
929    BorderBottomWidth,
930    BoxShadowLeft,
931    BoxShadowRight,
932    BoxShadowTop,
933    BoxShadowBottom,
934    ScrollbarTrack,
935    ScrollbarThumb,
936    ScrollbarButton,
937    ScrollbarCorner,
938    ScrollbarResizer,
939    ScrollbarWidth,
940    ScrollbarColor,
941    ScrollbarVisibility,
942    ScrollbarFadeDelay,
943    ScrollbarFadeDuration,
944    Opacity,
945    Visibility,
946    Transform,
947    TransformOrigin,
948    PerspectiveOrigin,
949    BackfaceVisibility,
950    MixBlendMode,
951    Filter,
952    BackdropFilter,
953    TextShadow,
954    BreakBefore,
955    BreakAfter,
956    BreakInside,
957    Orphans,
958    Widows,
959    BoxDecorationBreak,
960    ColumnCount,
961    ColumnWidth,
962    ColumnSpan,
963    ColumnFill,
964    ColumnRuleWidth,
965    ColumnRuleStyle,
966    ColumnRuleColor,
967    FlowInto,
968    FlowFrom,
969    ShapeOutside,
970    ShapeInside,
971    ClipPath,
972    ShapeMargin,
973    ShapeImageThreshold,
974    TableLayout,
975    BorderCollapse,
976    BorderSpacing,
977    CaptionSide,
978    EmptyCells,
979    Content,
980    CounterReset,
981    CounterIncrement,
982    ListStyleType,
983    ListStylePosition,
984    StringSet,
985}
986
987impl CssPropertyType {
988    /// All CSS property types, in declaration order.
989    ///
990    /// Use this instead of strum's EnumIter — ensures a compile error
991    /// if a variant is added to the enum but not to this array.
992    pub const ALL: &[CssPropertyType] = &[
993        CssPropertyType::CaretColor,
994        CssPropertyType::CaretAnimationDuration,
995        CssPropertyType::CaretWidth,
996        CssPropertyType::SelectionBackgroundColor,
997        CssPropertyType::SelectionColor,
998        CssPropertyType::SelectionRadius,
999        CssPropertyType::TextColor,
1000        CssPropertyType::FontSize,
1001        CssPropertyType::FontFamily,
1002        CssPropertyType::FontWeight,
1003        CssPropertyType::FontStyle,
1004        CssPropertyType::TextAlign,
1005        CssPropertyType::TextJustify,
1006        CssPropertyType::VerticalAlign,
1007        CssPropertyType::LetterSpacing,
1008        CssPropertyType::TextIndent,
1009        CssPropertyType::InitialLetter,
1010        CssPropertyType::LineClamp,
1011        CssPropertyType::HangingPunctuation,
1012        CssPropertyType::TextCombineUpright,
1013        CssPropertyType::UnicodeBidi,
1014        CssPropertyType::TextBoxTrim,
1015        CssPropertyType::TextBoxEdge,
1016        CssPropertyType::DominantBaseline,
1017        CssPropertyType::AlignmentBaseline,
1018        CssPropertyType::InitialLetterAlign,
1019        CssPropertyType::InitialLetterWrap,
1020        CssPropertyType::ScrollbarGutter,
1021        CssPropertyType::OverflowClipMargin,
1022        CssPropertyType::Clip,
1023        CssPropertyType::ExclusionMargin,
1024        CssPropertyType::HyphenationLanguage,
1025        CssPropertyType::LineHeight,
1026        CssPropertyType::WordSpacing,
1027        CssPropertyType::TabSize,
1028        CssPropertyType::WhiteSpace,
1029        CssPropertyType::Hyphens,
1030        CssPropertyType::WordBreak,
1031        CssPropertyType::OverflowWrap,
1032        CssPropertyType::LineBreak,
1033        CssPropertyType::ObjectFit,
1034        CssPropertyType::ObjectPosition,
1035        CssPropertyType::AspectRatio,
1036        CssPropertyType::TextOrientation,
1037        CssPropertyType::TextAlignLast,
1038        CssPropertyType::Direction,
1039        CssPropertyType::UserSelect,
1040        CssPropertyType::TextDecoration,
1041        CssPropertyType::Cursor,
1042        CssPropertyType::Display,
1043        CssPropertyType::Float,
1044        CssPropertyType::BoxSizing,
1045        CssPropertyType::Width,
1046        CssPropertyType::Height,
1047        CssPropertyType::MinWidth,
1048        CssPropertyType::MinHeight,
1049        CssPropertyType::MaxWidth,
1050        CssPropertyType::MaxHeight,
1051        CssPropertyType::Position,
1052        CssPropertyType::Top,
1053        CssPropertyType::Right,
1054        CssPropertyType::Left,
1055        CssPropertyType::Bottom,
1056        CssPropertyType::ZIndex,
1057        CssPropertyType::FlexWrap,
1058        CssPropertyType::FlexDirection,
1059        CssPropertyType::FlexGrow,
1060        CssPropertyType::FlexShrink,
1061        CssPropertyType::FlexBasis,
1062        CssPropertyType::JustifyContent,
1063        CssPropertyType::AlignItems,
1064        CssPropertyType::AlignContent,
1065        CssPropertyType::ColumnGap,
1066        CssPropertyType::RowGap,
1067        CssPropertyType::GridTemplateColumns,
1068        CssPropertyType::GridTemplateRows,
1069        CssPropertyType::GridAutoColumns,
1070        CssPropertyType::GridAutoRows,
1071        CssPropertyType::GridColumn,
1072        CssPropertyType::GridRow,
1073        CssPropertyType::GridTemplateAreas,
1074        CssPropertyType::GridAutoFlow,
1075        CssPropertyType::JustifySelf,
1076        CssPropertyType::JustifyItems,
1077        CssPropertyType::Gap,
1078        CssPropertyType::GridGap,
1079        CssPropertyType::AlignSelf,
1080        CssPropertyType::Font,
1081        CssPropertyType::WritingMode,
1082        CssPropertyType::Clear,
1083        CssPropertyType::BackgroundContent,
1084        CssPropertyType::BackgroundPosition,
1085        CssPropertyType::BackgroundSize,
1086        CssPropertyType::BackgroundRepeat,
1087        CssPropertyType::OverflowX,
1088        CssPropertyType::OverflowY,
1089        CssPropertyType::OverflowBlock,
1090        CssPropertyType::OverflowInline,
1091        CssPropertyType::PaddingTop,
1092        CssPropertyType::PaddingLeft,
1093        CssPropertyType::PaddingRight,
1094        CssPropertyType::PaddingBottom,
1095        CssPropertyType::PaddingInlineStart,
1096        CssPropertyType::PaddingInlineEnd,
1097        CssPropertyType::MarginTop,
1098        CssPropertyType::MarginLeft,
1099        CssPropertyType::MarginRight,
1100        CssPropertyType::MarginBottom,
1101        CssPropertyType::BorderTopLeftRadius,
1102        CssPropertyType::BorderTopRightRadius,
1103        CssPropertyType::BorderBottomLeftRadius,
1104        CssPropertyType::BorderBottomRightRadius,
1105        CssPropertyType::BorderTopColor,
1106        CssPropertyType::BorderRightColor,
1107        CssPropertyType::BorderLeftColor,
1108        CssPropertyType::BorderBottomColor,
1109        CssPropertyType::BorderTopStyle,
1110        CssPropertyType::BorderRightStyle,
1111        CssPropertyType::BorderLeftStyle,
1112        CssPropertyType::BorderBottomStyle,
1113        CssPropertyType::BorderTopWidth,
1114        CssPropertyType::BorderRightWidth,
1115        CssPropertyType::BorderLeftWidth,
1116        CssPropertyType::BorderBottomWidth,
1117        CssPropertyType::BoxShadowLeft,
1118        CssPropertyType::BoxShadowRight,
1119        CssPropertyType::BoxShadowTop,
1120        CssPropertyType::BoxShadowBottom,
1121        CssPropertyType::ScrollbarTrack,
1122        CssPropertyType::ScrollbarThumb,
1123        CssPropertyType::ScrollbarButton,
1124        CssPropertyType::ScrollbarCorner,
1125        CssPropertyType::ScrollbarResizer,
1126        CssPropertyType::ScrollbarWidth,
1127        CssPropertyType::ScrollbarColor,
1128        CssPropertyType::ScrollbarVisibility,
1129        CssPropertyType::ScrollbarFadeDelay,
1130        CssPropertyType::ScrollbarFadeDuration,
1131        CssPropertyType::Opacity,
1132        CssPropertyType::Visibility,
1133        CssPropertyType::Transform,
1134        CssPropertyType::TransformOrigin,
1135        CssPropertyType::PerspectiveOrigin,
1136        CssPropertyType::BackfaceVisibility,
1137        CssPropertyType::MixBlendMode,
1138        CssPropertyType::Filter,
1139        CssPropertyType::BackdropFilter,
1140        CssPropertyType::TextShadow,
1141        CssPropertyType::BreakBefore,
1142        CssPropertyType::BreakAfter,
1143        CssPropertyType::BreakInside,
1144        CssPropertyType::Orphans,
1145        CssPropertyType::Widows,
1146        CssPropertyType::BoxDecorationBreak,
1147        CssPropertyType::ColumnCount,
1148        CssPropertyType::ColumnWidth,
1149        CssPropertyType::ColumnSpan,
1150        CssPropertyType::ColumnFill,
1151        CssPropertyType::ColumnRuleWidth,
1152        CssPropertyType::ColumnRuleStyle,
1153        CssPropertyType::ColumnRuleColor,
1154        CssPropertyType::FlowInto,
1155        CssPropertyType::FlowFrom,
1156        CssPropertyType::ShapeOutside,
1157        CssPropertyType::ShapeInside,
1158        CssPropertyType::ClipPath,
1159        CssPropertyType::ShapeMargin,
1160        CssPropertyType::ShapeImageThreshold,
1161        CssPropertyType::TableLayout,
1162        CssPropertyType::BorderCollapse,
1163        CssPropertyType::BorderSpacing,
1164        CssPropertyType::CaptionSide,
1165        CssPropertyType::EmptyCells,
1166        CssPropertyType::Content,
1167        CssPropertyType::CounterReset,
1168        CssPropertyType::CounterIncrement,
1169        CssPropertyType::ListStyleType,
1170        CssPropertyType::ListStylePosition,
1171        CssPropertyType::StringSet,
1172    ];
1173
1174    /// Returns an iterator over all CSS property types.
1175    pub fn iter() -> impl Iterator<Item = CssPropertyType> {
1176        Self::ALL.iter().copied()
1177    }
1178}
1179
1180
1181impl fmt::Debug for CssPropertyType {
1182    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1183        write!(f, "{}", self.to_str())
1184    }
1185}
1186
1187impl fmt::Display for CssPropertyType {
1188    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1189        write!(f, "{}", self.to_str())
1190    }
1191}
1192
1193impl CssPropertyType {
1194    /// Parses a CSS key, such as `width` from a string:
1195    ///
1196    /// # Example
1197    ///
1198    /// ```rust
1199    /// # use azul_css::props::property::{CssPropertyType, get_css_key_map};
1200    /// let map = get_css_key_map();
1201    /// assert_eq!(
1202    ///     Some(CssPropertyType::Width),
1203    ///     CssPropertyType::from_str("width", &map)
1204    /// );
1205    /// assert_eq!(
1206    ///     Some(CssPropertyType::JustifyContent),
1207    ///     CssPropertyType::from_str("justify-content", &map)
1208    /// );
1209    /// assert_eq!(None, CssPropertyType::from_str("asdfasdfasdf", &map));
1210    /// ```
1211    pub fn from_str(input: &str, map: &CssKeyMap) -> Option<Self> {
1212        let input = input.trim();
1213        map.non_shorthands.get(input).copied()
1214    }
1215
1216    /// Returns the original string that was used to construct this `CssPropertyType`.
1217    pub fn to_str(&self) -> &'static str {
1218        match self {
1219            CssPropertyType::CaretColor => "caret-color",
1220            CssPropertyType::CaretAnimationDuration => "caret-animation-duration",
1221            CssPropertyType::CaretWidth => "-azul-caret-width",
1222            CssPropertyType::SelectionBackgroundColor => "-azul-selection-background-color",
1223            CssPropertyType::SelectionColor => "-azul-selection-color",
1224            CssPropertyType::SelectionRadius => "-azul-selection-radius",
1225            CssPropertyType::TextColor => "color",
1226            CssPropertyType::FontSize => "font-size",
1227            CssPropertyType::FontFamily => "font-family",
1228            CssPropertyType::FontWeight => "font-weight",
1229            CssPropertyType::FontStyle => "font-style",
1230            CssPropertyType::TextAlign => "text-align",
1231            CssPropertyType::TextJustify => "text-justify",
1232            CssPropertyType::VerticalAlign => "vertical-align",
1233            CssPropertyType::LetterSpacing => "letter-spacing",
1234            CssPropertyType::TextIndent => "text-indent",
1235            CssPropertyType::InitialLetter => "initial-letter",
1236            CssPropertyType::LineClamp => "line-clamp",
1237            CssPropertyType::HangingPunctuation => "hanging-punctuation",
1238            CssPropertyType::TextCombineUpright => "text-combine-upright",
1239            CssPropertyType::UnicodeBidi => "unicode-bidi",
1240            CssPropertyType::TextBoxTrim => "text-box-trim",
1241            CssPropertyType::TextBoxEdge => "text-box-edge",
1242            CssPropertyType::DominantBaseline => "dominant-baseline",
1243            CssPropertyType::AlignmentBaseline => "alignment-baseline",
1244            CssPropertyType::InitialLetterAlign => "initial-letter-align",
1245            CssPropertyType::InitialLetterWrap => "initial-letter-wrap",
1246            CssPropertyType::ScrollbarGutter => "scrollbar-gutter",
1247            CssPropertyType::OverflowClipMargin => "overflow-clip-margin",
1248            CssPropertyType::Clip => "clip",
1249            CssPropertyType::ExclusionMargin => "-azul-exclusion-margin",
1250            CssPropertyType::HyphenationLanguage => "-azul-hyphenation-language",
1251            CssPropertyType::LineHeight => "line-height",
1252            CssPropertyType::WordSpacing => "word-spacing",
1253            CssPropertyType::TabSize => "tab-size",
1254            CssPropertyType::Cursor => "cursor",
1255            CssPropertyType::Display => "display",
1256            CssPropertyType::Float => "float",
1257            CssPropertyType::BoxSizing => "box-sizing",
1258            CssPropertyType::Width => "width",
1259            CssPropertyType::Height => "height",
1260            CssPropertyType::MinWidth => "min-width",
1261            CssPropertyType::MinHeight => "min-height",
1262            CssPropertyType::MaxWidth => "max-width",
1263            CssPropertyType::MaxHeight => "max-height",
1264            CssPropertyType::Position => "position",
1265            CssPropertyType::Top => "top",
1266            CssPropertyType::Right => "right",
1267            CssPropertyType::Left => "left",
1268            CssPropertyType::Bottom => "bottom",
1269            CssPropertyType::ZIndex => "z-index",
1270            CssPropertyType::FlexWrap => "flex-wrap",
1271            CssPropertyType::FlexDirection => "flex-direction",
1272            CssPropertyType::FlexGrow => "flex-grow",
1273            CssPropertyType::FlexShrink => "flex-shrink",
1274            CssPropertyType::FlexBasis => "flex-basis",
1275            CssPropertyType::JustifyContent => "justify-content",
1276            CssPropertyType::AlignItems => "align-items",
1277            CssPropertyType::AlignContent => "align-content",
1278            CssPropertyType::ColumnGap => "column-gap",
1279            CssPropertyType::RowGap => "row-gap",
1280            CssPropertyType::GridTemplateColumns => "grid-template-columns",
1281            CssPropertyType::GridTemplateRows => "grid-template-rows",
1282            CssPropertyType::GridAutoFlow => "grid-auto-flow",
1283            CssPropertyType::JustifySelf => "justify-self",
1284            CssPropertyType::JustifyItems => "justify-items",
1285            CssPropertyType::Gap => "gap",
1286            CssPropertyType::GridGap => "grid-gap",
1287            CssPropertyType::AlignSelf => "align-self",
1288            CssPropertyType::Font => "font",
1289            CssPropertyType::GridAutoColumns => "grid-auto-columns",
1290            CssPropertyType::GridAutoRows => "grid-auto-rows",
1291            CssPropertyType::GridColumn => "grid-column",
1292            CssPropertyType::GridRow => "grid-row",
1293            CssPropertyType::GridTemplateAreas => "grid-template-areas",
1294            CssPropertyType::WritingMode => "writing-mode",
1295            CssPropertyType::Clear => "clear",
1296            CssPropertyType::BackgroundContent => "background",
1297            CssPropertyType::BackgroundPosition => "background-position",
1298            CssPropertyType::BackgroundSize => "background-size",
1299            CssPropertyType::BackgroundRepeat => "background-repeat",
1300            CssPropertyType::OverflowX => "overflow-x",
1301            CssPropertyType::OverflowY => "overflow-y",
1302            CssPropertyType::OverflowBlock => "overflow-block",
1303            CssPropertyType::OverflowInline => "overflow-inline",
1304            CssPropertyType::PaddingTop => "padding-top",
1305            CssPropertyType::PaddingLeft => "padding-left",
1306            CssPropertyType::PaddingRight => "padding-right",
1307            CssPropertyType::PaddingBottom => "padding-bottom",
1308            CssPropertyType::PaddingInlineStart => "padding-inline-start",
1309            CssPropertyType::PaddingInlineEnd => "padding-inline-end",
1310            CssPropertyType::MarginTop => "margin-top",
1311            CssPropertyType::MarginLeft => "margin-left",
1312            CssPropertyType::MarginRight => "margin-right",
1313            CssPropertyType::MarginBottom => "margin-bottom",
1314            CssPropertyType::BorderTopLeftRadius => "border-top-left-radius",
1315            CssPropertyType::BorderTopRightRadius => "border-top-right-radius",
1316            CssPropertyType::BorderBottomLeftRadius => "border-bottom-left-radius",
1317            CssPropertyType::BorderBottomRightRadius => "border-bottom-right-radius",
1318            CssPropertyType::BorderTopColor => "border-top-color",
1319            CssPropertyType::BorderRightColor => "border-right-color",
1320            CssPropertyType::BorderLeftColor => "border-left-color",
1321            CssPropertyType::BorderBottomColor => "border-bottom-color",
1322            CssPropertyType::BorderTopStyle => "border-top-style",
1323            CssPropertyType::BorderRightStyle => "border-right-style",
1324            CssPropertyType::BorderLeftStyle => "border-left-style",
1325            CssPropertyType::BorderBottomStyle => "border-bottom-style",
1326            CssPropertyType::BorderTopWidth => "border-top-width",
1327            CssPropertyType::BorderRightWidth => "border-right-width",
1328            CssPropertyType::BorderLeftWidth => "border-left-width",
1329            CssPropertyType::BorderBottomWidth => "border-bottom-width",
1330            CssPropertyType::BoxShadowLeft => "-azul-box-shadow-left",
1331            CssPropertyType::BoxShadowRight => "-azul-box-shadow-right",
1332            CssPropertyType::BoxShadowTop => "-azul-box-shadow-top",
1333            CssPropertyType::BoxShadowBottom => "-azul-box-shadow-bottom",
1334            CssPropertyType::ScrollbarTrack => "-azul-scrollbar-track",
1335            CssPropertyType::ScrollbarThumb => "-azul-scrollbar-thumb",
1336            CssPropertyType::ScrollbarButton => "-azul-scrollbar-button",
1337            CssPropertyType::ScrollbarCorner => "-azul-scrollbar-corner",
1338            CssPropertyType::ScrollbarResizer => "-azul-scrollbar-resizer",
1339            CssPropertyType::ScrollbarWidth => "scrollbar-width",
1340            CssPropertyType::ScrollbarColor => "scrollbar-color",
1341            CssPropertyType::ScrollbarVisibility => "-azul-scrollbar-visibility",
1342            CssPropertyType::ScrollbarFadeDelay => "-azul-scrollbar-fade-delay",
1343            CssPropertyType::ScrollbarFadeDuration => "-azul-scrollbar-fade-duration",
1344            CssPropertyType::Opacity => "opacity",
1345            CssPropertyType::Visibility => "visibility",
1346            CssPropertyType::Transform => "transform",
1347            CssPropertyType::TransformOrigin => "transform-origin",
1348            CssPropertyType::PerspectiveOrigin => "perspective-origin",
1349            CssPropertyType::BackfaceVisibility => "backface-visibility",
1350            CssPropertyType::MixBlendMode => "mix-blend-mode",
1351            CssPropertyType::Filter => "filter",
1352            CssPropertyType::BackdropFilter => "backdrop-filter",
1353            CssPropertyType::TextShadow => "text-shadow",
1354            CssPropertyType::WhiteSpace => "white-space",
1355            CssPropertyType::Hyphens => "hyphens",
1356            CssPropertyType::WordBreak => "word-break",
1357            CssPropertyType::OverflowWrap => "overflow-wrap",
1358            CssPropertyType::LineBreak => "line-break",
1359            CssPropertyType::ObjectFit => "object-fit",
1360            CssPropertyType::ObjectPosition => "object-position",
1361            CssPropertyType::AspectRatio => "aspect-ratio",
1362            CssPropertyType::TextOrientation => "text-orientation",
1363            CssPropertyType::TextAlignLast => "text-align-last",
1364            CssPropertyType::Direction => "direction",
1365            CssPropertyType::UserSelect => "user-select",
1366            CssPropertyType::TextDecoration => "text-decoration",
1367            CssPropertyType::BreakBefore => "break-before",
1368            CssPropertyType::BreakAfter => "break-after",
1369            CssPropertyType::BreakInside => "break-inside",
1370            CssPropertyType::Orphans => "orphans",
1371            CssPropertyType::Widows => "widows",
1372            CssPropertyType::BoxDecorationBreak => "box-decoration-break",
1373            CssPropertyType::ColumnCount => "column-count",
1374            CssPropertyType::ColumnWidth => "column-width",
1375            CssPropertyType::ColumnSpan => "column-span",
1376            CssPropertyType::ColumnFill => "column-fill",
1377            CssPropertyType::ColumnRuleWidth => "column-rule-width",
1378            CssPropertyType::ColumnRuleStyle => "column-rule-style",
1379            CssPropertyType::ColumnRuleColor => "column-rule-color",
1380            CssPropertyType::FlowInto => "flow-into",
1381            CssPropertyType::FlowFrom => "flow-from",
1382            CssPropertyType::ShapeOutside => "shape-outside",
1383            CssPropertyType::ShapeInside => "shape-inside",
1384            CssPropertyType::ClipPath => "clip-path",
1385            CssPropertyType::ShapeMargin => "shape-margin",
1386            CssPropertyType::ShapeImageThreshold => "shape-image-threshold",
1387            CssPropertyType::TableLayout => "table-layout",
1388            CssPropertyType::BorderCollapse => "border-collapse",
1389            CssPropertyType::BorderSpacing => "border-spacing",
1390            CssPropertyType::CaptionSide => "caption-side",
1391            CssPropertyType::EmptyCells => "empty-cells",
1392            CssPropertyType::Content => "content",
1393            CssPropertyType::CounterReset => "counter-reset",
1394            CssPropertyType::CounterIncrement => "counter-increment",
1395            CssPropertyType::ListStyleType => "list-style-type",
1396            CssPropertyType::ListStylePosition => "list-style-position",
1397            CssPropertyType::StringSet => "string-set",
1398        }
1399    }
1400
1401    /// Returns whether this property will be inherited during cascading
1402    /// Returns whether this CSS property is inherited by default according to CSS specifications.
1403    ///
1404    /// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascade/Inheritance
1405    // +spec:display-property:b4cf6d - unicode-bidi does not inherit (removed from inheritable set)
1406    pub fn is_inheritable(&self) -> bool {
1407        use self::CssPropertyType::*;
1408        match self {
1409            // Font properties
1410            FontFamily | FontSize | FontWeight | FontStyle | LineHeight | LetterSpacing | WordSpacing | TextIndent |
1411
1412            // Text properties
1413            TextColor | TextAlign | TextJustify | TextDecoration | WhiteSpace | Direction | Hyphens | TabSize |
1414            WordBreak | OverflowWrap | LineBreak | TextAlignLast |
1415            TextOrientation |
1416            HangingPunctuation | TextCombineUpright | HyphenationLanguage |
1417
1418            // List properties
1419            ListStyleType | ListStylePosition |
1420
1421            // Table properties
1422            BorderCollapse | BorderSpacing | CaptionSide | EmptyCells |
1423
1424            // Other inherited properties
1425            // NOTE: Cursor is inheritable per CSS spec (https://developer.mozilla.org/en-US/docs/Web/CSS/cursor)
1426            // This means a Button with cursor:pointer will pass that to child Text nodes.
1427            // This is correct behavior - if you want text inside a button to show I-beam,
1428            // the Text node needs an explicit cursor:text style that overrides the inherited value.
1429            Visibility | Cursor | Widows | Orphans |
1430
1431            // Writing mode
1432            WritingMode |
1433
1434            // User interaction
1435            UserSelect
1436            => true,
1437
1438            _ => false,
1439        }
1440    }
1441
1442    pub fn has_compact_encoding(&self) -> bool {
1443        use self::CssPropertyType::*;
1444        matches!(self,
1445            // Tier 1 enums
1446            Display | Position | Float | OverflowX | OverflowY | BoxSizing |
1447            FlexDirection | FlexWrap | JustifyContent | AlignItems | AlignContent |
1448            WritingMode | Clear | FontWeight | FontStyle | TextAlign |
1449            Visibility | WhiteSpace | Direction | VerticalAlign | BorderCollapse |
1450            // Tier 2 dims
1451            Width | Height | MinWidth | MaxWidth | MinHeight | MaxHeight |
1452            FlexBasis | FontSize |
1453            PaddingTop | PaddingRight | PaddingBottom | PaddingLeft |
1454            MarginTop | MarginRight | MarginBottom | MarginLeft |
1455            BorderTopWidth | BorderRightWidth | BorderBottomWidth | BorderLeftWidth |
1456            Top | Right | Bottom | Left |
1457            FlexGrow | FlexShrink |
1458            // Tier 2 cold
1459            ZIndex |
1460            BorderTopStyle | BorderRightStyle | BorderBottomStyle | BorderLeftStyle |
1461            BorderTopColor | BorderRightColor | BorderBottomColor | BorderLeftColor |
1462            BorderSpacing | TabSize |
1463            // Tier 2b text
1464            TextColor | FontFamily | LineHeight | LetterSpacing | WordSpacing | TextIndent |
1465            // Grid/flex alignment (tier1 extension)
1466            AlignSelf | JustifySelf | GridAutoFlow | JustifyItems |
1467            // Gap (tier2 extension)
1468            ColumnGap | RowGap | Gap |
1469            // Grid placement (tier2_cold extension)
1470            GridColumn | GridRow
1471        )
1472    }
1473
1474    pub fn get_category(&self) -> CssPropertyCategory {
1475        if self.is_gpu_only_property() {
1476            CssPropertyCategory::GpuOnly
1477        } else {
1478            let is_inheritable = self.is_inheritable();
1479            let can_trigger_layout = self.can_trigger_relayout();
1480            match (is_inheritable, can_trigger_layout) {
1481                (true, true) => CssPropertyCategory::InheritedLayout,
1482                (true, false) => CssPropertyCategory::InheritedPaint,
1483                (false, true) => CssPropertyCategory::Layout,
1484                (false, false) => CssPropertyCategory::Paint,
1485            }
1486        }
1487    }
1488
1489    /// Returns whether this property can trigger a re-layout (important for incremental layout and
1490    /// caching layouted DOMs).
1491    pub fn can_trigger_relayout(&self) -> bool {
1492        use self::CssPropertyType::*;
1493
1494        // Since the border can be larger than the content,
1495        // in which case the content needs to be re-layouted, assume true for Border
1496
1497        // FontFamily, FontSize, LetterSpacing and LineHeight can affect
1498        // the text layout and therefore the screen layout
1499
1500        match self {
1501            TextColor
1502            | Cursor
1503            | BackgroundContent
1504            | BackgroundPosition
1505            | BackgroundSize
1506            | BackgroundRepeat
1507            | BorderTopLeftRadius
1508            | BorderTopRightRadius
1509            | BorderBottomLeftRadius
1510            | BorderBottomRightRadius
1511            | BorderTopColor
1512            | BorderRightColor
1513            | BorderLeftColor
1514            | BorderBottomColor
1515            | BorderTopStyle
1516            | BorderRightStyle
1517            | BorderLeftStyle
1518            | BorderBottomStyle
1519            | ColumnRuleColor
1520            | ColumnRuleStyle
1521            | BoxShadowLeft
1522            | BoxShadowRight
1523            | BoxShadowTop
1524            | BoxShadowBottom
1525            | BoxDecorationBreak
1526            | ScrollbarTrack
1527            | ScrollbarThumb
1528            | ScrollbarButton
1529            | ScrollbarCorner
1530            | ScrollbarResizer
1531            | Opacity
1532            | Transform
1533            | TransformOrigin
1534            | PerspectiveOrigin
1535            | BackfaceVisibility
1536            | MixBlendMode
1537            | Filter
1538            | BackdropFilter
1539            | TextShadow
1540            | Clip => false,
1541            _ => true,
1542        }
1543    }
1544
1545    /// Returns whether the property is a GPU property (currently only opacity and transforms)
1546    pub fn is_gpu_only_property(&self) -> bool {
1547        match self {
1548            CssPropertyType::Opacity |
1549            CssPropertyType::Transform /* | CssPropertyType::Color */ => true,
1550            _ => false
1551        }
1552    }
1553
1554    /// Context-dependent relayout scope for a CSS property change.
1555    ///
1556    /// This is a more granular replacement for `can_trigger_relayout()`.
1557    /// Instead of returning a flat bool, it classifies the property change
1558    /// into one of four impact levels (see `RelayoutScope`).
1559    ///
1560    /// Inspired by Taffy's binary dirty flag, extended with CSS-specific
1561    /// knowledge: font/text changes only affect IFC, sizing changes don't
1562    /// require full subtree relayout, and paint-only changes skip layout entirely.
1563    ///
1564    /// `node_is_ifc_member`: whether this node participates in an IFC
1565    /// (has inline formatting context membership). When true, font/text
1566    /// property changes trigger IFC-only relayout instead of being ignored.
1567    pub fn relayout_scope(&self, node_is_ifc_member: bool) -> RelayoutScope {
1568        use CssPropertyType::*;
1569        match self {
1570            // Pure paint — never triggers relayout
1571            TextColor | Cursor | BackgroundContent | BackgroundPosition
1572            | BackgroundSize | BackgroundRepeat | BorderTopColor | BorderRightColor
1573            | BorderLeftColor | BorderBottomColor | BorderTopStyle | BorderRightStyle
1574            | BorderLeftStyle | BorderBottomStyle | BorderTopLeftRadius
1575            | BorderTopRightRadius | BorderBottomLeftRadius | BorderBottomRightRadius
1576            | ColumnRuleColor | ColumnRuleStyle | BoxShadowLeft | BoxShadowRight
1577            | BoxShadowTop | BoxShadowBottom | BoxDecorationBreak
1578            | ScrollbarTrack | ScrollbarThumb | ScrollbarButton
1579            | ScrollbarCorner | ScrollbarResizer
1580            | Opacity | Transform | TransformOrigin | PerspectiveOrigin
1581            | BackfaceVisibility | MixBlendMode | Filter | BackdropFilter
1582            | TextShadow | SelectionBackgroundColor | SelectionColor
1583            | SelectionRadius | CaretColor | CaretAnimationDuration
1584            | CaretWidth | ObjectFit | ObjectPosition | Clip => RelayoutScope::None,
1585
1586            // Font/text properties — IFC-only if inside inline context,
1587            // otherwise no layout impact (block with only block children
1588            // inherits but doesn't directly reflow).
1589            FontFamily | FontSize | FontWeight | FontStyle
1590            | LetterSpacing | WordSpacing | LineHeight | TextAlign | TextJustify
1591            | TextIndent | WhiteSpace | TabSize | Hyphens
1592            | WordBreak | OverflowWrap | LineBreak | TextAlignLast | TextOrientation
1593            | HyphenationLanguage | TextCombineUpright | TextDecoration
1594            | HangingPunctuation | InitialLetter | LineClamp
1595            | Direction | VerticalAlign | UnicodeBidi
1596            | TextBoxTrim | TextBoxEdge | DominantBaseline | AlignmentBaseline
1597            | InitialLetterAlign | InitialLetterWrap => {
1598                if node_is_ifc_member {
1599                    RelayoutScope::IfcOnly
1600                } else {
1601                    // Block container with only block children: font properties
1602                    // are inherited but don't affect this node's own sizing.
1603                    // Children pick up the change via inheritance and get their
1604                    // own dirty flags.
1605                    RelayoutScope::None
1606                }
1607            }
1608
1609            // Sizing properties — only this node's size changes.
1610            // Parent may reposition subsequent siblings but doesn't need
1611            // full recursive relayout of unaffected subtrees.
1612            Width | Height | MinWidth | MinHeight | MaxWidth | MaxHeight
1613            | PaddingTop | PaddingRight | PaddingBottom | PaddingLeft
1614            | PaddingInlineStart | PaddingInlineEnd
1615            | BorderTopWidth | BorderRightWidth | BorderBottomWidth
1616            | BorderLeftWidth | BoxSizing
1617            | ScrollbarWidth | ScrollbarVisibility
1618            | ScrollbarGutter | OverflowClipMargin => RelayoutScope::SizingOnly,
1619
1620            // Everything else: display, position, float, margin, flex-*,
1621            // grid-*, overflow, writing-mode, etc. — full relayout.
1622            _ => RelayoutScope::Full,
1623        }
1624    }
1625}
1626
1627// -- PARSING --
1628
1629/// Master error type that aggregates all possible CSS parsing errors.
1630#[derive(Clone, PartialEq)]
1631pub enum CssParsingError<'a> {
1632    // Shorthand properties
1633    Border(CssBorderParseError<'a>),
1634    BorderRadius(CssBorderRadiusParseError<'a>),
1635    Padding(LayoutPaddingParseError<'a>),
1636    Margin(LayoutMarginParseError<'a>),
1637    Overflow(InvalidValueErr<'a>),
1638    BoxShadow(CssShadowParseError<'a>),
1639
1640    // Individual properties
1641    Color(CssColorParseError<'a>),
1642    PixelValue(CssPixelValueParseError<'a>),
1643    Percentage(PercentageParseError),
1644    FontFamily(CssStyleFontFamilyParseError<'a>),
1645    InvalidValue(InvalidValueErr<'a>),
1646    FlexGrow(FlexGrowParseError<'a>),
1647    FlexShrink(FlexShrinkParseError<'a>),
1648    Background(CssBackgroundParseError<'a>),
1649    BackgroundPosition(CssBackgroundPositionParseError<'a>),
1650    Opacity(OpacityParseError<'a>),
1651    Visibility(StyleVisibilityParseError<'a>),
1652    LayoutScrollbarWidth(LayoutScrollbarWidthParseError<'a>),
1653    StyleScrollbarColor(StyleScrollbarColorParseError<'a>),
1654    ScrollbarVisibilityMode(ScrollbarVisibilityModeParseError<'a>),
1655    ScrollbarFadeDelay(ScrollbarFadeDelayParseError<'a>),
1656    ScrollbarFadeDuration(ScrollbarFadeDurationParseError<'a>),
1657    Transform(CssStyleTransformParseError<'a>),
1658    TransformOrigin(CssStyleTransformOriginParseError<'a>),
1659    PerspectiveOrigin(CssStylePerspectiveOriginParseError<'a>),
1660    Filter(CssStyleFilterParseError<'a>),
1661
1662    // Text/Style properties
1663    TextColor(StyleTextColorParseError<'a>),
1664    FontSize(CssStyleFontSizeParseError<'a>),
1665    FontWeight(CssFontWeightParseError<'a>),
1666    FontStyle(CssFontStyleParseError<'a>),
1667    TextAlign(StyleTextAlignParseError<'a>),
1668    TextJustify(TextJustifyParseError<'a>),
1669    VerticalAlign(StyleVerticalAlignParseError<'a>),
1670    LetterSpacing(StyleLetterSpacingParseError<'a>),
1671    TextIndent(StyleTextIndentParseError<'a>),
1672    InitialLetter(StyleInitialLetterParseError<'a>),
1673    LineClamp(StyleLineClampParseError<'a>),
1674    HangingPunctuation(StyleHangingPunctuationParseError<'a>),
1675    TextCombineUpright(StyleTextCombineUprightParseError<'a>),
1676    UnicodeBidi(StyleUnicodeBidiParseError<'a>),
1677    TextBoxTrim(StyleTextBoxTrimParseError<'a>),
1678    TextBoxEdge(StyleTextBoxEdgeParseError<'a>),
1679    DominantBaseline(StyleDominantBaselineParseError<'a>),
1680    AlignmentBaseline(StyleAlignmentBaselineParseError<'a>),
1681    InitialLetterAlign(StyleInitialLetterAlignParseError<'a>),
1682    InitialLetterWrap(StyleInitialLetterWrapParseError<'a>),
1683    ScrollbarGutter(StyleScrollbarGutterParseError<'a>),
1684    OverflowClipMargin(StyleOverflowClipMarginParseError<'a>),
1685    Clip(StyleClipRectParseError<'a>),
1686    ExclusionMargin(StyleExclusionMarginParseError),
1687    HyphenationLanguage(StyleHyphenationLanguageParseError),
1688    LineHeight(StyleLineHeightParseError),
1689    WordSpacing(StyleWordSpacingParseError<'a>),
1690    TabSize(StyleTabSizeParseError<'a>),
1691    WhiteSpace(StyleWhiteSpaceParseError<'a>),
1692    Hyphens(StyleHyphensParseError<'a>),
1693    WordBreak(StyleWordBreakParseError<'a>),
1694    OverflowWrap(StyleOverflowWrapParseError<'a>),
1695    LineBreak(StyleLineBreakParseError<'a>),
1696    ObjectFit(StyleObjectFitParseError<'a>),
1697    ObjectPosition(StyleObjectPositionParseError<'a>),
1698    AspectRatio(StyleAspectRatioParseError<'a>),
1699    TextOrientation(StyleTextOrientationParseError<'a>),
1700    TextAlignLast(StyleTextAlignLastParseError<'a>),
1701    Direction(StyleDirectionParseError<'a>),
1702    UserSelect(StyleUserSelectParseError<'a>),
1703    TextDecoration(StyleTextDecorationParseError<'a>),
1704    Cursor(CursorParseError<'a>),
1705    CaretColor(CssColorParseError<'a>),
1706    CaretAnimationDuration(DurationParseError<'a>),
1707    CaretWidth(CssPixelValueParseError<'a>),
1708    SelectionBackgroundColor(CssColorParseError<'a>),
1709    SelectionColor(CssColorParseError<'a>),
1710    SelectionRadius(CssPixelValueParseError<'a>),
1711
1712    // Layout basic properties
1713    LayoutDisplay(LayoutDisplayParseError<'a>),
1714    LayoutFloat(LayoutFloatParseError<'a>),
1715    LayoutBoxSizing(LayoutBoxSizingParseError<'a>),
1716
1717    // Layout dimensions
1718    LayoutWidth(LayoutWidthParseError<'a>),
1719    LayoutHeight(LayoutHeightParseError<'a>),
1720    LayoutMinWidth(LayoutMinWidthParseError<'a>),
1721    LayoutMinHeight(LayoutMinHeightParseError<'a>),
1722    LayoutMaxWidth(LayoutMaxWidthParseError<'a>),
1723    LayoutMaxHeight(LayoutMaxHeightParseError<'a>),
1724
1725    // Layout position
1726    LayoutPosition(LayoutPositionParseError<'a>),
1727    LayoutTop(LayoutTopParseError<'a>),
1728    LayoutRight(LayoutRightParseError<'a>),
1729    LayoutLeft(LayoutLeftParseError<'a>),
1730    LayoutInsetBottom(LayoutInsetBottomParseError<'a>),
1731    LayoutZIndex(LayoutZIndexParseError<'a>),
1732
1733    // Layout flex
1734    FlexWrap(FlexWrapParseError<'a>),
1735    FlexDirection(FlexDirectionParseError<'a>),
1736    FlexBasis(FlexBasisParseError<'a>),
1737    JustifyContent(JustifyContentParseError<'a>),
1738    AlignItems(AlignItemsParseError<'a>),
1739    AlignContent(AlignContentParseError<'a>),
1740
1741    // Layout grid
1742    Grid(GridParseError<'a>),
1743    GridAutoFlow(GridAutoFlowParseError<'a>),
1744    JustifySelf(JustifySelfParseError<'a>),
1745    JustifyItems(JustifyItemsParseError<'a>),
1746    AlignSelf(AlignSelfParseError<'a>),
1747
1748    // Layout wrapping
1749    LayoutWritingMode(LayoutWritingModeParseError<'a>),
1750    LayoutClear(LayoutClearParseError<'a>),
1751
1752    // Layout overflow
1753    LayoutOverflow(LayoutOverflowParseError<'a>),
1754
1755    // Border radius individual corners
1756    BorderTopLeftRadius(StyleBorderTopLeftRadiusParseError<'a>),
1757    BorderTopRightRadius(StyleBorderTopRightRadiusParseError<'a>),
1758    BorderBottomLeftRadius(StyleBorderBottomLeftRadiusParseError<'a>),
1759    BorderBottomRightRadius(StyleBorderBottomRightRadiusParseError<'a>),
1760
1761    // Border style
1762    BorderStyle(CssBorderStyleParseError<'a>),
1763
1764    // Effects
1765    BackfaceVisibility(CssBackfaceVisibilityParseError<'a>),
1766    MixBlendMode(MixBlendModeParseError<'a>),
1767
1768    // Fragmentation
1769    PageBreak(PageBreakParseError<'a>),
1770    BreakInside(BreakInsideParseError<'a>),
1771    Widows(WidowsParseError<'a>),
1772    Orphans(OrphansParseError<'a>),
1773    BoxDecorationBreak(BoxDecorationBreakParseError<'a>),
1774
1775    // Columns
1776    ColumnCount(ColumnCountParseError<'a>),
1777    ColumnWidth(ColumnWidthParseError<'a>),
1778    ColumnSpan(ColumnSpanParseError<'a>),
1779    ColumnFill(ColumnFillParseError<'a>),
1780    ColumnRuleWidth(ColumnRuleWidthParseError<'a>),
1781    ColumnRuleStyle(ColumnRuleStyleParseError<'a>),
1782    ColumnRuleColor(ColumnRuleColorParseError<'a>),
1783
1784    // Flow & Shape
1785    FlowInto(FlowIntoParseError<'a>),
1786    FlowFrom(FlowFromParseError<'a>),
1787    GenericParseError,
1788
1789    // Content
1790    Content, // Simplified errors for now
1791    Counter,
1792    ListStyleType(StyleListStyleTypeParseError<'a>),
1793    ListStylePosition(StyleListStylePositionParseError<'a>),
1794    StringSet,
1795}
1796
1797/// Owned version of `CssParsingError`.
1798#[derive(Debug, Clone, PartialEq)]
1799#[repr(C, u8)]
1800pub enum CssParsingErrorOwned {
1801    // Shorthand properties
1802    Border(CssBorderParseErrorOwned),
1803    BorderRadius(CssStyleBorderRadiusParseErrorOwned),
1804    Padding(LayoutPaddingParseErrorOwned),
1805    Margin(LayoutMarginParseErrorOwned),
1806    Overflow(InvalidValueErrOwned),
1807    BoxShadow(CssShadowParseErrorOwned),
1808
1809    // Individual properties
1810    Color(CssColorParseErrorOwned),
1811    PixelValue(CssPixelValueParseErrorOwned),
1812    Percentage(PercentageParseError),
1813    FontFamily(CssStyleFontFamilyParseErrorOwned),
1814    InvalidValue(InvalidValueErrOwned),
1815    FlexGrow(FlexGrowParseErrorOwned),
1816    FlexShrink(FlexShrinkParseErrorOwned),
1817    Background(CssBackgroundParseErrorOwned),
1818    BackgroundPosition(CssBackgroundPositionParseErrorOwned),
1819    Opacity(OpacityParseErrorOwned),
1820    Visibility(StyleVisibilityParseErrorOwned),
1821    LayoutScrollbarWidth(LayoutScrollbarWidthParseErrorOwned),
1822    StyleScrollbarColor(StyleScrollbarColorParseErrorOwned),
1823    ScrollbarVisibilityMode(ScrollbarVisibilityModeParseErrorOwned),
1824    ScrollbarFadeDelay(ScrollbarFadeDelayParseErrorOwned),
1825    ScrollbarFadeDuration(ScrollbarFadeDurationParseErrorOwned),
1826    Transform(CssStyleTransformParseErrorOwned),
1827    TransformOrigin(CssStyleTransformOriginParseErrorOwned),
1828    PerspectiveOrigin(CssStylePerspectiveOriginParseErrorOwned),
1829    Filter(CssStyleFilterParseErrorOwned),
1830
1831    // Text/Style properties
1832    TextColor(StyleTextColorParseErrorOwned),
1833    FontSize(CssStyleFontSizeParseErrorOwned),
1834    FontWeight(CssFontWeightParseErrorOwned),
1835    FontStyle(CssFontStyleParseErrorOwned),
1836    TextAlign(StyleTextAlignParseErrorOwned),
1837    TextJustify(TextJustifyParseErrorOwned),
1838    VerticalAlign(StyleVerticalAlignParseErrorOwned),
1839    LetterSpacing(StyleLetterSpacingParseErrorOwned),
1840    TextIndent(StyleTextIndentParseErrorOwned),
1841    InitialLetter(StyleInitialLetterParseErrorOwned),
1842    LineClamp(StyleLineClampParseErrorOwned),
1843    HangingPunctuation(StyleHangingPunctuationParseErrorOwned),
1844    TextCombineUpright(StyleTextCombineUprightParseErrorOwned),
1845    UnicodeBidi(StyleUnicodeBidiParseErrorOwned),
1846    TextBoxTrim(StyleTextBoxTrimParseErrorOwned),
1847    TextBoxEdge(StyleTextBoxEdgeParseErrorOwned),
1848    DominantBaseline(StyleDominantBaselineParseErrorOwned),
1849    AlignmentBaseline(StyleAlignmentBaselineParseErrorOwned),
1850    InitialLetterAlign(StyleInitialLetterAlignParseErrorOwned),
1851    InitialLetterWrap(StyleInitialLetterWrapParseErrorOwned),
1852    ScrollbarGutter(StyleScrollbarGutterParseErrorOwned),
1853    OverflowClipMargin(StyleOverflowClipMarginParseErrorOwned),
1854    Clip(StyleClipRectParseErrorOwned),
1855    ExclusionMargin(StyleExclusionMarginParseErrorOwned),
1856    HyphenationLanguage(StyleHyphenationLanguageParseErrorOwned),
1857    LineHeight(StyleLineHeightParseError),
1858    WordSpacing(StyleWordSpacingParseErrorOwned),
1859    TabSize(StyleTabSizeParseErrorOwned),
1860    WhiteSpace(StyleWhiteSpaceParseErrorOwned),
1861    Hyphens(StyleHyphensParseErrorOwned),
1862    WordBreak(StyleWordBreakParseErrorOwned),
1863    OverflowWrap(StyleOverflowWrapParseErrorOwned),
1864    LineBreak(StyleLineBreakParseErrorOwned),
1865    ObjectFit(StyleObjectFitParseErrorOwned),
1866    ObjectPosition(StyleObjectPositionParseErrorOwned),
1867    AspectRatio(StyleAspectRatioParseErrorOwned),
1868    TextOrientation(StyleTextOrientationParseErrorOwned),
1869    TextAlignLast(StyleTextAlignLastParseErrorOwned),
1870    Direction(StyleDirectionParseErrorOwned),
1871    UserSelect(StyleUserSelectParseErrorOwned),
1872    TextDecoration(StyleTextDecorationParseErrorOwned),
1873    Cursor(CursorParseErrorOwned),
1874    CaretColor(CssColorParseErrorOwned),
1875    CaretAnimationDuration(DurationParseErrorOwned),
1876    CaretWidth(CssPixelValueParseErrorOwned),
1877    SelectionBackgroundColor(CssColorParseErrorOwned),
1878    SelectionColor(CssColorParseErrorOwned),
1879    SelectionRadius(CssPixelValueParseErrorOwned),
1880
1881    // Layout basic properties
1882    LayoutDisplay(LayoutDisplayParseErrorOwned),
1883    LayoutFloat(LayoutFloatParseErrorOwned),
1884    LayoutBoxSizing(LayoutBoxSizingParseErrorOwned),
1885
1886    // Layout dimensions
1887    LayoutWidth(LayoutWidthParseErrorOwned),
1888    LayoutHeight(LayoutHeightParseErrorOwned),
1889    LayoutMinWidth(LayoutMinWidthParseErrorOwned),
1890    LayoutMinHeight(LayoutMinHeightParseErrorOwned),
1891    LayoutMaxWidth(LayoutMaxWidthParseErrorOwned),
1892    LayoutMaxHeight(LayoutMaxHeightParseErrorOwned),
1893
1894    // Layout position
1895    LayoutPosition(LayoutPositionParseErrorOwned),
1896    LayoutTop(LayoutTopParseErrorOwned),
1897    LayoutRight(LayoutRightParseErrorOwned),
1898    LayoutLeft(LayoutLeftParseErrorOwned),
1899    LayoutInsetBottom(LayoutInsetBottomParseErrorOwned),
1900    LayoutZIndex(LayoutZIndexParseErrorOwned),
1901
1902    // Layout flex
1903    FlexWrap(FlexWrapParseErrorOwned),
1904    FlexDirection(FlexDirectionParseErrorOwned),
1905    FlexBasis(FlexBasisParseErrorOwned),
1906    JustifyContent(JustifyContentParseErrorOwned),
1907    AlignItems(AlignItemsParseErrorOwned),
1908    AlignContent(AlignContentParseErrorOwned),
1909
1910    // Layout grid
1911    Grid(GridParseErrorOwned),
1912    GridAutoFlow(GridAutoFlowParseErrorOwned),
1913    JustifySelf(JustifySelfParseErrorOwned),
1914    JustifyItems(JustifyItemsParseErrorOwned),
1915    AlignSelf(AlignSelfParseErrorOwned),
1916
1917    // Layout wrapping
1918    LayoutWritingMode(LayoutWritingModeParseErrorOwned),
1919    LayoutClear(LayoutClearParseErrorOwned),
1920
1921    // Layout overflow
1922    LayoutOverflow(LayoutOverflowParseErrorOwned),
1923
1924    // Border radius individual corners
1925    BorderTopLeftRadius(StyleBorderTopLeftRadiusParseErrorOwned),
1926    BorderTopRightRadius(StyleBorderTopRightRadiusParseErrorOwned),
1927    BorderBottomLeftRadius(StyleBorderBottomLeftRadiusParseErrorOwned),
1928    BorderBottomRightRadius(StyleBorderBottomRightRadiusParseErrorOwned),
1929
1930    // Border style
1931    BorderStyle(CssBorderStyleParseErrorOwned),
1932
1933    // Effects
1934    BackfaceVisibility(CssBackfaceVisibilityParseErrorOwned),
1935    MixBlendMode(MixBlendModeParseErrorOwned),
1936
1937    // Fragmentation
1938    PageBreak(PageBreakParseErrorOwned),
1939    BreakInside(BreakInsideParseErrorOwned),
1940    Widows(WidowsParseErrorOwned),
1941    Orphans(OrphansParseErrorOwned),
1942    BoxDecorationBreak(BoxDecorationBreakParseErrorOwned),
1943
1944    // Columns
1945    ColumnCount(ColumnCountParseErrorOwned),
1946    ColumnWidth(ColumnWidthParseErrorOwned),
1947    ColumnSpan(ColumnSpanParseErrorOwned),
1948    ColumnFill(ColumnFillParseErrorOwned),
1949    ColumnRuleWidth(ColumnRuleWidthParseErrorOwned),
1950    ColumnRuleStyle(ColumnRuleStyleParseErrorOwned),
1951    ColumnRuleColor(ColumnRuleColorParseErrorOwned),
1952
1953    // Flow & Shape
1954    FlowInto(FlowIntoParseErrorOwned),
1955    FlowFrom(FlowFromParseErrorOwned),
1956    GenericParseError,
1957
1958    // Content
1959    Content,
1960    Counter,
1961    ListStyleType(StyleListStyleTypeParseErrorOwned),
1962    ListStylePosition(StyleListStylePositionParseErrorOwned),
1963    StringSet,
1964}
1965
1966// -- PARSING ERROR IMPLEMENTATIONS --
1967
1968impl_debug_as_display!(CssParsingError<'a>);
1969impl_display! { CssParsingError<'a>, {
1970    CaretColor(e) => format!("Invalid caret-color: {}", e),
1971    CaretAnimationDuration(e) => format!("Invalid caret-animation-duration: {}", e),
1972    CaretWidth(e) => format!("Invalid -azul-caret-width: {}", e),
1973    SelectionBackgroundColor(e) => format!("Invalid -azul-selection-background-color: {}", e),
1974    SelectionColor(e) => format!("Invalid -azul-selection-color: {}", e),
1975    SelectionRadius(e) => format!("Invalid -azul-selection-radius: {}", e),
1976    Border(e) => format!("Invalid border property: {}", e),
1977    BorderRadius(e) => format!("Invalid border-radius: {}", e),
1978    Padding(e) => format!("Invalid padding property: {}", e),
1979    Margin(e) => format!("Invalid margin property: {}", e),
1980    Overflow(e) => format!("Invalid overflow property: \"{}\"", e.0),
1981    BoxShadow(e) => format!("Invalid shadow property: {}", e),
1982    Color(e) => format!("Invalid color value: {}", e),
1983    PixelValue(e) => format!("Invalid pixel value: {}", e),
1984    Percentage(e) => format!("Invalid percentage value: {}", e),
1985    FontFamily(e) => format!("Invalid font-family value: {}", e),
1986    InvalidValue(e) => format!("Invalid value: \"{}\"", e.0),
1987    FlexGrow(e) => format!("Invalid flex-grow value: {}", e),
1988    FlexShrink(e) => format!("Invalid flex-shrink value: {}", e),
1989    Background(e) => format!("Invalid background property: {}", e),
1990    BackgroundPosition(e) => format!("Invalid background-position: {}", e),
1991    Opacity(e) => format!("Invalid opacity value: {}", e),
1992    Visibility(e) => format!("Invalid visibility value: {}", e),
1993    LayoutScrollbarWidth(e) => format!("Invalid scrollbar-width: {}", e),
1994    StyleScrollbarColor(e) => format!("Invalid scrollbar-color: {}", e),
1995    ScrollbarVisibilityMode(e) => format!("Invalid scrollbar-visibility: {}", e),
1996    ScrollbarFadeDelay(e) => format!("Invalid scrollbar-fade-delay: {}", e),
1997    ScrollbarFadeDuration(e) => format!("Invalid scrollbar-fade-duration: {}", e),
1998    Transform(e) => format!("Invalid transform property: {}", e),
1999    TransformOrigin(e) => format!("Invalid transform-origin: {}", e),
2000    PerspectiveOrigin(e) => format!("Invalid perspective-origin: {}", e),
2001    Filter(e) => format!("Invalid filter property: {}", e),
2002    LayoutWidth(e) => format!("Invalid width value: {}", e),
2003    LayoutHeight(e) => format!("Invalid height value: {}", e),
2004    LayoutMinWidth(e) => format!("Invalid min-width value: {}", e),
2005    LayoutMinHeight(e) => format!("Invalid min-height value: {}", e),
2006    LayoutMaxWidth(e) => format!("Invalid max-width value: {}", e),
2007    LayoutMaxHeight(e) => format!("Invalid max-height value: {}", e),
2008    LayoutPosition(e) => format!("Invalid position value: {}", e),
2009    LayoutTop(e) => format!("Invalid top value: {}", e),
2010    LayoutRight(e) => format!("Invalid right value: {}", e),
2011    LayoutLeft(e) => format!("Invalid left value: {}", e),
2012    LayoutInsetBottom(e) => format!("Invalid bottom value: {}", e),
2013    LayoutZIndex(e) => format!("Invalid z-index value: {}", e),
2014    FlexWrap(e) => format!("Invalid flex-wrap value: {}", e),
2015    FlexDirection(e) => format!("Invalid flex-direction value: {}", e),
2016    FlexBasis(e) => format!("Invalid flex-basis value: {}", e),
2017    JustifyContent(e) => format!("Invalid justify-content value: {}", e),
2018    AlignItems(e) => format!("Invalid align-items value: {}", e),
2019    AlignContent(e) => format!("Invalid align-content value: {}", e),
2020    GridAutoFlow(e) => format!("Invalid grid-auto-flow value: {}", e),
2021    JustifySelf(e) => format!("Invalid justify-self value: {}", e),
2022    JustifyItems(e) => format!("Invalid justify-items value: {}", e),
2023    AlignSelf(e) => format!("Invalid align-self value: {}", e),
2024    Grid(e) => format!("Invalid grid value: {}", e),
2025    LayoutWritingMode(e) => format!("Invalid writing-mode value: {}", e),
2026    LayoutClear(e) => format!("Invalid clear value: {}", e),
2027    LayoutOverflow(e) => format!("Invalid overflow value: {}", e),
2028    BorderTopLeftRadius(e) => format!("Invalid border-top-left-radius: {}", e),
2029    BorderTopRightRadius(e) => format!("Invalid border-top-right-radius: {}", e),
2030    BorderBottomLeftRadius(e) => format!("Invalid border-bottom-left-radius: {}", e),
2031    BorderBottomRightRadius(e) => format!("Invalid border-bottom-right-radius: {}", e),
2032    BorderStyle(e) => format!("Invalid border style: {}", e),
2033    BackfaceVisibility(e) => format!("Invalid backface-visibility: {}", e),
2034    MixBlendMode(e) => format!("Invalid mix-blend-mode: {}", e),
2035    TextColor(e) => format!("Invalid text color: {}", e),
2036    FontSize(e) => format!("Invalid font-size: {}", e),
2037    FontWeight(e) => format!("Invalid font-weight: {}", e),
2038    FontStyle(e) => format!("Invalid font-style: {}", e),
2039    TextAlign(e) => format!("Invalid text-align: {}", e),
2040    TextJustify(e) => format!("Invalid text-justify: {}", e),
2041    VerticalAlign(e) => format!("Invalid vertical-align: {}", e),
2042    LetterSpacing(e) => format!("Invalid letter-spacing: {}", e),
2043    TextIndent(e) => format!("Invalid text-indent: {}", e),
2044    InitialLetter(e) => format!("Invalid initial-letter: {}", e),
2045    LineClamp(e) => format!("Invalid line-clamp: {}", e),
2046    HangingPunctuation(e) => format!("Invalid hanging-punctuation: {}", e),
2047    TextCombineUpright(e) => format!("Invalid text-combine-upright: {}", e),
2048    UnicodeBidi(e) => format!("Invalid unicode-bidi: {}", e),
2049    TextBoxTrim(e) => format!("Invalid text-box-trim: {}", e),
2050    TextBoxEdge(e) => format!("Invalid text-box-edge: {}", e),
2051    DominantBaseline(e) => format!("Invalid dominant-baseline: {}", e),
2052    AlignmentBaseline(e) => format!("Invalid alignment-baseline: {}", e),
2053    InitialLetterAlign(e) => format!("Invalid initial-letter-align: {}", e),
2054    InitialLetterWrap(e) => format!("Invalid initial-letter-wrap: {}", e),
2055    ScrollbarGutter(e) => format!("Invalid scrollbar-gutter: {}", e),
2056    OverflowClipMargin(e) => format!("Invalid overflow-clip-margin: {}", e),
2057    Clip(e) => format!("Invalid clip: {}", e),
2058    ExclusionMargin(e) => format!("Invalid -azul-exclusion-margin: {}", e),
2059    HyphenationLanguage(e) => format!("Invalid -azul-hyphenation-language: {}", e),
2060    LineHeight(e) => format!("Invalid line-height: {}", e),
2061    WordSpacing(e) => format!("Invalid word-spacing: {}", e),
2062    TabSize(e) => format!("Invalid tab-size: {}", e),
2063    WhiteSpace(e) => format!("Invalid white-space: {}", e),
2064    Hyphens(e) => format!("Invalid hyphens: {}", e),
2065    WordBreak(e) => format!("Invalid word-break: {}", e),
2066    OverflowWrap(e) => format!("Invalid overflow-wrap: {}", e),
2067    LineBreak(e) => format!("Invalid line-break: {}", e),
2068    ObjectFit(e) => format!("Invalid object-fit: {}", e),
2069    ObjectPosition(e) => format!("Invalid object-position: {}", e),
2070    AspectRatio(e) => format!("Invalid aspect-ratio: {}", e),
2071    TextOrientation(e) => format!("Invalid text-orientation: {}", e),
2072    TextAlignLast(e) => format!("Invalid text-align-last: {}", e),
2073    Direction(e) => format!("Invalid direction: {}", e),
2074    UserSelect(e) => format!("Invalid user-select: {}", e),
2075    TextDecoration(e) => format!("Invalid text-decoration: {}", e),
2076    Cursor(e) => format!("Invalid cursor: {}", e),
2077    LayoutDisplay(e) => format!("Invalid display: {}", e),
2078    LayoutFloat(e) => format!("Invalid float: {}", e),
2079    LayoutBoxSizing(e) => format!("Invalid box-sizing: {}", e),
2080    PageBreak(e) => format!("Invalid break property: {}", e),
2081    BreakInside(e) => format!("Invalid break-inside property: {}", e),
2082    Widows(e) => format!("Invalid widows property: {}", e),
2083    Orphans(e) => format!("Invalid orphans property: {}", e),
2084    BoxDecorationBreak(e) => format!("Invalid box-decoration-break property: {}", e),
2085    ColumnCount(e) => format!("Invalid column-count: {}", e),
2086    ColumnWidth(e) => format!("Invalid column-width: {}", e),
2087    ColumnSpan(e) => format!("Invalid column-span: {}", e),
2088    ColumnFill(e) => format!("Invalid column-fill: {}", e),
2089    ColumnRuleWidth(e) => format!("Invalid column-rule-width: {}", e),
2090    ColumnRuleStyle(e) => format!("Invalid column-rule-style: {}", e),
2091    ColumnRuleColor(e) => format!("Invalid column-rule-color: {}", e),
2092    FlowInto(e) => format!("Invalid flow-into: {}", e),
2093    FlowFrom(e) => format!("Invalid flow-from: {}", e),
2094    GenericParseError => "Failed to parse value",
2095    Content => "Failed to parse content property",
2096    Counter => "Failed to parse counter property",
2097    ListStyleType(e) => format!("Invalid list-style-type: {}", e),
2098    ListStylePosition(e) => format!("Invalid list-style-position: {}", e),
2099    StringSet => "Failed to parse string-set property",
2100}}
2101
2102// From impls for CssParsingError
2103impl_from!(
2104    DurationParseError<'a>,
2105    CssParsingError::CaretAnimationDuration
2106);
2107impl_from!(CssBorderParseError<'a>, CssParsingError::Border);
2108impl_from!(
2109    CssBorderRadiusParseError<'a>,
2110    CssParsingError::BorderRadius
2111);
2112impl_from!(LayoutPaddingParseError<'a>, CssParsingError::Padding);
2113impl_from!(LayoutMarginParseError<'a>, CssParsingError::Margin);
2114impl_from!(CssShadowParseError<'a>, CssParsingError::BoxShadow);
2115impl_from!(CssColorParseError<'a>, CssParsingError::Color);
2116impl_from!(CssPixelValueParseError<'a>, CssParsingError::PixelValue);
2117impl_from!(
2118    CssStyleFontFamilyParseError<'a>,
2119    CssParsingError::FontFamily
2120);
2121impl_from!(CssFontWeightParseError<'a>, CssParsingError::FontWeight);
2122impl_from!(CssFontStyleParseError<'a>, CssParsingError::FontStyle);
2123impl_from!(
2124    StyleInitialLetterParseError<'a>,
2125    CssParsingError::InitialLetter
2126);
2127impl_from!(StyleLineClampParseError<'a>, CssParsingError::LineClamp);
2128impl_from!(
2129    StyleHangingPunctuationParseError<'a>,
2130    CssParsingError::HangingPunctuation
2131);
2132impl_from!(
2133    StyleTextCombineUprightParseError<'a>,
2134    CssParsingError::TextCombineUpright
2135);
2136impl_from!(
2137    StyleUnicodeBidiParseError<'a>,
2138    CssParsingError::UnicodeBidi
2139);
2140impl_from!(
2141    StyleTextBoxTrimParseError<'a>,
2142    CssParsingError::TextBoxTrim
2143);
2144impl_from!(
2145    StyleTextBoxEdgeParseError<'a>,
2146    CssParsingError::TextBoxEdge
2147);
2148impl_from!(
2149    StyleDominantBaselineParseError<'a>,
2150    CssParsingError::DominantBaseline
2151);
2152impl_from!(
2153    StyleAlignmentBaselineParseError<'a>,
2154    CssParsingError::AlignmentBaseline
2155);
2156impl_from!(
2157    StyleInitialLetterAlignParseError<'a>,
2158    CssParsingError::InitialLetterAlign
2159);
2160impl_from!(
2161    StyleInitialLetterWrapParseError<'a>,
2162    CssParsingError::InitialLetterWrap
2163);
2164impl_from!(
2165    StyleScrollbarGutterParseError<'a>,
2166    CssParsingError::ScrollbarGutter
2167);
2168impl_from!(
2169    StyleOverflowClipMarginParseError<'a>,
2170    CssParsingError::OverflowClipMargin
2171);
2172impl_from!(
2173    StyleClipRectParseError<'a>,
2174    CssParsingError::Clip
2175);
2176
2177// Manual From implementation for StyleExclusionMarginParseError (no lifetime)
2178#[cfg(feature = "parser")]
2179impl<'a> From<StyleExclusionMarginParseError> for CssParsingError<'a> {
2180    fn from(e: StyleExclusionMarginParseError) -> Self {
2181        CssParsingError::ExclusionMargin(e)
2182    }
2183}
2184
2185// Manual From implementation for StyleHyphenationLanguageParseError (no lifetime)
2186#[cfg(feature = "parser")]
2187impl<'a> From<StyleHyphenationLanguageParseError> for CssParsingError<'a> {
2188    fn from(e: StyleHyphenationLanguageParseError) -> Self {
2189        CssParsingError::HyphenationLanguage(e)
2190    }
2191}
2192impl_from!(FlexGrowParseError<'a>, CssParsingError::FlexGrow);
2193impl_from!(FlexShrinkParseError<'a>, CssParsingError::FlexShrink);
2194impl_from!(CssBackgroundParseError<'a>, CssParsingError::Background);
2195impl_from!(
2196    CssBackgroundPositionParseError<'a>,
2197    CssParsingError::BackgroundPosition
2198);
2199impl_from!(OpacityParseError<'a>, CssParsingError::Opacity);
2200impl_from!(StyleVisibilityParseError<'a>, CssParsingError::Visibility);
2201impl_from!(
2202    LayoutScrollbarWidthParseError<'a>,
2203    CssParsingError::LayoutScrollbarWidth
2204);
2205impl_from!(
2206    StyleScrollbarColorParseError<'a>,
2207    CssParsingError::StyleScrollbarColor
2208);
2209impl_from!(
2210    ScrollbarVisibilityModeParseError<'a>,
2211    CssParsingError::ScrollbarVisibilityMode
2212);
2213impl_from!(
2214    ScrollbarFadeDelayParseError<'a>,
2215    CssParsingError::ScrollbarFadeDelay
2216);
2217impl_from!(
2218    ScrollbarFadeDurationParseError<'a>,
2219    CssParsingError::ScrollbarFadeDuration
2220);
2221impl_from!(CssStyleTransformParseError<'a>, CssParsingError::Transform);
2222impl_from!(
2223    CssStyleTransformOriginParseError<'a>,
2224    CssParsingError::TransformOrigin
2225);
2226impl_from!(
2227    CssStylePerspectiveOriginParseError<'a>,
2228    CssParsingError::PerspectiveOrigin
2229);
2230impl_from!(CssStyleFilterParseError<'a>, CssParsingError::Filter);
2231
2232// Layout dimensions
2233impl_from!(LayoutWidthParseError<'a>, CssParsingError::LayoutWidth);
2234impl_from!(LayoutHeightParseError<'a>, CssParsingError::LayoutHeight);
2235impl_from!(
2236    LayoutMinWidthParseError<'a>,
2237    CssParsingError::LayoutMinWidth
2238);
2239impl_from!(
2240    LayoutMinHeightParseError<'a>,
2241    CssParsingError::LayoutMinHeight
2242);
2243impl_from!(
2244    LayoutMaxWidthParseError<'a>,
2245    CssParsingError::LayoutMaxWidth
2246);
2247impl_from!(
2248    LayoutMaxHeightParseError<'a>,
2249    CssParsingError::LayoutMaxHeight
2250);
2251
2252// Layout position
2253impl_from!(
2254    LayoutPositionParseError<'a>,
2255    CssParsingError::LayoutPosition
2256);
2257impl_from!(LayoutTopParseError<'a>, CssParsingError::LayoutTop);
2258impl_from!(LayoutRightParseError<'a>, CssParsingError::LayoutRight);
2259impl_from!(LayoutLeftParseError<'a>, CssParsingError::LayoutLeft);
2260impl_from!(
2261    LayoutInsetBottomParseError<'a>,
2262    CssParsingError::LayoutInsetBottom
2263);
2264impl_from!(LayoutZIndexParseError<'a>, CssParsingError::LayoutZIndex);
2265
2266// Layout flex
2267impl_from!(FlexWrapParseError<'a>, CssParsingError::FlexWrap);
2268impl_from!(FlexDirectionParseError<'a>, CssParsingError::FlexDirection);
2269impl_from!(FlexBasisParseError<'a>, CssParsingError::FlexBasis);
2270impl_from!(
2271    JustifyContentParseError<'a>,
2272    CssParsingError::JustifyContent
2273);
2274impl_from!(AlignItemsParseError<'a>, CssParsingError::AlignItems);
2275impl_from!(AlignContentParseError<'a>, CssParsingError::AlignContent);
2276
2277// Layout grid
2278impl_from!(GridParseError<'a>, CssParsingError::Grid);
2279impl_from!(GridAutoFlowParseError<'a>, CssParsingError::GridAutoFlow);
2280impl_from!(JustifySelfParseError<'a>, CssParsingError::JustifySelf);
2281impl_from!(JustifyItemsParseError<'a>, CssParsingError::JustifyItems);
2282// pixel value impl_from already exists earlier; avoid duplicate impl
2283// impl_from!(CssPixelValueParseError<'a>, CssParsingError::PixelValue);
2284impl_from!(AlignSelfParseError<'a>, CssParsingError::AlignSelf);
2285
2286// Layout wrapping
2287impl_from!(
2288    LayoutWritingModeParseError<'a>,
2289    CssParsingError::LayoutWritingMode
2290);
2291impl_from!(LayoutClearParseError<'a>, CssParsingError::LayoutClear);
2292
2293// Layout overflow
2294impl_from!(
2295    LayoutOverflowParseError<'a>,
2296    CssParsingError::LayoutOverflow
2297);
2298
2299// Border radius individual corners
2300impl_from!(
2301    StyleBorderTopLeftRadiusParseError<'a>,
2302    CssParsingError::BorderTopLeftRadius
2303);
2304impl_from!(
2305    StyleBorderTopRightRadiusParseError<'a>,
2306    CssParsingError::BorderTopRightRadius
2307);
2308impl_from!(
2309    StyleBorderBottomLeftRadiusParseError<'a>,
2310    CssParsingError::BorderBottomLeftRadius
2311);
2312impl_from!(
2313    StyleBorderBottomRightRadiusParseError<'a>,
2314    CssParsingError::BorderBottomRightRadius
2315);
2316
2317// Border style
2318impl_from!(CssBorderStyleParseError<'a>, CssParsingError::BorderStyle);
2319
2320// Effects
2321impl_from!(
2322    CssBackfaceVisibilityParseError<'a>,
2323    CssParsingError::BackfaceVisibility
2324);
2325impl_from!(MixBlendModeParseError<'a>, CssParsingError::MixBlendMode);
2326
2327// Text/Style properties
2328impl_from!(StyleTextColorParseError<'a>, CssParsingError::TextColor);
2329impl_from!(CssStyleFontSizeParseError<'a>, CssParsingError::FontSize);
2330impl_from!(StyleTextAlignParseError<'a>, CssParsingError::TextAlign);
2331impl_from!(TextJustifyParseError<'a>, CssParsingError::TextJustify);
2332impl_from!(
2333    StyleLetterSpacingParseError<'a>,
2334    CssParsingError::LetterSpacing
2335);
2336impl_from!(StyleWordSpacingParseError<'a>, CssParsingError::WordSpacing);
2337impl_from!(StyleTabSizeParseError<'a>, CssParsingError::TabSize);
2338impl_from!(StyleWhiteSpaceParseError<'a>, CssParsingError::WhiteSpace);
2339impl_from!(StyleHyphensParseError<'a>, CssParsingError::Hyphens);
2340impl_from!(StyleWordBreakParseError<'a>, CssParsingError::WordBreak);
2341impl_from!(StyleOverflowWrapParseError<'a>, CssParsingError::OverflowWrap);
2342impl_from!(StyleLineBreakParseError<'a>, CssParsingError::LineBreak);
2343impl_from!(StyleObjectFitParseError<'a>, CssParsingError::ObjectFit);
2344impl_from!(StyleObjectPositionParseError<'a>, CssParsingError::ObjectPosition);
2345impl_from!(StyleAspectRatioParseError<'a>, CssParsingError::AspectRatio);
2346impl_from!(StyleTextOrientationParseError<'a>, CssParsingError::TextOrientation);
2347impl_from!(StyleTextAlignLastParseError<'a>, CssParsingError::TextAlignLast);
2348impl_from!(StyleDirectionParseError<'a>, CssParsingError::Direction);
2349impl_from!(StyleUserSelectParseError<'a>, CssParsingError::UserSelect);
2350impl_from!(
2351    StyleTextDecorationParseError<'a>,
2352    CssParsingError::TextDecoration
2353);
2354impl_from!(CursorParseError<'a>, CssParsingError::Cursor);
2355
2356// Layout basic properties
2357impl_from!(LayoutDisplayParseError<'a>, CssParsingError::LayoutDisplay);
2358impl_from!(LayoutFloatParseError<'a>, CssParsingError::LayoutFloat);
2359impl_from!(
2360    LayoutBoxSizingParseError<'a>,
2361    CssParsingError::LayoutBoxSizing
2362);
2363
2364// DTP properties
2365impl_from!(PageBreakParseError<'a>, CssParsingError::PageBreak);
2366impl_from!(BreakInsideParseError<'a>, CssParsingError::BreakInside);
2367impl_from!(WidowsParseError<'a>, CssParsingError::Widows);
2368impl_from!(OrphansParseError<'a>, CssParsingError::Orphans);
2369impl_from!(
2370    BoxDecorationBreakParseError<'a>,
2371    CssParsingError::BoxDecorationBreak
2372);
2373impl_from!(ColumnCountParseError<'a>, CssParsingError::ColumnCount);
2374impl_from!(ColumnWidthParseError<'a>, CssParsingError::ColumnWidth);
2375impl_from!(ColumnSpanParseError<'a>, CssParsingError::ColumnSpan);
2376impl_from!(ColumnFillParseError<'a>, CssParsingError::ColumnFill);
2377impl_from!(
2378    ColumnRuleWidthParseError<'a>,
2379    CssParsingError::ColumnRuleWidth
2380);
2381impl_from!(
2382    ColumnRuleStyleParseError<'a>,
2383    CssParsingError::ColumnRuleStyle
2384);
2385impl_from!(
2386    ColumnRuleColorParseError<'a>,
2387    CssParsingError::ColumnRuleColor
2388);
2389impl_from!(FlowIntoParseError<'a>, CssParsingError::FlowInto);
2390impl_from!(FlowFromParseError<'a>, CssParsingError::FlowFrom);
2391
2392impl<'a> From<InvalidValueErr<'a>> for CssParsingError<'a> {
2393    fn from(e: InvalidValueErr<'a>) -> Self {
2394        CssParsingError::InvalidValue(e)
2395    }
2396}
2397
2398impl<'a> From<PercentageParseError> for CssParsingError<'a> {
2399    fn from(e: PercentageParseError) -> Self {
2400        CssParsingError::Percentage(e)
2401    }
2402}
2403
2404impl<'a> From<StyleLineHeightParseError> for CssParsingError<'a> {
2405    fn from(e: StyleLineHeightParseError) -> Self {
2406        CssParsingError::LineHeight(e)
2407    }
2408}
2409
2410impl<'a> From<StyleTextIndentParseError<'a>> for CssParsingError<'a> {
2411    fn from(e: StyleTextIndentParseError<'a>) -> Self {
2412        CssParsingError::TextIndent(e)
2413    }
2414}
2415
2416impl<'a> From<StyleVerticalAlignParseError<'a>> for CssParsingError<'a> {
2417    fn from(e: StyleVerticalAlignParseError<'a>) -> Self {
2418        CssParsingError::VerticalAlign(e)
2419    }
2420}
2421
2422impl<'a> CssParsingError<'a> {
2423    pub fn to_contained(&self) -> CssParsingErrorOwned {
2424        match self {
2425            CssParsingError::CaretColor(e) => CssParsingErrorOwned::CaretColor(e.to_contained()),
2426            CssParsingError::CaretWidth(e) => CssParsingErrorOwned::CaretWidth(e.to_contained()),
2427            CssParsingError::CaretAnimationDuration(e) => {
2428                CssParsingErrorOwned::CaretAnimationDuration(e.to_contained())
2429            }
2430            CssParsingError::SelectionBackgroundColor(e) => {
2431                CssParsingErrorOwned::SelectionBackgroundColor(e.to_contained())
2432            }
2433            CssParsingError::SelectionColor(e) => {
2434                CssParsingErrorOwned::SelectionColor(e.to_contained())
2435            }
2436            CssParsingError::SelectionRadius(e) => {
2437                CssParsingErrorOwned::SelectionRadius(e.to_contained())
2438            }
2439            CssParsingError::Border(e) => CssParsingErrorOwned::Border(e.to_contained().into()),
2440            CssParsingError::BorderRadius(e) => {
2441                CssParsingErrorOwned::BorderRadius(e.to_contained().into())
2442            }
2443            CssParsingError::Padding(e) => CssParsingErrorOwned::Padding(e.to_contained()),
2444            CssParsingError::Margin(e) => CssParsingErrorOwned::Margin(e.to_contained()),
2445            CssParsingError::Overflow(e) => CssParsingErrorOwned::Overflow(e.to_contained()),
2446            CssParsingError::BoxShadow(e) => CssParsingErrorOwned::BoxShadow(e.to_contained()),
2447            CssParsingError::Color(e) => CssParsingErrorOwned::Color(e.to_contained()),
2448            CssParsingError::PixelValue(e) => CssParsingErrorOwned::PixelValue(e.to_contained()),
2449            CssParsingError::Percentage(e) => CssParsingErrorOwned::Percentage(e.clone()),
2450            CssParsingError::FontFamily(e) => CssParsingErrorOwned::FontFamily(e.to_contained()),
2451            CssParsingError::InvalidValue(e) => {
2452                CssParsingErrorOwned::InvalidValue(e.to_contained())
2453            }
2454            CssParsingError::FlexGrow(e) => CssParsingErrorOwned::FlexGrow(e.to_contained()),
2455            CssParsingError::FlexShrink(e) => CssParsingErrorOwned::FlexShrink(e.to_contained()),
2456            CssParsingError::Background(e) => CssParsingErrorOwned::Background(e.to_contained()),
2457            CssParsingError::BackgroundPosition(e) => {
2458                CssParsingErrorOwned::BackgroundPosition(e.to_contained())
2459            }
2460            CssParsingError::GridAutoFlow(e) => {
2461                CssParsingErrorOwned::GridAutoFlow(e.to_contained())
2462            }
2463            CssParsingError::JustifySelf(e) => CssParsingErrorOwned::JustifySelf(e.to_contained()),
2464            CssParsingError::JustifyItems(e) => {
2465                CssParsingErrorOwned::JustifyItems(e.to_contained())
2466            }
2467            CssParsingError::AlignSelf(e) => CssParsingErrorOwned::AlignSelf(e.to_contained()),
2468            CssParsingError::Opacity(e) => CssParsingErrorOwned::Opacity(e.to_contained()),
2469            CssParsingError::Visibility(e) => CssParsingErrorOwned::Visibility(e.to_contained()),
2470            CssParsingError::LayoutScrollbarWidth(e) => {
2471                CssParsingErrorOwned::LayoutScrollbarWidth(e.to_contained())
2472            }
2473            CssParsingError::StyleScrollbarColor(e) => {
2474                CssParsingErrorOwned::StyleScrollbarColor(e.to_contained())
2475            }
2476            CssParsingError::ScrollbarVisibilityMode(e) => {
2477                CssParsingErrorOwned::ScrollbarVisibilityMode(e.to_contained())
2478            }
2479            CssParsingError::ScrollbarFadeDelay(e) => {
2480                CssParsingErrorOwned::ScrollbarFadeDelay(e.to_contained())
2481            }
2482            CssParsingError::ScrollbarFadeDuration(e) => {
2483                CssParsingErrorOwned::ScrollbarFadeDuration(e.to_contained())
2484            }
2485            CssParsingError::Transform(e) => CssParsingErrorOwned::Transform(e.to_contained()),
2486            CssParsingError::TransformOrigin(e) => {
2487                CssParsingErrorOwned::TransformOrigin(e.to_contained())
2488            }
2489            CssParsingError::PerspectiveOrigin(e) => {
2490                CssParsingErrorOwned::PerspectiveOrigin(e.to_contained())
2491            }
2492            CssParsingError::Filter(e) => CssParsingErrorOwned::Filter(e.to_contained()),
2493            CssParsingError::LayoutWidth(e) => CssParsingErrorOwned::LayoutWidth(e.to_contained()),
2494            CssParsingError::LayoutHeight(e) => {
2495                CssParsingErrorOwned::LayoutHeight(e.to_contained())
2496            }
2497            CssParsingError::LayoutMinWidth(e) => {
2498                CssParsingErrorOwned::LayoutMinWidth(e.to_contained())
2499            }
2500            CssParsingError::LayoutMinHeight(e) => {
2501                CssParsingErrorOwned::LayoutMinHeight(e.to_contained())
2502            }
2503            CssParsingError::LayoutMaxWidth(e) => {
2504                CssParsingErrorOwned::LayoutMaxWidth(e.to_contained())
2505            }
2506            CssParsingError::LayoutMaxHeight(e) => {
2507                CssParsingErrorOwned::LayoutMaxHeight(e.to_contained())
2508            }
2509            CssParsingError::LayoutPosition(e) => {
2510                CssParsingErrorOwned::LayoutPosition(e.to_contained())
2511            }
2512            CssParsingError::LayoutTop(e) => CssParsingErrorOwned::LayoutTop(e.to_contained()),
2513            CssParsingError::LayoutRight(e) => CssParsingErrorOwned::LayoutRight(e.to_contained()),
2514            CssParsingError::LayoutLeft(e) => CssParsingErrorOwned::LayoutLeft(e.to_contained()),
2515            CssParsingError::LayoutInsetBottom(e) => {
2516                CssParsingErrorOwned::LayoutInsetBottom(e.to_contained())
2517            }
2518            CssParsingError::LayoutZIndex(e) => {
2519                CssParsingErrorOwned::LayoutZIndex(e.to_contained())
2520            }
2521            CssParsingError::FlexWrap(e) => CssParsingErrorOwned::FlexWrap(e.to_contained()),
2522            CssParsingError::FlexDirection(e) => {
2523                CssParsingErrorOwned::FlexDirection(e.to_contained())
2524            }
2525            CssParsingError::FlexBasis(e) => CssParsingErrorOwned::FlexBasis(e.to_contained()),
2526            CssParsingError::JustifyContent(e) => {
2527                CssParsingErrorOwned::JustifyContent(e.to_contained())
2528            }
2529            CssParsingError::AlignItems(e) => CssParsingErrorOwned::AlignItems(e.to_contained()),
2530            CssParsingError::AlignContent(e) => {
2531                CssParsingErrorOwned::AlignContent(e.to_contained())
2532            }
2533            CssParsingError::Grid(e) => CssParsingErrorOwned::Grid(e.to_contained()),
2534            CssParsingError::LayoutWritingMode(e) => {
2535                CssParsingErrorOwned::LayoutWritingMode(e.to_contained())
2536            }
2537            CssParsingError::LayoutClear(e) => CssParsingErrorOwned::LayoutClear(e.to_contained()),
2538            CssParsingError::LayoutOverflow(e) => {
2539                CssParsingErrorOwned::LayoutOverflow(e.to_contained())
2540            }
2541            CssParsingError::BorderTopLeftRadius(e) => {
2542                CssParsingErrorOwned::BorderTopLeftRadius(e.to_contained())
2543            }
2544            CssParsingError::BorderTopRightRadius(e) => {
2545                CssParsingErrorOwned::BorderTopRightRadius(e.to_contained())
2546            }
2547            CssParsingError::BorderBottomLeftRadius(e) => {
2548                CssParsingErrorOwned::BorderBottomLeftRadius(e.to_contained())
2549            }
2550            CssParsingError::BorderBottomRightRadius(e) => {
2551                CssParsingErrorOwned::BorderBottomRightRadius(e.to_contained())
2552            }
2553            CssParsingError::BorderStyle(e) => CssParsingErrorOwned::BorderStyle(e.to_contained()),
2554            CssParsingError::BackfaceVisibility(e) => {
2555                CssParsingErrorOwned::BackfaceVisibility(e.to_contained())
2556            }
2557            CssParsingError::MixBlendMode(e) => {
2558                CssParsingErrorOwned::MixBlendMode(e.to_contained())
2559            }
2560            CssParsingError::TextColor(e) => CssParsingErrorOwned::TextColor(e.to_contained()),
2561            CssParsingError::FontSize(e) => CssParsingErrorOwned::FontSize(e.to_contained()),
2562            CssParsingError::TextAlign(e) => CssParsingErrorOwned::TextAlign(e.to_contained()),
2563            CssParsingError::TextJustify(e) => CssParsingErrorOwned::TextJustify(e.to_owned()),
2564            CssParsingError::VerticalAlign(e) => {
2565                CssParsingErrorOwned::VerticalAlign(e.to_contained())
2566            }
2567            CssParsingError::LetterSpacing(e) => {
2568                CssParsingErrorOwned::LetterSpacing(e.to_contained())
2569            }
2570            CssParsingError::TextIndent(e) => CssParsingErrorOwned::TextIndent(e.to_contained()),
2571            CssParsingError::InitialLetter(e) => {
2572                CssParsingErrorOwned::InitialLetter(e.to_contained())
2573            }
2574            CssParsingError::LineClamp(e) => CssParsingErrorOwned::LineClamp(e.to_contained()),
2575            CssParsingError::HangingPunctuation(e) => {
2576                CssParsingErrorOwned::HangingPunctuation(e.to_contained())
2577            }
2578            CssParsingError::TextCombineUpright(e) => {
2579                CssParsingErrorOwned::TextCombineUpright(e.to_contained())
2580            }
2581            CssParsingError::UnicodeBidi(e) => CssParsingErrorOwned::UnicodeBidi(e.to_contained()),
2582            CssParsingError::TextBoxTrim(e) => CssParsingErrorOwned::TextBoxTrim(e.to_contained()),
2583            CssParsingError::TextBoxEdge(e) => CssParsingErrorOwned::TextBoxEdge(e.to_contained()),
2584            CssParsingError::DominantBaseline(e) => CssParsingErrorOwned::DominantBaseline(e.to_contained()),
2585            CssParsingError::AlignmentBaseline(e) => CssParsingErrorOwned::AlignmentBaseline(e.to_contained()),
2586            CssParsingError::InitialLetterAlign(e) => CssParsingErrorOwned::InitialLetterAlign(e.to_contained()),
2587            CssParsingError::InitialLetterWrap(e) => CssParsingErrorOwned::InitialLetterWrap(e.to_contained()),
2588            CssParsingError::ScrollbarGutter(e) => CssParsingErrorOwned::ScrollbarGutter(e.to_contained()),
2589            CssParsingError::OverflowClipMargin(e) => CssParsingErrorOwned::OverflowClipMargin(e.to_contained()),
2590            CssParsingError::Clip(e) => CssParsingErrorOwned::Clip(e.to_contained()),
2591            CssParsingError::ExclusionMargin(e) => {
2592                CssParsingErrorOwned::ExclusionMargin(e.to_contained())
2593            }
2594            CssParsingError::HyphenationLanguage(e) => {
2595                CssParsingErrorOwned::HyphenationLanguage(e.to_contained())
2596            }
2597            CssParsingError::LineHeight(e) => CssParsingErrorOwned::LineHeight(e.clone()),
2598            CssParsingError::WordSpacing(e) => CssParsingErrorOwned::WordSpacing(e.to_contained()),
2599            CssParsingError::TabSize(e) => CssParsingErrorOwned::TabSize(e.to_contained()),
2600            CssParsingError::WhiteSpace(e) => CssParsingErrorOwned::WhiteSpace(e.to_contained()),
2601            CssParsingError::Hyphens(e) => CssParsingErrorOwned::Hyphens(e.to_contained()),
2602            CssParsingError::WordBreak(e) => CssParsingErrorOwned::WordBreak(e.to_contained()),
2603            CssParsingError::OverflowWrap(e) => CssParsingErrorOwned::OverflowWrap(e.to_contained()),
2604            CssParsingError::LineBreak(e) => CssParsingErrorOwned::LineBreak(e.to_contained()),
2605            CssParsingError::ObjectFit(e) => CssParsingErrorOwned::ObjectFit(e.to_contained()),
2606            CssParsingError::ObjectPosition(e) => CssParsingErrorOwned::ObjectPosition(e.to_contained()),
2607            CssParsingError::AspectRatio(e) => CssParsingErrorOwned::AspectRatio(e.to_contained()),
2608            CssParsingError::TextOrientation(e) => CssParsingErrorOwned::TextOrientation(e.to_contained()),
2609            CssParsingError::TextAlignLast(e) => CssParsingErrorOwned::TextAlignLast(e.to_contained()),
2610            CssParsingError::Direction(e) => CssParsingErrorOwned::Direction(e.to_contained()),
2611            CssParsingError::UserSelect(e) => CssParsingErrorOwned::UserSelect(e.to_contained()),
2612            CssParsingError::TextDecoration(e) => {
2613                CssParsingErrorOwned::TextDecoration(e.to_contained())
2614            }
2615            CssParsingError::Cursor(e) => CssParsingErrorOwned::Cursor(e.to_contained()),
2616            CssParsingError::LayoutDisplay(e) => {
2617                CssParsingErrorOwned::LayoutDisplay(e.to_contained())
2618            }
2619            CssParsingError::LayoutFloat(e) => CssParsingErrorOwned::LayoutFloat(e.to_contained()),
2620            CssParsingError::LayoutBoxSizing(e) => {
2621                CssParsingErrorOwned::LayoutBoxSizing(e.to_contained())
2622            }
2623            // DTP properties...
2624            CssParsingError::PageBreak(e) => CssParsingErrorOwned::PageBreak(e.to_contained()),
2625            CssParsingError::BreakInside(e) => CssParsingErrorOwned::BreakInside(e.to_contained()),
2626            CssParsingError::Widows(e) => CssParsingErrorOwned::Widows(e.to_contained()),
2627            CssParsingError::Orphans(e) => CssParsingErrorOwned::Orphans(e.to_contained()),
2628            CssParsingError::BoxDecorationBreak(e) => {
2629                CssParsingErrorOwned::BoxDecorationBreak(e.to_contained())
2630            }
2631            CssParsingError::ColumnCount(e) => CssParsingErrorOwned::ColumnCount(e.to_contained()),
2632            CssParsingError::ColumnWidth(e) => CssParsingErrorOwned::ColumnWidth(e.to_contained()),
2633            CssParsingError::ColumnSpan(e) => CssParsingErrorOwned::ColumnSpan(e.to_contained()),
2634            CssParsingError::ColumnFill(e) => CssParsingErrorOwned::ColumnFill(e.to_contained()),
2635            CssParsingError::ColumnRuleWidth(e) => {
2636                CssParsingErrorOwned::ColumnRuleWidth(e.to_contained())
2637            }
2638            CssParsingError::ColumnRuleStyle(e) => {
2639                CssParsingErrorOwned::ColumnRuleStyle(e.to_contained())
2640            }
2641            CssParsingError::ColumnRuleColor(e) => {
2642                CssParsingErrorOwned::ColumnRuleColor(e.to_contained())
2643            }
2644            CssParsingError::FlowInto(e) => CssParsingErrorOwned::FlowInto(e.to_contained()),
2645            CssParsingError::FlowFrom(e) => CssParsingErrorOwned::FlowFrom(e.to_contained()),
2646            CssParsingError::GenericParseError => CssParsingErrorOwned::GenericParseError,
2647            CssParsingError::Content => CssParsingErrorOwned::Content,
2648            CssParsingError::Counter => CssParsingErrorOwned::Counter,
2649            CssParsingError::ListStyleType(e) => {
2650                CssParsingErrorOwned::ListStyleType(e.to_contained())
2651            }
2652            CssParsingError::ListStylePosition(e) => {
2653                CssParsingErrorOwned::ListStylePosition(e.to_contained())
2654            }
2655            CssParsingError::StringSet => CssParsingErrorOwned::StringSet,
2656            CssParsingError::FontWeight(e) => CssParsingErrorOwned::FontWeight(e.to_contained()),
2657            CssParsingError::FontStyle(e) => CssParsingErrorOwned::FontStyle(e.to_contained()),
2658        }
2659    }
2660}
2661
2662impl CssParsingErrorOwned {
2663    pub fn to_shared<'a>(&'a self) -> CssParsingError<'a> {
2664        match self {
2665            CssParsingErrorOwned::CaretColor(e) => CssParsingError::CaretColor(e.to_shared()),
2666            CssParsingErrorOwned::CaretWidth(e) => CssParsingError::CaretWidth(e.to_shared()),
2667            CssParsingErrorOwned::CaretAnimationDuration(e) => {
2668                CssParsingError::CaretAnimationDuration(e.to_shared())
2669            }
2670            CssParsingErrorOwned::SelectionBackgroundColor(e) => {
2671                CssParsingError::SelectionBackgroundColor(e.to_shared())
2672            }
2673            CssParsingErrorOwned::SelectionColor(e) => {
2674                CssParsingError::SelectionColor(e.to_shared())
2675            }
2676            CssParsingErrorOwned::SelectionRadius(e) => {
2677                CssParsingError::SelectionRadius(e.to_shared())
2678            }
2679            CssParsingErrorOwned::Border(e) => CssParsingError::Border(e.inner.to_shared()),
2680            CssParsingErrorOwned::BorderRadius(e) => CssParsingError::BorderRadius(e.inner.to_shared()),
2681            CssParsingErrorOwned::Padding(e) => CssParsingError::Padding(e.to_shared()),
2682            CssParsingErrorOwned::Margin(e) => CssParsingError::Margin(e.to_shared()),
2683            CssParsingErrorOwned::Overflow(e) => CssParsingError::Overflow(e.to_shared()),
2684            CssParsingErrorOwned::BoxShadow(e) => CssParsingError::BoxShadow(e.to_shared()),
2685            CssParsingErrorOwned::Color(e) => CssParsingError::Color(e.to_shared()),
2686            CssParsingErrorOwned::PixelValue(e) => CssParsingError::PixelValue(e.to_shared()),
2687            CssParsingErrorOwned::Percentage(e) => CssParsingError::Percentage(e.clone()),
2688            CssParsingErrorOwned::FontFamily(e) => CssParsingError::FontFamily(e.to_shared()),
2689            CssParsingErrorOwned::InvalidValue(e) => CssParsingError::InvalidValue(e.to_shared()),
2690            CssParsingErrorOwned::FlexGrow(e) => CssParsingError::FlexGrow(e.to_shared()),
2691            CssParsingErrorOwned::FlexShrink(e) => CssParsingError::FlexShrink(e.to_shared()),
2692            CssParsingErrorOwned::Background(e) => CssParsingError::Background(e.to_shared()),
2693            CssParsingErrorOwned::BackgroundPosition(e) => {
2694                CssParsingError::BackgroundPosition(e.to_shared())
2695            }
2696            CssParsingErrorOwned::Opacity(e) => CssParsingError::Opacity(e.to_shared()),
2697            CssParsingErrorOwned::Visibility(e) => CssParsingError::Visibility(e.to_shared()),
2698            CssParsingErrorOwned::LayoutScrollbarWidth(e) => {
2699                CssParsingError::LayoutScrollbarWidth(e.to_shared())
2700            }
2701            CssParsingErrorOwned::StyleScrollbarColor(e) => {
2702                CssParsingError::StyleScrollbarColor(e.to_shared())
2703            }
2704            CssParsingErrorOwned::ScrollbarVisibilityMode(e) => {
2705                CssParsingError::ScrollbarVisibilityMode(e.to_shared())
2706            }
2707            CssParsingErrorOwned::ScrollbarFadeDelay(e) => {
2708                CssParsingError::ScrollbarFadeDelay(e.to_shared())
2709            }
2710            CssParsingErrorOwned::ScrollbarFadeDuration(e) => {
2711                CssParsingError::ScrollbarFadeDuration(e.to_shared())
2712            }
2713            CssParsingErrorOwned::Transform(e) => CssParsingError::Transform(e.to_shared()),
2714            CssParsingErrorOwned::TransformOrigin(e) => {
2715                CssParsingError::TransformOrigin(e.to_shared())
2716            }
2717            CssParsingErrorOwned::PerspectiveOrigin(e) => {
2718                CssParsingError::PerspectiveOrigin(e.to_shared())
2719            }
2720            CssParsingErrorOwned::Filter(e) => CssParsingError::Filter(e.to_shared()),
2721            CssParsingErrorOwned::LayoutWidth(e) => CssParsingError::LayoutWidth(e.to_shared()),
2722            CssParsingErrorOwned::LayoutHeight(e) => CssParsingError::LayoutHeight(e.to_shared()),
2723            CssParsingErrorOwned::LayoutMinWidth(e) => {
2724                CssParsingError::LayoutMinWidth(e.to_shared())
2725            }
2726            CssParsingErrorOwned::LayoutMinHeight(e) => {
2727                CssParsingError::LayoutMinHeight(e.to_shared())
2728            }
2729            CssParsingErrorOwned::LayoutMaxWidth(e) => {
2730                CssParsingError::LayoutMaxWidth(e.to_shared())
2731            }
2732            CssParsingErrorOwned::LayoutMaxHeight(e) => {
2733                CssParsingError::LayoutMaxHeight(e.to_shared())
2734            }
2735            CssParsingErrorOwned::LayoutPosition(e) => {
2736                CssParsingError::LayoutPosition(e.to_shared())
2737            }
2738            CssParsingErrorOwned::LayoutTop(e) => CssParsingError::LayoutTop(e.to_shared()),
2739            CssParsingErrorOwned::LayoutRight(e) => CssParsingError::LayoutRight(e.to_shared()),
2740            CssParsingErrorOwned::LayoutLeft(e) => CssParsingError::LayoutLeft(e.to_shared()),
2741            CssParsingErrorOwned::LayoutInsetBottom(e) => {
2742                CssParsingError::LayoutInsetBottom(e.to_shared())
2743            }
2744            CssParsingErrorOwned::LayoutZIndex(e) => CssParsingError::LayoutZIndex(e.to_shared()),
2745            CssParsingErrorOwned::FlexWrap(e) => CssParsingError::FlexWrap(e.to_shared()),
2746            CssParsingErrorOwned::FlexDirection(e) => CssParsingError::FlexDirection(e.to_shared()),
2747            CssParsingErrorOwned::FlexBasis(e) => CssParsingError::FlexBasis(e.to_shared()),
2748            CssParsingErrorOwned::JustifyContent(e) => {
2749                CssParsingError::JustifyContent(e.to_shared())
2750            }
2751            CssParsingErrorOwned::AlignItems(e) => CssParsingError::AlignItems(e.to_shared()),
2752            CssParsingErrorOwned::AlignContent(e) => CssParsingError::AlignContent(e.to_shared()),
2753            CssParsingErrorOwned::Grid(e) => CssParsingError::Grid(e.to_shared()),
2754            CssParsingErrorOwned::GridAutoFlow(e) => CssParsingError::GridAutoFlow(e.to_shared()),
2755            CssParsingErrorOwned::JustifySelf(e) => CssParsingError::JustifySelf(e.to_shared()),
2756            CssParsingErrorOwned::JustifyItems(e) => CssParsingError::JustifyItems(e.to_shared()),
2757            CssParsingErrorOwned::AlignSelf(e) => CssParsingError::AlignSelf(e.to_shared()),
2758            CssParsingErrorOwned::LayoutWritingMode(e) => {
2759                CssParsingError::LayoutWritingMode(e.to_shared())
2760            }
2761            CssParsingErrorOwned::LayoutClear(e) => CssParsingError::LayoutClear(e.to_shared()),
2762            CssParsingErrorOwned::LayoutOverflow(e) => {
2763                CssParsingError::LayoutOverflow(e.to_shared())
2764            }
2765            CssParsingErrorOwned::BorderTopLeftRadius(e) => {
2766                CssParsingError::BorderTopLeftRadius(e.to_shared())
2767            }
2768            CssParsingErrorOwned::BorderTopRightRadius(e) => {
2769                CssParsingError::BorderTopRightRadius(e.to_shared())
2770            }
2771            CssParsingErrorOwned::BorderBottomLeftRadius(e) => {
2772                CssParsingError::BorderBottomLeftRadius(e.to_shared())
2773            }
2774            CssParsingErrorOwned::BorderBottomRightRadius(e) => {
2775                CssParsingError::BorderBottomRightRadius(e.to_shared())
2776            }
2777            CssParsingErrorOwned::BorderStyle(e) => CssParsingError::BorderStyle(e.to_shared()),
2778            CssParsingErrorOwned::BackfaceVisibility(e) => {
2779                CssParsingError::BackfaceVisibility(e.to_shared())
2780            }
2781            CssParsingErrorOwned::MixBlendMode(e) => CssParsingError::MixBlendMode(e.to_shared()),
2782            CssParsingErrorOwned::TextColor(e) => CssParsingError::TextColor(e.to_shared()),
2783            CssParsingErrorOwned::FontSize(e) => CssParsingError::FontSize(e.to_shared()),
2784            CssParsingErrorOwned::TextAlign(e) => CssParsingError::TextAlign(e.to_shared()),
2785            CssParsingErrorOwned::TextJustify(e) => CssParsingError::TextJustify(e.to_borrowed()),
2786            CssParsingErrorOwned::LetterSpacing(e) => CssParsingError::LetterSpacing(e.to_shared()),
2787            CssParsingErrorOwned::TextIndent(e) => CssParsingError::TextIndent(e.to_shared()),
2788            CssParsingErrorOwned::InitialLetter(e) => CssParsingError::InitialLetter(e.to_shared()),
2789            CssParsingErrorOwned::LineClamp(e) => CssParsingError::LineClamp(e.to_shared()),
2790            CssParsingErrorOwned::HangingPunctuation(e) => {
2791                CssParsingError::HangingPunctuation(e.to_shared())
2792            }
2793            CssParsingErrorOwned::TextCombineUpright(e) => {
2794                CssParsingError::TextCombineUpright(e.to_shared())
2795            }
2796            CssParsingErrorOwned::UnicodeBidi(e) => CssParsingError::UnicodeBidi(e.to_shared()),
2797            CssParsingErrorOwned::TextBoxTrim(e) => CssParsingError::TextBoxTrim(e.to_shared()),
2798            CssParsingErrorOwned::TextBoxEdge(e) => CssParsingError::TextBoxEdge(e.to_shared()),
2799            CssParsingErrorOwned::DominantBaseline(e) => CssParsingError::DominantBaseline(e.to_shared()),
2800            CssParsingErrorOwned::AlignmentBaseline(e) => CssParsingError::AlignmentBaseline(e.to_shared()),
2801            CssParsingErrorOwned::InitialLetterAlign(e) => CssParsingError::InitialLetterAlign(e.to_shared()),
2802            CssParsingErrorOwned::InitialLetterWrap(e) => CssParsingError::InitialLetterWrap(e.to_shared()),
2803            CssParsingErrorOwned::ScrollbarGutter(e) => CssParsingError::ScrollbarGutter(e.to_shared()),
2804            CssParsingErrorOwned::OverflowClipMargin(e) => CssParsingError::OverflowClipMargin(e.to_shared()),
2805            CssParsingErrorOwned::Clip(e) => CssParsingError::Clip(e.to_shared()),
2806            CssParsingErrorOwned::ExclusionMargin(e) => {
2807                CssParsingError::ExclusionMargin(e.to_shared())
2808            }
2809            CssParsingErrorOwned::HyphenationLanguage(e) => {
2810                CssParsingError::HyphenationLanguage(e.to_shared())
2811            }
2812            CssParsingErrorOwned::LineHeight(e) => CssParsingError::LineHeight(e.clone()),
2813            CssParsingErrorOwned::WordSpacing(e) => CssParsingError::WordSpacing(e.to_shared()),
2814            CssParsingErrorOwned::TabSize(e) => CssParsingError::TabSize(e.to_shared()),
2815            CssParsingErrorOwned::WhiteSpace(e) => CssParsingError::WhiteSpace(e.to_shared()),
2816            CssParsingErrorOwned::Hyphens(e) => CssParsingError::Hyphens(e.to_shared()),
2817            CssParsingErrorOwned::WordBreak(e) => CssParsingError::WordBreak(e.to_shared()),
2818            CssParsingErrorOwned::OverflowWrap(e) => CssParsingError::OverflowWrap(e.to_shared()),
2819            CssParsingErrorOwned::LineBreak(e) => CssParsingError::LineBreak(e.to_shared()),
2820            CssParsingErrorOwned::ObjectFit(e) => CssParsingError::ObjectFit(e.to_shared()),
2821            CssParsingErrorOwned::ObjectPosition(e) => CssParsingError::ObjectPosition(e.to_shared()),
2822            CssParsingErrorOwned::AspectRatio(e) => CssParsingError::AspectRatio(e.to_shared()),
2823            CssParsingErrorOwned::TextOrientation(e) => CssParsingError::TextOrientation(e.to_shared()),
2824            CssParsingErrorOwned::TextAlignLast(e) => CssParsingError::TextAlignLast(e.to_shared()),
2825            CssParsingErrorOwned::Direction(e) => CssParsingError::Direction(e.to_shared()),
2826            CssParsingErrorOwned::UserSelect(e) => CssParsingError::UserSelect(e.to_shared()),
2827            CssParsingErrorOwned::TextDecoration(e) => {
2828                CssParsingError::TextDecoration(e.to_shared())
2829            }
2830            CssParsingErrorOwned::Cursor(e) => CssParsingError::Cursor(e.to_shared()),
2831            CssParsingErrorOwned::LayoutDisplay(e) => CssParsingError::LayoutDisplay(e.to_shared()),
2832            CssParsingErrorOwned::LayoutFloat(e) => CssParsingError::LayoutFloat(e.to_shared()),
2833            CssParsingErrorOwned::LayoutBoxSizing(e) => {
2834                CssParsingError::LayoutBoxSizing(e.to_shared())
2835            }
2836            // DTP properties...
2837            CssParsingErrorOwned::PageBreak(e) => CssParsingError::PageBreak(e.to_shared()),
2838            CssParsingErrorOwned::BreakInside(e) => CssParsingError::BreakInside(e.to_shared()),
2839            CssParsingErrorOwned::Widows(e) => CssParsingError::Widows(e.to_shared()),
2840            CssParsingErrorOwned::Orphans(e) => CssParsingError::Orphans(e.to_shared()),
2841            CssParsingErrorOwned::BoxDecorationBreak(e) => {
2842                CssParsingError::BoxDecorationBreak(e.to_shared())
2843            }
2844            CssParsingErrorOwned::ColumnCount(e) => CssParsingError::ColumnCount(e.to_shared()),
2845            CssParsingErrorOwned::ColumnWidth(e) => CssParsingError::ColumnWidth(e.to_shared()),
2846            CssParsingErrorOwned::ColumnSpan(e) => CssParsingError::ColumnSpan(e.to_shared()),
2847            CssParsingErrorOwned::ColumnFill(e) => CssParsingError::ColumnFill(e.to_shared()),
2848            CssParsingErrorOwned::ColumnRuleWidth(e) => {
2849                CssParsingError::ColumnRuleWidth(e.to_shared())
2850            }
2851            CssParsingErrorOwned::ColumnRuleStyle(e) => {
2852                CssParsingError::ColumnRuleStyle(e.to_shared())
2853            }
2854            CssParsingErrorOwned::ColumnRuleColor(e) => {
2855                CssParsingError::ColumnRuleColor(e.to_shared())
2856            }
2857            CssParsingErrorOwned::FlowInto(e) => CssParsingError::FlowInto(e.to_shared()),
2858            CssParsingErrorOwned::FlowFrom(e) => CssParsingError::FlowFrom(e.to_shared()),
2859            CssParsingErrorOwned::GenericParseError => CssParsingError::GenericParseError,
2860            CssParsingErrorOwned::Content => CssParsingError::Content,
2861            CssParsingErrorOwned::Counter => CssParsingError::Counter,
2862            CssParsingErrorOwned::ListStyleType(e) => CssParsingError::ListStyleType(e.to_shared()),
2863            CssParsingErrorOwned::ListStylePosition(e) => {
2864                CssParsingError::ListStylePosition(e.to_shared())
2865            }
2866            CssParsingErrorOwned::StringSet => CssParsingError::StringSet,
2867            CssParsingErrorOwned::FontWeight(e) => CssParsingError::FontWeight(e.to_shared()),
2868            CssParsingErrorOwned::FontStyle(e) => CssParsingError::FontStyle(e.to_shared()),
2869            CssParsingErrorOwned::VerticalAlign(e) => CssParsingError::VerticalAlign(e.to_shared()),
2870        }
2871    }
2872}
2873
2874#[cfg(feature = "parser")]
2875pub fn parse_css_property<'a>(
2876    key: CssPropertyType,
2877    value: &'a str,
2878) -> Result<CssProperty, CssParsingError<'a>> {
2879    use crate::props::style::{
2880        parse_selection_background_color, parse_selection_color, parse_selection_radius,
2881    };
2882
2883    let value = value.trim();
2884
2885    // For properties where "auto" or "none" is a valid typed value (not just the generic CSS
2886    // keyword), we must NOT intercept them here. Let the specific parser handle them.
2887    let has_typed_auto = matches!(
2888        key,
2889        CssPropertyType::Hyphens |      // hyphens: auto means StyleHyphens::Auto
2890        CssPropertyType::LineBreak |    // line-break: auto means StyleLineBreak::Auto
2891        CssPropertyType::TextAlignLast | // text-align-last: auto means StyleTextAlignLast::Auto
2892        CssPropertyType::OverflowX |
2893        CssPropertyType::OverflowY |
2894        CssPropertyType::OverflowBlock |
2895        CssPropertyType::OverflowInline |
2896        CssPropertyType::UserSelect | // user-select: auto is a typed value
2897        CssPropertyType::AspectRatio // aspect-ratio: auto means StyleAspectRatio::Auto
2898    );
2899
2900    let has_typed_none = matches!(
2901        key,
2902        CssPropertyType::Hyphens |      // hyphens: none means StyleHyphens::None
2903        CssPropertyType::Display |      // display: none means LayoutDisplay::None
2904        CssPropertyType::UserSelect |
2905        CssPropertyType::Float |        // float: none means LayoutFloat::None
2906        CssPropertyType::TextDecoration | // text-decoration: none is a typed value
2907        CssPropertyType::ObjectFit      // object-fit: none means StyleObjectFit::None
2908    );
2909
2910    Ok(match value {
2911        "auto" if !has_typed_auto => CssProperty::auto(key),
2912        "none" if !has_typed_none => CssProperty::none(key),
2913        "initial" => CssProperty::initial(key),
2914        "inherit" => CssProperty::inherit(key),
2915        value => match key {
2916            CssPropertyType::CaretColor => parse_caret_color(value)?.into(),
2917            CssPropertyType::CaretWidth => parse_caret_width(value)?.into(),
2918            CssPropertyType::CaretAnimationDuration => {
2919                parse_caret_animation_duration(value)?.into()
2920            }
2921            CssPropertyType::SelectionBackgroundColor => {
2922                parse_selection_background_color(value)?.into()
2923            }
2924            CssPropertyType::SelectionColor => parse_selection_color(value)?.into(),
2925            CssPropertyType::SelectionRadius => parse_selection_radius(value)?.into(),
2926
2927            CssPropertyType::TextColor => parse_style_text_color(value)?.into(),
2928            CssPropertyType::FontSize => {
2929                CssProperty::FontSize(parse_style_font_size(value)?.into())
2930            }
2931            CssPropertyType::FontFamily => parse_style_font_family(value)?.into(),
2932            CssPropertyType::FontWeight => {
2933                CssProperty::FontWeight(parse_font_weight(value)?.into())
2934            }
2935            CssPropertyType::FontStyle => CssProperty::FontStyle(parse_font_style(value)?.into()),
2936            CssPropertyType::TextAlign => parse_style_text_align(value)?.into(),
2937            CssPropertyType::TextJustify => parse_layout_text_justify(value)?.into(),
2938            CssPropertyType::VerticalAlign => parse_style_vertical_align(value)?.into(),
2939            CssPropertyType::LetterSpacing => parse_style_letter_spacing(value)?.into(),
2940            CssPropertyType::TextIndent => parse_style_text_indent(value)?.into(),
2941            CssPropertyType::InitialLetter => parse_style_initial_letter(value)?.into(),
2942            CssPropertyType::LineClamp => parse_style_line_clamp(value)?.into(),
2943            CssPropertyType::HangingPunctuation => parse_style_hanging_punctuation(value)?.into(),
2944            CssPropertyType::TextCombineUpright => parse_style_text_combine_upright(value)?.into(),
2945            CssPropertyType::UnicodeBidi => parse_style_unicode_bidi(value)?.into(),
2946            CssPropertyType::TextBoxTrim => parse_style_text_box_trim(value)?.into(),
2947            CssPropertyType::TextBoxEdge => parse_style_text_box_edge(value)?.into(),
2948            CssPropertyType::DominantBaseline => parse_style_dominant_baseline(value)?.into(),
2949            CssPropertyType::AlignmentBaseline => parse_style_alignment_baseline(value)?.into(),
2950            CssPropertyType::InitialLetterAlign => parse_style_initial_letter_align(value)?.into(),
2951            CssPropertyType::InitialLetterWrap => parse_style_initial_letter_wrap(value)?.into(),
2952            CssPropertyType::ScrollbarGutter => parse_style_scrollbar_gutter(value)?.into(),
2953            CssPropertyType::OverflowClipMargin => parse_style_overflow_clip_margin(value)?.into(),
2954            CssPropertyType::Clip => parse_clip_rect(value)?.into(),
2955            CssPropertyType::ExclusionMargin => parse_style_exclusion_margin(value)?.into(),
2956            CssPropertyType::HyphenationLanguage => parse_style_hyphenation_language(value)?.into(),
2957            CssPropertyType::LineHeight => parse_style_line_height(value)?.into(),
2958            CssPropertyType::WordSpacing => parse_style_word_spacing(value)?.into(),
2959            CssPropertyType::TabSize => parse_style_tab_size(value)?.into(),
2960            CssPropertyType::WhiteSpace => parse_style_white_space(value)?.into(),
2961            CssPropertyType::Hyphens => parse_style_hyphens(value)?.into(),
2962            CssPropertyType::WordBreak => parse_style_word_break(value)?.into(),
2963            CssPropertyType::OverflowWrap => parse_style_overflow_wrap(value)?.into(),
2964            CssPropertyType::LineBreak => parse_style_line_break(value)?.into(),
2965            CssPropertyType::ObjectFit => parse_style_object_fit(value)?.into(),
2966            CssPropertyType::ObjectPosition => parse_style_object_position(value)?.into(),
2967            CssPropertyType::AspectRatio => parse_style_aspect_ratio(value)?.into(),
2968            CssPropertyType::TextOrientation => parse_style_text_orientation(value)?.into(),
2969            CssPropertyType::TextAlignLast => parse_style_text_align_last(value)?.into(),
2970            CssPropertyType::Direction => parse_style_direction(value)?.into(),
2971            CssPropertyType::UserSelect => parse_style_user_select(value)?.into(),
2972            CssPropertyType::TextDecoration => parse_style_text_decoration(value)?.into(),
2973            CssPropertyType::Cursor => parse_style_cursor(value)?.into(),
2974
2975            CssPropertyType::Display => parse_layout_display(value)?.into(),
2976            CssPropertyType::Float => parse_layout_float(value)?.into(),
2977            CssPropertyType::BoxSizing => parse_layout_box_sizing(value)?.into(),
2978            CssPropertyType::Width => parse_layout_width(value)?.into(),
2979            CssPropertyType::Height => parse_layout_height(value)?.into(),
2980            CssPropertyType::MinWidth => parse_layout_min_width(value)?.into(),
2981            CssPropertyType::MinHeight => parse_layout_min_height(value)?.into(),
2982            CssPropertyType::MaxWidth => parse_layout_max_width(value)?.into(),
2983            CssPropertyType::MaxHeight => parse_layout_max_height(value)?.into(),
2984            CssPropertyType::Position => parse_layout_position(value)?.into(),
2985            CssPropertyType::Top => parse_layout_top(value)?.into(),
2986            CssPropertyType::Right => parse_layout_right(value)?.into(),
2987            CssPropertyType::Left => parse_layout_left(value)?.into(),
2988            CssPropertyType::Bottom => parse_layout_bottom(value)?.into(),
2989            CssPropertyType::ZIndex => CssProperty::ZIndex(parse_layout_z_index(value)?.into()),
2990
2991            CssPropertyType::FlexWrap => parse_layout_flex_wrap(value)?.into(),
2992            CssPropertyType::FlexDirection => parse_layout_flex_direction(value)?.into(),
2993            CssPropertyType::FlexGrow => parse_layout_flex_grow(value)?.into(),
2994            CssPropertyType::FlexShrink => parse_layout_flex_shrink(value)?.into(),
2995            CssPropertyType::FlexBasis => parse_layout_flex_basis(value)?.into(),
2996            CssPropertyType::JustifyContent => parse_layout_justify_content(value)?.into(),
2997            CssPropertyType::AlignItems => parse_layout_align_items(value)?.into(),
2998            CssPropertyType::AlignContent => parse_layout_align_content(value)?.into(),
2999            CssPropertyType::ColumnGap => parse_layout_column_gap(value)?.into(),
3000            CssPropertyType::RowGap => parse_layout_row_gap(value)?.into(),
3001            CssPropertyType::GridTemplateColumns => {
3002                CssProperty::GridTemplateColumns(parse_grid_template(value)?.into())
3003            }
3004            CssPropertyType::GridTemplateRows => {
3005                CssProperty::GridTemplateRows(parse_grid_template(value)?.into())
3006            }
3007            CssPropertyType::GridAutoColumns => {
3008                let template = parse_grid_template(value)?;
3009                CssProperty::GridAutoColumns(CssPropertyValue::Exact(GridAutoTracks::from(
3010                    template,
3011                )))
3012            }
3013            CssPropertyType::GridAutoFlow => {
3014                CssProperty::GridAutoFlow(parse_layout_grid_auto_flow(value)?.into())
3015            }
3016            CssPropertyType::JustifySelf => {
3017                CssProperty::JustifySelf(parse_layout_justify_self(value)?.into())
3018            }
3019            CssPropertyType::JustifyItems => {
3020                CssProperty::JustifyItems(parse_layout_justify_items(value)?.into())
3021            }
3022            CssPropertyType::Gap => {
3023                // gap shorthand: single value -> both row & column
3024                CssProperty::Gap(parse_layout_gap(value)?.into())
3025            }
3026            CssPropertyType::GridGap => CssProperty::GridGap(parse_layout_gap(value)?.into()),
3027            CssPropertyType::AlignSelf => {
3028                CssProperty::AlignSelf(parse_layout_align_self(value)?.into())
3029            }
3030            CssPropertyType::Font => {
3031                // minimal font parser: map to font-family for now
3032                let fam = parse_style_font_family(value)?;
3033                CssProperty::Font(fam.into())
3034            }
3035            CssPropertyType::GridAutoRows => {
3036                let template = parse_grid_template(value)?;
3037                CssProperty::GridAutoRows(CssPropertyValue::Exact(GridAutoTracks::from(template)))
3038            }
3039            CssPropertyType::GridColumn => {
3040                CssProperty::GridColumn(CssPropertyValue::Exact(parse_grid_placement(value)?))
3041            }
3042            CssPropertyType::GridRow => CssProperty::GridRow(CssPropertyValue::Exact(parse_grid_placement(value)?)),
3043            CssPropertyType::GridTemplateAreas => {
3044                use crate::props::layout::grid::parse_grid_template_areas;
3045                let areas = parse_grid_template_areas(value)
3046                    .map_err(|_| CssParsingError::InvalidValue(InvalidValueErr(value)))?;
3047                CssProperty::GridTemplateAreas(CssPropertyValue::Exact(areas))
3048            }
3049            CssPropertyType::WritingMode => parse_layout_writing_mode(value)?.into(),
3050            CssPropertyType::Clear => parse_layout_clear(value)?.into(),
3051
3052            CssPropertyType::BackgroundContent => {
3053                parse_style_background_content_multiple(value)?.into()
3054            }
3055            CssPropertyType::BackgroundPosition => {
3056                parse_style_background_position_multiple(value)?.into()
3057            }
3058            CssPropertyType::BackgroundSize => parse_style_background_size_multiple(value)?.into(),
3059            CssPropertyType::BackgroundRepeat => {
3060                parse_style_background_repeat_multiple(value)?.into()
3061            }
3062
3063            CssPropertyType::OverflowX => {
3064                CssProperty::OverflowX(parse_layout_overflow(value)?.into())
3065            }
3066            CssPropertyType::OverflowY => {
3067                CssProperty::OverflowY(parse_layout_overflow(value)?.into())
3068            }
3069            CssPropertyType::OverflowBlock => {
3070                CssProperty::OverflowBlock(parse_layout_overflow(value)?.into())
3071            }
3072            CssPropertyType::OverflowInline => {
3073                CssProperty::OverflowInline(parse_layout_overflow(value)?.into())
3074            }
3075
3076            CssPropertyType::PaddingTop => parse_layout_padding_top(value)?.into(),
3077            CssPropertyType::PaddingLeft => parse_layout_padding_left(value)?.into(),
3078            CssPropertyType::PaddingRight => parse_layout_padding_right(value)?.into(),
3079            CssPropertyType::PaddingBottom => parse_layout_padding_bottom(value)?.into(),
3080            CssPropertyType::PaddingInlineStart => parse_layout_padding_inline_start(value)?.into(),
3081            CssPropertyType::PaddingInlineEnd => parse_layout_padding_inline_end(value)?.into(),
3082
3083            CssPropertyType::MarginTop => parse_layout_margin_top(value)?.into(),
3084            CssPropertyType::MarginLeft => parse_layout_margin_left(value)?.into(),
3085            CssPropertyType::MarginRight => parse_layout_margin_right(value)?.into(),
3086            CssPropertyType::MarginBottom => parse_layout_margin_bottom(value)?.into(),
3087
3088            CssPropertyType::BorderTopLeftRadius => {
3089                parse_style_border_top_left_radius(value)?.into()
3090            }
3091            CssPropertyType::BorderTopRightRadius => {
3092                parse_style_border_top_right_radius(value)?.into()
3093            }
3094            CssPropertyType::BorderBottomLeftRadius => {
3095                parse_style_border_bottom_left_radius(value)?.into()
3096            }
3097            CssPropertyType::BorderBottomRightRadius => {
3098                parse_style_border_bottom_right_radius(value)?.into()
3099            }
3100
3101            CssPropertyType::BorderTopColor => parse_border_top_color(value)?.into(),
3102            CssPropertyType::BorderRightColor => parse_border_right_color(value)?.into(),
3103            CssPropertyType::BorderLeftColor => parse_border_left_color(value)?.into(),
3104            CssPropertyType::BorderBottomColor => parse_border_bottom_color(value)?.into(),
3105
3106            CssPropertyType::BorderTopStyle => parse_border_top_style(value)?.into(),
3107            CssPropertyType::BorderRightStyle => parse_border_right_style(value)?.into(),
3108            CssPropertyType::BorderLeftStyle => parse_border_left_style(value)?.into(),
3109            CssPropertyType::BorderBottomStyle => parse_border_bottom_style(value)?.into(),
3110
3111            CssPropertyType::BorderTopWidth => parse_border_top_width(value)?.into(),
3112            CssPropertyType::BorderRightWidth => parse_border_right_width(value)?.into(),
3113            CssPropertyType::BorderLeftWidth => parse_border_left_width(value)?.into(),
3114            CssPropertyType::BorderBottomWidth => parse_border_bottom_width(value)?.into(),
3115
3116            CssPropertyType::BoxShadowLeft => {
3117                CssProperty::BoxShadowLeft(CssPropertyValue::Exact(BoxOrStatic::heap(parse_style_box_shadow(value)?)))
3118            }
3119            CssPropertyType::BoxShadowRight => {
3120                CssProperty::BoxShadowRight(CssPropertyValue::Exact(BoxOrStatic::heap(parse_style_box_shadow(value)?)))
3121            }
3122            CssPropertyType::BoxShadowTop => {
3123                CssProperty::BoxShadowTop(CssPropertyValue::Exact(BoxOrStatic::heap(parse_style_box_shadow(value)?)))
3124            }
3125            CssPropertyType::BoxShadowBottom => {
3126                CssProperty::BoxShadowBottom(CssPropertyValue::Exact(BoxOrStatic::heap(parse_style_box_shadow(value)?)))
3127            }
3128
3129            CssPropertyType::ScrollbarTrack => CssProperty::ScrollbarTrack(CssPropertyValue::Exact(parse_style_background_content(value)?)),
3130            CssPropertyType::ScrollbarThumb => CssProperty::ScrollbarThumb(CssPropertyValue::Exact(parse_style_background_content(value)?)),
3131            CssPropertyType::ScrollbarButton => CssProperty::ScrollbarButton(CssPropertyValue::Exact(parse_style_background_content(value)?)),
3132            CssPropertyType::ScrollbarCorner => CssProperty::ScrollbarCorner(CssPropertyValue::Exact(parse_style_background_content(value)?)),
3133            CssPropertyType::ScrollbarResizer => CssProperty::ScrollbarResizer(CssPropertyValue::Exact(parse_style_background_content(value)?)),
3134            CssPropertyType::ScrollbarWidth => parse_layout_scrollbar_width(value)?.into(),
3135            CssPropertyType::ScrollbarColor => parse_style_scrollbar_color(value)?.into(),
3136            CssPropertyType::ScrollbarVisibility => parse_scrollbar_visibility_mode(value)?.into(),
3137            CssPropertyType::ScrollbarFadeDelay => parse_scrollbar_fade_delay(value)?.into(),
3138            CssPropertyType::ScrollbarFadeDuration => parse_scrollbar_fade_duration(value)?.into(),
3139            CssPropertyType::Opacity => parse_style_opacity(value)?.into(),
3140            CssPropertyType::Visibility => parse_style_visibility(value)?.into(),
3141            CssPropertyType::Transform => parse_style_transform_vec(value)?.into(),
3142            CssPropertyType::TransformOrigin => parse_style_transform_origin(value)?.into(),
3143            CssPropertyType::PerspectiveOrigin => parse_style_perspective_origin(value)?.into(),
3144            CssPropertyType::BackfaceVisibility => parse_style_backface_visibility(value)?.into(),
3145
3146            CssPropertyType::MixBlendMode => parse_style_mix_blend_mode(value)?.into(),
3147            CssPropertyType::Filter => CssProperty::Filter(parse_style_filter_vec(value)?.into()),
3148            CssPropertyType::BackdropFilter => {
3149                CssProperty::BackdropFilter(parse_style_filter_vec(value)?.into())
3150            }
3151            CssPropertyType::TextShadow => {
3152                CssProperty::TextShadow(CssPropertyValue::Exact(BoxOrStatic::heap(parse_style_box_shadow(value)?)))
3153            }
3154
3155            // DTP properties
3156            CssPropertyType::BreakBefore => {
3157                CssProperty::BreakBefore(parse_page_break(value)?.into())
3158            }
3159            CssPropertyType::BreakAfter => CssProperty::BreakAfter(parse_page_break(value)?.into()),
3160            CssPropertyType::BreakInside => {
3161                CssProperty::BreakInside(parse_break_inside(value)?.into())
3162            }
3163            CssPropertyType::Orphans => CssProperty::Orphans(parse_orphans(value)?.into()),
3164            CssPropertyType::Widows => CssProperty::Widows(parse_widows(value)?.into()),
3165            CssPropertyType::BoxDecorationBreak => {
3166                CssProperty::BoxDecorationBreak(parse_box_decoration_break(value)?.into())
3167            }
3168            CssPropertyType::ColumnCount => {
3169                CssProperty::ColumnCount(parse_column_count(value)?.into())
3170            }
3171            CssPropertyType::ColumnWidth => {
3172                CssProperty::ColumnWidth(parse_column_width(value)?.into())
3173            }
3174            CssPropertyType::ColumnSpan => {
3175                CssProperty::ColumnSpan(parse_column_span(value)?.into())
3176            }
3177            CssPropertyType::ColumnFill => {
3178                CssProperty::ColumnFill(parse_column_fill(value)?.into())
3179            }
3180            CssPropertyType::ColumnRuleWidth => {
3181                CssProperty::ColumnRuleWidth(parse_column_rule_width(value)?.into())
3182            }
3183            CssPropertyType::ColumnRuleStyle => {
3184                CssProperty::ColumnRuleStyle(parse_column_rule_style(value)?.into())
3185            }
3186            CssPropertyType::ColumnRuleColor => {
3187                CssProperty::ColumnRuleColor(parse_column_rule_color(value)?.into())
3188            }
3189            CssPropertyType::FlowInto => CssProperty::FlowInto(parse_flow_into(value)?.into()),
3190            CssPropertyType::FlowFrom => CssProperty::FlowFrom(parse_flow_from(value)?.into()),
3191            CssPropertyType::ShapeOutside => CssProperty::ShapeOutside(
3192                CssPropertyValue::Exact(parse_shape_outside(value)
3193                    .map_err(|_| CssParsingError::GenericParseError)?)
3194            ),
3195            CssPropertyType::ShapeInside => CssProperty::ShapeInside(
3196                CssPropertyValue::Exact(parse_shape_inside(value)
3197                    .map_err(|_| CssParsingError::GenericParseError)?)
3198            ),
3199            CssPropertyType::ClipPath => CssProperty::ClipPath(
3200                CssPropertyValue::Exact(parse_clip_path(value)
3201                    .map_err(|_| CssParsingError::GenericParseError)?)
3202            ),
3203            CssPropertyType::ShapeMargin => {
3204                CssProperty::ShapeMargin(parse_shape_margin(value)?.into())
3205            }
3206            CssPropertyType::ShapeImageThreshold => CssProperty::ShapeImageThreshold(
3207                parse_shape_image_threshold(value)
3208                    .map_err(|_| CssParsingError::GenericParseError)?
3209                    .into(),
3210            ),
3211            CssPropertyType::Content => CssProperty::Content(
3212                parse_content(value)
3213                    .map_err(|_| CssParsingError::Content)?
3214                    .into(),
3215            ),
3216            CssPropertyType::CounterReset => CssProperty::CounterReset(
3217                parse_counter_reset(value)
3218                    .map_err(|_| CssParsingError::Counter)?
3219                    .into(),
3220            ),
3221            CssPropertyType::CounterIncrement => CssProperty::CounterIncrement(
3222                parse_counter_increment(value)
3223                    .map_err(|_| CssParsingError::Counter)?
3224                    .into(),
3225            ),
3226            CssPropertyType::ListStyleType => CssProperty::ListStyleType(
3227                parse_style_list_style_type(value)
3228                    .map_err(CssParsingError::ListStyleType)?
3229                    .into(),
3230            ),
3231            CssPropertyType::ListStylePosition => CssProperty::ListStylePosition(
3232                parse_style_list_style_position(value)
3233                    .map_err(CssParsingError::ListStylePosition)?
3234                    .into(),
3235            ),
3236            CssPropertyType::StringSet => CssProperty::StringSet(
3237                parse_string_set(value)
3238                    .map_err(|_| CssParsingError::StringSet)?
3239                    .into(),
3240            ),
3241            CssPropertyType::TableLayout => CssProperty::TableLayout(
3242                parse_table_layout(value)
3243                    .map_err(|_| CssParsingError::GenericParseError)?
3244                    .into(),
3245            ),
3246            CssPropertyType::BorderCollapse => CssProperty::BorderCollapse(
3247                parse_border_collapse(value)
3248                    .map_err(|_| CssParsingError::GenericParseError)?
3249                    .into(),
3250            ),
3251            CssPropertyType::BorderSpacing => CssProperty::BorderSpacing(
3252                parse_border_spacing(value)
3253                    .map_err(|_| CssParsingError::GenericParseError)?
3254                    .into(),
3255            ),
3256            CssPropertyType::CaptionSide => CssProperty::CaptionSide(
3257                parse_caption_side(value)
3258                    .map_err(|_| CssParsingError::GenericParseError)?
3259                    .into(),
3260            ),
3261            CssPropertyType::EmptyCells => CssProperty::EmptyCells(
3262                parse_empty_cells(value)
3263                    .map_err(|_| CssParsingError::GenericParseError)?
3264                    .into(),
3265            ),
3266        },
3267    })
3268}
3269
3270#[cfg(feature = "parser")]
3271
3272/// Parses a combined CSS property or a CSS property shorthand, for example "margin"
3273/// (as a shorthand for setting all four properties of "margin-top", "margin-bottom",
3274/// "margin-left" and "margin-right")
3275///
3276/// ```rust
3277/// # extern crate azul_css;
3278/// # use azul_css::*;
3279/// # use azul_css::props::style::*;
3280/// # use azul_css::css::CssPropertyValue;
3281/// # use azul_css::props::property::*;
3282/// assert_eq!(
3283///     parse_combined_css_property(CombinedCssPropertyType::BorderRadius, "10px"),
3284///     Ok(vec![
3285///         CssProperty::BorderTopLeftRadius(CssPropertyValue::Exact(
3286///             StyleBorderTopLeftRadius::px(10.0)
3287///         )),
3288///         CssProperty::BorderTopRightRadius(CssPropertyValue::Exact(
3289///             StyleBorderTopRightRadius::px(10.0)
3290///         )),
3291///         CssProperty::BorderBottomLeftRadius(CssPropertyValue::Exact(
3292///             StyleBorderBottomLeftRadius::px(10.0)
3293///         )),
3294///         CssProperty::BorderBottomRightRadius(CssPropertyValue::Exact(
3295///             StyleBorderBottomRightRadius::px(10.0)
3296///         )),
3297///     ])
3298/// )
3299/// ```
3300#[cfg(feature = "parser")]
3301pub fn parse_combined_css_property<'a>(
3302    key: CombinedCssPropertyType,
3303    value: &'a str,
3304) -> Result<Vec<CssProperty>, CssParsingError<'a>> {
3305    use self::CombinedCssPropertyType::*;
3306
3307    macro_rules! convert_value {
3308        ($thing:expr, $prop_type:ident, $wrapper:ident) => {
3309            match $thing {
3310                PixelValueWithAuto::None => CssProperty::none(CssPropertyType::$prop_type),
3311                PixelValueWithAuto::Initial => CssProperty::initial(CssPropertyType::$prop_type),
3312                PixelValueWithAuto::Inherit => CssProperty::inherit(CssPropertyType::$prop_type),
3313                PixelValueWithAuto::Auto => CssProperty::auto(CssPropertyType::$prop_type),
3314                PixelValueWithAuto::Exact(x) => {
3315                    CssProperty::$prop_type($wrapper { inner: x }.into())
3316                }
3317            }
3318        };
3319    }
3320
3321    let keys = match key {
3322        BorderRadius => {
3323            vec![
3324                CssPropertyType::BorderTopLeftRadius,
3325                CssPropertyType::BorderTopRightRadius,
3326                CssPropertyType::BorderBottomLeftRadius,
3327                CssPropertyType::BorderBottomRightRadius,
3328            ]
3329        }
3330        Overflow => {
3331            vec![CssPropertyType::OverflowX, CssPropertyType::OverflowY]
3332        }
3333        Padding => {
3334            vec![
3335                CssPropertyType::PaddingTop,
3336                CssPropertyType::PaddingBottom,
3337                CssPropertyType::PaddingLeft,
3338                CssPropertyType::PaddingRight,
3339            ]
3340        }
3341        Margin => {
3342            vec![
3343                CssPropertyType::MarginTop,
3344                CssPropertyType::MarginBottom,
3345                CssPropertyType::MarginLeft,
3346                CssPropertyType::MarginRight,
3347            ]
3348        }
3349        Border => {
3350            vec![
3351                CssPropertyType::BorderTopColor,
3352                CssPropertyType::BorderRightColor,
3353                CssPropertyType::BorderLeftColor,
3354                CssPropertyType::BorderBottomColor,
3355                CssPropertyType::BorderTopStyle,
3356                CssPropertyType::BorderRightStyle,
3357                CssPropertyType::BorderLeftStyle,
3358                CssPropertyType::BorderBottomStyle,
3359                CssPropertyType::BorderTopWidth,
3360                CssPropertyType::BorderRightWidth,
3361                CssPropertyType::BorderLeftWidth,
3362                CssPropertyType::BorderBottomWidth,
3363            ]
3364        }
3365        BorderLeft => {
3366            vec![
3367                CssPropertyType::BorderLeftColor,
3368                CssPropertyType::BorderLeftStyle,
3369                CssPropertyType::BorderLeftWidth,
3370            ]
3371        }
3372        BorderRight => {
3373            vec![
3374                CssPropertyType::BorderRightColor,
3375                CssPropertyType::BorderRightStyle,
3376                CssPropertyType::BorderRightWidth,
3377            ]
3378        }
3379        BorderTop => {
3380            vec![
3381                CssPropertyType::BorderTopColor,
3382                CssPropertyType::BorderTopStyle,
3383                CssPropertyType::BorderTopWidth,
3384            ]
3385        }
3386        BorderBottom => {
3387            vec![
3388                CssPropertyType::BorderBottomColor,
3389                CssPropertyType::BorderBottomStyle,
3390                CssPropertyType::BorderBottomWidth,
3391            ]
3392        }
3393        BorderColor => {
3394            vec![
3395                CssPropertyType::BorderTopColor,
3396                CssPropertyType::BorderRightColor,
3397                CssPropertyType::BorderBottomColor,
3398                CssPropertyType::BorderLeftColor,
3399            ]
3400        }
3401        BorderStyle => {
3402            vec![
3403                CssPropertyType::BorderTopStyle,
3404                CssPropertyType::BorderRightStyle,
3405                CssPropertyType::BorderBottomStyle,
3406                CssPropertyType::BorderLeftStyle,
3407            ]
3408        }
3409        BorderWidth => {
3410            vec![
3411                CssPropertyType::BorderTopWidth,
3412                CssPropertyType::BorderRightWidth,
3413                CssPropertyType::BorderBottomWidth,
3414                CssPropertyType::BorderLeftWidth,
3415            ]
3416        }
3417        BoxShadow => {
3418            vec![
3419                CssPropertyType::BoxShadowLeft,
3420                CssPropertyType::BoxShadowRight,
3421                CssPropertyType::BoxShadowTop,
3422                CssPropertyType::BoxShadowBottom,
3423            ]
3424        }
3425        BackgroundColor => {
3426            vec![CssPropertyType::BackgroundContent]
3427        }
3428        BackgroundImage => {
3429            vec![CssPropertyType::BackgroundContent]
3430        }
3431        Background => {
3432            vec![CssPropertyType::BackgroundContent]
3433        }
3434        Flex => {
3435            vec![
3436                CssPropertyType::FlexGrow,
3437                CssPropertyType::FlexShrink,
3438                CssPropertyType::FlexBasis,
3439            ]
3440        }
3441        Grid => {
3442            vec![
3443                CssPropertyType::GridTemplateColumns,
3444                CssPropertyType::GridTemplateRows,
3445            ]
3446        }
3447        Gap => {
3448            vec![CssPropertyType::RowGap, CssPropertyType::ColumnGap]
3449        }
3450        GridGap => {
3451            vec![CssPropertyType::RowGap, CssPropertyType::ColumnGap]
3452        }
3453        Font => {
3454            vec![CssPropertyType::Font]
3455        }
3456        Columns => {
3457            vec![CssPropertyType::ColumnWidth, CssPropertyType::ColumnCount]
3458        }
3459        GridArea => {
3460            vec![CssPropertyType::GridRow, CssPropertyType::GridColumn]
3461        }
3462        ColumnRule => {
3463            vec![
3464                CssPropertyType::ColumnRuleWidth,
3465                CssPropertyType::ColumnRuleStyle,
3466                CssPropertyType::ColumnRuleColor,
3467            ]
3468        }
3469        TextBox => {
3470            vec![
3471                CssPropertyType::TextBoxTrim,
3472                CssPropertyType::TextBoxEdge,
3473            ]
3474        }
3475        // +spec:writing-modes:798cca - inset-block/inset-inline shorthand expansion
3476        // In horizontal-tb (default), block axis = vertical, inline axis = horizontal.
3477        // First value = start side, second = end side; if omitted, second defaults to first.
3478        InsetBlock => {
3479            vec![CssPropertyType::Top, CssPropertyType::Bottom]
3480        }
3481        InsetInline => {
3482            vec![CssPropertyType::Left, CssPropertyType::Right]
3483        }
3484    };
3485
3486    // For Overflow, "auto" is a typed value (LayoutOverflow::Auto), not the generic CSS keyword,
3487    // so we must not intercept it here and let the specific parser handle it below.
3488    let has_typed_auto = matches!(key, Overflow);
3489    let has_typed_none = false; // Currently no combined properties have typed "none"
3490
3491    match value {
3492        "auto" if !has_typed_auto => {
3493            return Ok(keys.into_iter().map(CssProperty::auto).collect())
3494        }
3495        "none" if !has_typed_none => {
3496            return Ok(keys.into_iter().map(CssProperty::none).collect())
3497        }
3498        "initial" => {
3499            return Ok(keys
3500                .into_iter()
3501                .map(CssProperty::initial)
3502                .collect());
3503        }
3504        "inherit" => {
3505            return Ok(keys
3506                .into_iter()
3507                .map(CssProperty::inherit)
3508                .collect());
3509        }
3510        _ => {}
3511    };
3512
3513    match key {
3514        BorderRadius => {
3515            let border_radius = parse_style_border_radius(value)?;
3516            Ok(vec![
3517                CssProperty::BorderTopLeftRadius(
3518                    StyleBorderTopLeftRadius {
3519                        inner: border_radius.top_left,
3520                    }
3521                    .into(),
3522                ),
3523                CssProperty::BorderTopRightRadius(
3524                    StyleBorderTopRightRadius {
3525                        inner: border_radius.top_right,
3526                    }
3527                    .into(),
3528                ),
3529                CssProperty::BorderBottomLeftRadius(
3530                    StyleBorderBottomLeftRadius {
3531                        inner: border_radius.bottom_left,
3532                    }
3533                    .into(),
3534                ),
3535                CssProperty::BorderBottomRightRadius(
3536                    StyleBorderBottomRightRadius {
3537                        inner: border_radius.bottom_right,
3538                    }
3539                    .into(),
3540                ),
3541            ])
3542        }
3543        // +spec:overflow:ff5ea4 - overflow shorthand sets overflow-x and overflow-y; second value copied from first if omitted
3544        Overflow => {
3545            let parts: Vec<&str> = value.split_whitespace().collect();
3546            match parts.len() {
3547                1 => {
3548                    let overflow = parse_layout_overflow(value)?;
3549                    Ok(vec![
3550                        CssProperty::OverflowX(overflow.into()),
3551                        CssProperty::OverflowY(overflow.into()),
3552                    ])
3553                }
3554                2 => {
3555                    let overflow_x = parse_layout_overflow(parts[0])?;
3556                    let overflow_y = parse_layout_overflow(parts[1])?;
3557                    Ok(vec![
3558                        CssProperty::OverflowX(overflow_x.into()),
3559                        CssProperty::OverflowY(overflow_y.into()),
3560                    ])
3561                }
3562                _ => Err(CssParsingError::InvalidValue(InvalidValueErr(value)))
3563            }
3564        }
3565        Padding => {
3566            let padding = parse_layout_padding(value)?;
3567            Ok(vec![
3568                convert_value!(padding.top, PaddingTop, LayoutPaddingTop),
3569                convert_value!(padding.bottom, PaddingBottom, LayoutPaddingBottom),
3570                convert_value!(padding.left, PaddingLeft, LayoutPaddingLeft),
3571                convert_value!(padding.right, PaddingRight, LayoutPaddingRight),
3572            ])
3573        }
3574        Margin => {
3575            let margin = parse_layout_margin(value)?;
3576            Ok(vec![
3577                convert_value!(margin.top, MarginTop, LayoutMarginTop),
3578                convert_value!(margin.bottom, MarginBottom, LayoutMarginBottom),
3579                convert_value!(margin.left, MarginLeft, LayoutMarginLeft),
3580                convert_value!(margin.right, MarginRight, LayoutMarginRight),
3581            ])
3582        }
3583        Border => {
3584            let border = parse_style_border(value)?;
3585            Ok(vec![
3586                CssProperty::BorderTopColor(
3587                    StyleBorderTopColor {
3588                        inner: border.border_color,
3589                    }
3590                    .into(),
3591                ),
3592                CssProperty::BorderRightColor(
3593                    StyleBorderRightColor {
3594                        inner: border.border_color,
3595                    }
3596                    .into(),
3597                ),
3598                CssProperty::BorderLeftColor(
3599                    StyleBorderLeftColor {
3600                        inner: border.border_color,
3601                    }
3602                    .into(),
3603                ),
3604                CssProperty::BorderBottomColor(
3605                    StyleBorderBottomColor {
3606                        inner: border.border_color,
3607                    }
3608                    .into(),
3609                ),
3610                CssProperty::BorderTopStyle(
3611                    StyleBorderTopStyle {
3612                        inner: border.border_style,
3613                    }
3614                    .into(),
3615                ),
3616                CssProperty::BorderRightStyle(
3617                    StyleBorderRightStyle {
3618                        inner: border.border_style,
3619                    }
3620                    .into(),
3621                ),
3622                CssProperty::BorderLeftStyle(
3623                    StyleBorderLeftStyle {
3624                        inner: border.border_style,
3625                    }
3626                    .into(),
3627                ),
3628                CssProperty::BorderBottomStyle(
3629                    StyleBorderBottomStyle {
3630                        inner: border.border_style,
3631                    }
3632                    .into(),
3633                ),
3634                CssProperty::BorderTopWidth(
3635                    LayoutBorderTopWidth {
3636                        inner: border.border_width,
3637                    }
3638                    .into(),
3639                ),
3640                CssProperty::BorderRightWidth(
3641                    LayoutBorderRightWidth {
3642                        inner: border.border_width,
3643                    }
3644                    .into(),
3645                ),
3646                CssProperty::BorderLeftWidth(
3647                    LayoutBorderLeftWidth {
3648                        inner: border.border_width,
3649                    }
3650                    .into(),
3651                ),
3652                CssProperty::BorderBottomWidth(
3653                    LayoutBorderBottomWidth {
3654                        inner: border.border_width,
3655                    }
3656                    .into(),
3657                ),
3658            ])
3659        }
3660        BorderLeft => {
3661            let border = parse_style_border(value)?;
3662            Ok(vec![
3663                CssProperty::BorderLeftColor(
3664                    StyleBorderLeftColor {
3665                        inner: border.border_color,
3666                    }
3667                    .into(),
3668                ),
3669                CssProperty::BorderLeftStyle(
3670                    StyleBorderLeftStyle {
3671                        inner: border.border_style,
3672                    }
3673                    .into(),
3674                ),
3675                CssProperty::BorderLeftWidth(
3676                    LayoutBorderLeftWidth {
3677                        inner: border.border_width,
3678                    }
3679                    .into(),
3680                ),
3681            ])
3682        }
3683        BorderRight => {
3684            let border = parse_style_border(value)?;
3685            Ok(vec![
3686                CssProperty::BorderRightColor(
3687                    StyleBorderRightColor {
3688                        inner: border.border_color,
3689                    }
3690                    .into(),
3691                ),
3692                CssProperty::BorderRightStyle(
3693                    StyleBorderRightStyle {
3694                        inner: border.border_style,
3695                    }
3696                    .into(),
3697                ),
3698                CssProperty::BorderRightWidth(
3699                    LayoutBorderRightWidth {
3700                        inner: border.border_width,
3701                    }
3702                    .into(),
3703                ),
3704            ])
3705        }
3706        BorderTop => {
3707            let border = parse_style_border(value)?;
3708            Ok(vec![
3709                CssProperty::BorderTopColor(
3710                    StyleBorderTopColor {
3711                        inner: border.border_color,
3712                    }
3713                    .into(),
3714                ),
3715                CssProperty::BorderTopStyle(
3716                    StyleBorderTopStyle {
3717                        inner: border.border_style,
3718                    }
3719                    .into(),
3720                ),
3721                CssProperty::BorderTopWidth(
3722                    LayoutBorderTopWidth {
3723                        inner: border.border_width,
3724                    }
3725                    .into(),
3726                ),
3727            ])
3728        }
3729        BorderBottom => {
3730            let border = parse_style_border(value)?;
3731            Ok(vec![
3732                CssProperty::BorderBottomColor(
3733                    StyleBorderBottomColor {
3734                        inner: border.border_color,
3735                    }
3736                    .into(),
3737                ),
3738                CssProperty::BorderBottomStyle(
3739                    StyleBorderBottomStyle {
3740                        inner: border.border_style,
3741                    }
3742                    .into(),
3743                ),
3744                CssProperty::BorderBottomWidth(
3745                    LayoutBorderBottomWidth {
3746                        inner: border.border_width,
3747                    }
3748                    .into(),
3749                ),
3750            ])
3751        }
3752        BorderColor => {
3753            let colors = parse_style_border_color(value)?;
3754            Ok(vec![
3755                CssProperty::BorderTopColor(
3756                    StyleBorderTopColor { inner: colors.top }.into(),
3757                ),
3758                CssProperty::BorderRightColor(
3759                    StyleBorderRightColor { inner: colors.right }.into(),
3760                ),
3761                CssProperty::BorderBottomColor(
3762                    StyleBorderBottomColor { inner: colors.bottom }.into(),
3763                ),
3764                CssProperty::BorderLeftColor(
3765                    StyleBorderLeftColor { inner: colors.left }.into(),
3766                ),
3767            ])
3768        }
3769        BorderStyle => {
3770            let styles = parse_style_border_style(value)?;
3771            Ok(vec![
3772                CssProperty::BorderTopStyle(
3773                    StyleBorderTopStyle { inner: styles.top }.into(),
3774                ),
3775                CssProperty::BorderRightStyle(
3776                    StyleBorderRightStyle { inner: styles.right }.into(),
3777                ),
3778                CssProperty::BorderBottomStyle(
3779                    StyleBorderBottomStyle { inner: styles.bottom }.into(),
3780                ),
3781                CssProperty::BorderLeftStyle(
3782                    StyleBorderLeftStyle { inner: styles.left }.into(),
3783                ),
3784            ])
3785        }
3786        BorderWidth => {
3787            let widths = parse_style_border_width(value)?;
3788            Ok(vec![
3789                CssProperty::BorderTopWidth(
3790                    LayoutBorderTopWidth { inner: widths.top }.into(),
3791                ),
3792                CssProperty::BorderRightWidth(
3793                    LayoutBorderRightWidth { inner: widths.right }.into(),
3794                ),
3795                CssProperty::BorderBottomWidth(
3796                    LayoutBorderBottomWidth { inner: widths.bottom }.into(),
3797                ),
3798                CssProperty::BorderLeftWidth(
3799                    LayoutBorderLeftWidth { inner: widths.left }.into(),
3800                ),
3801            ])
3802        }
3803        BoxShadow => {
3804            let box_shadow = parse_style_box_shadow(value)?;
3805            Ok(vec![
3806                CssProperty::BoxShadowLeft(CssPropertyValue::Exact(BoxOrStatic::heap(box_shadow))),
3807                CssProperty::BoxShadowRight(CssPropertyValue::Exact(BoxOrStatic::heap(box_shadow))),
3808                CssProperty::BoxShadowTop(CssPropertyValue::Exact(BoxOrStatic::heap(box_shadow))),
3809                CssProperty::BoxShadowBottom(CssPropertyValue::Exact(BoxOrStatic::heap(box_shadow))),
3810            ])
3811        }
3812        BackgroundColor => {
3813            let color = parse_css_color(value)?;
3814            let vec: StyleBackgroundContentVec = vec![StyleBackgroundContent::Color(color)].into();
3815            Ok(vec![CssProperty::BackgroundContent(CssPropertyValue::Exact(vec))])
3816        }
3817        BackgroundImage => {
3818            let background_content = parse_style_background_content(value)?;
3819            let vec: StyleBackgroundContentVec = vec![background_content].into();
3820            Ok(vec![CssProperty::BackgroundContent(CssPropertyValue::Exact(vec))])
3821        }
3822        Background => {
3823            let background_content = parse_style_background_content_multiple(value)?;
3824            Ok(vec![CssProperty::BackgroundContent(
3825                CssPropertyValue::Exact(background_content),
3826            )])
3827        }
3828        Flex => {
3829            // parse shorthand into grow/shrink/basis
3830            let parts: Vec<&str> = value.split_whitespace().collect();
3831            if parts.len() == 1 && parts[0] == "none" {
3832                return Ok(vec![
3833                    CssProperty::FlexGrow(
3834                        LayoutFlexGrow {
3835                            inner: crate::props::basic::length::FloatValue::const_new(0),
3836                        }
3837                        .into(),
3838                    ),
3839                    CssProperty::FlexShrink(
3840                        LayoutFlexShrink {
3841                            inner: crate::props::basic::length::FloatValue::const_new(0),
3842                        }
3843                        .into(),
3844                    ),
3845                    CssProperty::FlexBasis(LayoutFlexBasis::Auto.into()),
3846                ]);
3847            }
3848            if parts.len() == 1 {
3849                // CSS spec: flex: <number> => grow: <number>, shrink: 1, basis: 0
3850                if let Ok(g) = parse_layout_flex_grow(parts[0]) {
3851                    return Ok(vec![
3852                        CssProperty::FlexGrow(g.into()),
3853                        CssProperty::FlexShrink(
3854                            LayoutFlexShrink { inner: crate::props::basic::length::FloatValue::const_new(1) }.into(),
3855                        ),
3856                        CssProperty::FlexBasis(
3857                            LayoutFlexBasis::Exact(crate::props::basic::pixel::PixelValue::px(0.0)).into(),
3858                        ),
3859                    ]);
3860                }
3861                if let Ok(b) = parse_layout_flex_basis(parts[0]) {
3862                    return Ok(vec![CssProperty::FlexBasis(b.into())]);
3863                }
3864            }
3865            if parts.len() == 2 {
3866                // CSS spec: flex: <number> <number> => grow, shrink, basis: 0
3867                // Try grow+shrink first (two unitless numbers)
3868                if let (Ok(g), Ok(s)) = (
3869                    parse_layout_flex_grow(parts[0]),
3870                    parse_layout_flex_shrink(parts[1]),
3871                ) {
3872                    return Ok(vec![
3873                        CssProperty::FlexGrow(g.into()),
3874                        CssProperty::FlexShrink(s.into()),
3875                        CssProperty::FlexBasis(
3876                            LayoutFlexBasis::Exact(crate::props::basic::pixel::PixelValue::px(0.0)).into(),
3877                        ),
3878                    ]);
3879                }
3880                // CSS spec: flex: <number> <width> => grow, shrink: 1, basis: <width>
3881                if let (Ok(g), Ok(b)) = (
3882                    parse_layout_flex_grow(parts[0]),
3883                    parse_layout_flex_basis(parts[1]),
3884                ) {
3885                    return Ok(vec![
3886                        CssProperty::FlexGrow(g.into()),
3887                        CssProperty::FlexShrink(
3888                            LayoutFlexShrink { inner: crate::props::basic::length::FloatValue::const_new(1) }.into(),
3889                        ),
3890                        CssProperty::FlexBasis(b.into()),
3891                    ]);
3892                }
3893            }
3894            if parts.len() == 3 {
3895                let g = parse_layout_flex_grow(parts[0])?;
3896                let s = parse_layout_flex_shrink(parts[1])?;
3897                let b = parse_layout_flex_basis(parts[2])?;
3898                return Ok(vec![
3899                    CssProperty::FlexGrow(g.into()),
3900                    CssProperty::FlexShrink(s.into()),
3901                    CssProperty::FlexBasis(b.into()),
3902                ]);
3903            }
3904            Err(CssParsingError::InvalidValue(InvalidValueErr(value)))
3905        }
3906        Grid => {
3907            // minimal: try to parse as grid-template and set both columns and rows
3908            let tpl = parse_grid_template(value)?;
3909            Ok(vec![
3910                CssProperty::GridTemplateColumns(tpl.clone().into()),
3911                CssProperty::GridTemplateRows(tpl.into()),
3912            ])
3913        }
3914        Gap => {
3915            let parts: Vec<&str> = value.split_whitespace().collect();
3916            if parts.len() == 1 {
3917                let g = parse_layout_gap(parts[0])?;
3918                Ok(vec![
3919                    CssProperty::RowGap(LayoutRowGap { inner: g.inner }.into()),
3920                    CssProperty::ColumnGap(LayoutColumnGap { inner: g.inner }.into()),
3921                ])
3922            } else if parts.len() == 2 {
3923                let row = parse_layout_gap(parts[0])?;
3924                let col = parse_layout_gap(parts[1])?;
3925                Ok(vec![
3926                    CssProperty::RowGap(LayoutRowGap { inner: row.inner }.into()),
3927                    CssProperty::ColumnGap(LayoutColumnGap { inner: col.inner }.into()),
3928                ])
3929            } else {
3930                Err(CssParsingError::InvalidValue(InvalidValueErr(value)))
3931            }
3932        }
3933        GridGap => {
3934            let parts: Vec<&str> = value.split_whitespace().collect();
3935            if parts.len() == 1 {
3936                let g = parse_layout_gap(parts[0])?;
3937                Ok(vec![
3938                    CssProperty::RowGap(LayoutRowGap { inner: g.inner }.into()),
3939                    CssProperty::ColumnGap(LayoutColumnGap { inner: g.inner }.into()),
3940                ])
3941            } else if parts.len() == 2 {
3942                let row = parse_layout_gap(parts[0])?;
3943                let col = parse_layout_gap(parts[1])?;
3944                Ok(vec![
3945                    CssProperty::RowGap(LayoutRowGap { inner: row.inner }.into()),
3946                    CssProperty::ColumnGap(LayoutColumnGap { inner: col.inner }.into()),
3947                ])
3948            } else {
3949                Err(CssParsingError::InvalidValue(InvalidValueErr(value)))
3950            }
3951        }
3952        Font => {
3953            let fam = parse_style_font_family(value)?;
3954            Ok(vec![CssProperty::Font(fam.into())])
3955        }
3956        Columns => {
3957            let mut props = Vec::new();
3958            for part in value.split_whitespace() {
3959                if let Ok(width) = parse_column_width(part) {
3960                    props.push(CssProperty::ColumnWidth(width.into()));
3961                } else if let Ok(count) = parse_column_count(part) {
3962                    props.push(CssProperty::ColumnCount(count.into()));
3963                } else {
3964                    return Err(CssParsingError::InvalidValue(InvalidValueErr(value)));
3965                }
3966            }
3967            Ok(props)
3968        }
3969        GridArea => {
3970            // CSS grid-area shorthand: grid-area: <name>
3971            // Expands to grid-row: <name> / <name> and grid-column: <name> / <name>
3972            // This tells taffy to resolve the named area via NamedLineResolver.
3973            //
3974            // Full syntax: grid-area: row-start / column-start / row-end / column-end
3975            // But for named areas, typically just: grid-area: <name>
3976            let parts: Vec<&str> = value.split('/').map(|s| s.trim()).collect();
3977            let (row_start, col_start, row_end, col_end) = match parts.len() {
3978                1 => (parts[0], parts[0], parts[0], parts[0]),
3979                2 => (parts[0], parts[1], parts[0], parts[1]),
3980                3 => (parts[0], parts[1], parts[2], parts[1]),
3981                4 => (parts[0], parts[1], parts[2], parts[3]),
3982                _ => return Err(CssParsingError::InvalidValue(InvalidValueErr(value))),
3983            };
3984            let parse_line = |s: &str| -> Result<GridLine, CssParsingError<'_>> {
3985                parse_grid_line_owned(s.trim()).map_err(|_| CssParsingError::InvalidValue(InvalidValueErr(value)))
3986            };
3987            Ok(vec![
3988                CssProperty::GridRow(CssPropertyValue::Exact(GridPlacement {
3989                    grid_start: parse_line(row_start)?,
3990                    grid_end: parse_line(row_end)?,
3991                })),
3992                CssProperty::GridColumn(CssPropertyValue::Exact(GridPlacement {
3993                    grid_start: parse_line(col_start)?,
3994                    grid_end: parse_line(col_end)?,
3995                })),
3996            ])
3997        }
3998        ColumnRule => {
3999            let border = parse_style_border(value)?;
4000            Ok(vec![
4001                CssProperty::ColumnRuleWidth(
4002                    ColumnRuleWidth {
4003                        inner: border.border_width,
4004                    }
4005                    .into(),
4006                ),
4007                CssProperty::ColumnRuleStyle(
4008                    ColumnRuleStyle {
4009                        inner: border.border_style,
4010                    }
4011                    .into(),
4012                ),
4013                CssProperty::ColumnRuleColor(
4014                    ColumnRuleColor {
4015                        inner: border.border_color,
4016                    }
4017                    .into(),
4018                ),
4019            ])
4020        }
4021        // +spec:overflow:33aaf7 - text-box shorthand: "normal" sets trim=none/edge=auto,
4022        // omitting trim defaults to "both", omitting edge defaults to "auto"
4023        TextBox => {
4024            let trimmed = value.trim();
4025            if trimmed == "normal" {
4026                return Ok(vec![
4027                    CssProperty::TextBoxTrim(CssPropertyValue::Exact(StyleTextBoxTrim::None)),
4028                    CssProperty::TextBoxEdge(CssPropertyValue::Exact(StyleTextBoxEdge::Auto)),
4029                ]);
4030            }
4031            let parts: Vec<&str> = trimmed.split_whitespace().collect();
4032            let mut trim_val = None;
4033            let mut edge_val = None;
4034            for part in &parts {
4035                if let Ok(t) = parse_style_text_box_trim(part) {
4036                    trim_val = Some(t);
4037                } else if let Ok(e) = parse_style_text_box_edge(part) {
4038                    edge_val = Some(e);
4039                } else {
4040                    return Err(CssParsingError::InvalidValue(InvalidValueErr(value)));
4041                }
4042            }
4043            // Per spec: omitting trim defaults to "both" (not the initial "none")
4044            let trim = trim_val.unwrap_or(StyleTextBoxTrim::TrimBoth);
4045            // Per spec: omitting edge defaults to "auto" (the initial value)
4046            let edge = edge_val.unwrap_or(StyleTextBoxEdge::Auto);
4047            Ok(vec![
4048                CssProperty::TextBoxTrim(CssPropertyValue::Exact(trim)),
4049                CssProperty::TextBoxEdge(CssPropertyValue::Exact(edge)),
4050            ])
4051        }
4052        // +spec:writing-modes:798cca - inset-block shorthand: first value = start, second = end;
4053        // if omitted, second defaults to first. Maps to top/bottom in horizontal-tb.
4054        InsetBlock => {
4055            let parts: Vec<&str> = value.split_whitespace().collect();
4056            let start_val = parts.first().ok_or(CssParsingError::InvalidValue(InvalidValueErr(value)))?;
4057            let end_val = parts.get(1).unwrap_or(start_val);
4058            let start = parse_layout_top(start_val)?;
4059            let end = parse_layout_bottom(end_val)?;
4060            Ok(vec![
4061                CssProperty::Top(start.into()),
4062                CssProperty::Bottom(end.into()),
4063            ])
4064        }
4065        // +spec:writing-modes:798cca - inset-inline shorthand: first value = start, second = end;
4066        // if omitted, second defaults to first. Maps to left/right in horizontal-tb.
4067        InsetInline => {
4068            let parts: Vec<&str> = value.split_whitespace().collect();
4069            let start_val = parts.first().ok_or(CssParsingError::InvalidValue(InvalidValueErr(value)))?;
4070            let end_val = parts.get(1).unwrap_or(start_val);
4071            let start = parse_layout_left(start_val)?;
4072            let end = parse_layout_right(end_val)?;
4073            Ok(vec![
4074                CssProperty::Left(start.into()),
4075                CssProperty::Right(end.into()),
4076            ])
4077        }
4078    }
4079}
4080
4081// Re-add the From implementations for convenience
4082macro_rules! impl_from_css_prop {
4083    ($a:ident, $b:ident:: $enum_type:ident) => {
4084        impl From<$a> for $b {
4085            fn from(e: $a) -> Self {
4086                $b::$enum_type(CssPropertyValue::from(e))
4087            }
4088        }
4089    };
4090}
4091
4092impl_from_css_prop!(CaretColor, CssProperty::CaretColor);
4093impl_from_css_prop!(CaretWidth, CssProperty::CaretWidth);
4094impl_from_css_prop!(CaretAnimationDuration, CssProperty::CaretAnimationDuration);
4095impl_from_css_prop!(
4096    SelectionBackgroundColor,
4097    CssProperty::SelectionBackgroundColor
4098);
4099impl_from_css_prop!(SelectionColor, CssProperty::SelectionColor);
4100impl_from_css_prop!(SelectionRadius, CssProperty::SelectionRadius);
4101impl_from_css_prop!(StyleTextColor, CssProperty::TextColor);
4102impl_from_css_prop!(StyleFontSize, CssProperty::FontSize);
4103impl_from_css_prop!(StyleFontFamilyVec, CssProperty::FontFamily);
4104impl_from_css_prop!(StyleTextAlign, CssProperty::TextAlign);
4105impl_from_css_prop!(LayoutTextJustify, CssProperty::TextJustify);
4106impl_from_css_prop!(StyleVerticalAlign, CssProperty::VerticalAlign);
4107impl_from_css_prop!(StyleLetterSpacing, CssProperty::LetterSpacing);
4108impl_from_css_prop!(StyleTextIndent, CssProperty::TextIndent);
4109impl_from_css_prop!(StyleInitialLetter, CssProperty::InitialLetter);
4110impl_from_css_prop!(StyleLineClamp, CssProperty::LineClamp);
4111impl_from_css_prop!(StyleHangingPunctuation, CssProperty::HangingPunctuation);
4112impl_from_css_prop!(StyleTextCombineUpright, CssProperty::TextCombineUpright);
4113impl_from_css_prop!(StyleUnicodeBidi, CssProperty::UnicodeBidi);
4114impl_from_css_prop!(StyleTextBoxTrim, CssProperty::TextBoxTrim);
4115impl_from_css_prop!(StyleTextBoxEdge, CssProperty::TextBoxEdge);
4116impl_from_css_prop!(StyleDominantBaseline, CssProperty::DominantBaseline);
4117impl_from_css_prop!(StyleAlignmentBaseline, CssProperty::AlignmentBaseline);
4118impl_from_css_prop!(StyleInitialLetterAlign, CssProperty::InitialLetterAlign);
4119impl_from_css_prop!(StyleInitialLetterWrap, CssProperty::InitialLetterWrap);
4120impl_from_css_prop!(StyleScrollbarGutter, CssProperty::ScrollbarGutter);
4121impl_from_css_prop!(StyleOverflowClipMargin, CssProperty::OverflowClipMargin);
4122impl_from_css_prop!(StyleClipRect, CssProperty::Clip);
4123impl_from_css_prop!(StyleExclusionMargin, CssProperty::ExclusionMargin);
4124impl_from_css_prop!(StyleHyphenationLanguage, CssProperty::HyphenationLanguage);
4125impl_from_css_prop!(StyleLineHeight, CssProperty::LineHeight);
4126impl_from_css_prop!(StyleWordSpacing, CssProperty::WordSpacing);
4127impl_from_css_prop!(StyleTabSize, CssProperty::TabSize);
4128impl_from_css_prop!(StyleCursor, CssProperty::Cursor);
4129impl_from_css_prop!(LayoutDisplay, CssProperty::Display);
4130impl_from_css_prop!(LayoutFloat, CssProperty::Float);
4131impl_from_css_prop!(LayoutBoxSizing, CssProperty::BoxSizing);
4132impl_from_css_prop!(LayoutWidth, CssProperty::Width);
4133impl_from_css_prop!(LayoutHeight, CssProperty::Height);
4134impl_from_css_prop!(LayoutMinWidth, CssProperty::MinWidth);
4135impl_from_css_prop!(LayoutMinHeight, CssProperty::MinHeight);
4136impl_from_css_prop!(LayoutMaxWidth, CssProperty::MaxWidth);
4137impl_from_css_prop!(LayoutMaxHeight, CssProperty::MaxHeight);
4138impl_from_css_prop!(LayoutPosition, CssProperty::Position);
4139impl_from_css_prop!(LayoutTop, CssProperty::Top);
4140impl_from_css_prop!(LayoutRight, CssProperty::Right);
4141impl_from_css_prop!(LayoutLeft, CssProperty::Left);
4142impl_from_css_prop!(LayoutInsetBottom, CssProperty::Bottom);
4143impl_from_css_prop!(LayoutFlexWrap, CssProperty::FlexWrap);
4144impl_from_css_prop!(LayoutFlexDirection, CssProperty::FlexDirection);
4145impl_from_css_prop!(LayoutFlexGrow, CssProperty::FlexGrow);
4146impl_from_css_prop!(LayoutFlexShrink, CssProperty::FlexShrink);
4147impl_from_css_prop!(LayoutFlexBasis, CssProperty::FlexBasis);
4148impl_from_css_prop!(LayoutJustifyContent, CssProperty::JustifyContent);
4149impl_from_css_prop!(LayoutAlignItems, CssProperty::AlignItems);
4150impl_from_css_prop!(LayoutAlignContent, CssProperty::AlignContent);
4151impl_from_css_prop!(LayoutColumnGap, CssProperty::ColumnGap);
4152impl_from_css_prop!(LayoutRowGap, CssProperty::RowGap);
4153impl_from_css_prop!(LayoutGridAutoFlow, CssProperty::GridAutoFlow);
4154impl_from_css_prop!(LayoutJustifySelf, CssProperty::JustifySelf);
4155impl_from_css_prop!(LayoutJustifyItems, CssProperty::JustifyItems);
4156impl_from_css_prop!(LayoutGap, CssProperty::Gap);
4157impl_from_css_prop!(LayoutAlignSelf, CssProperty::AlignSelf);
4158impl_from_css_prop!(LayoutWritingMode, CssProperty::WritingMode);
4159impl_from_css_prop!(LayoutClear, CssProperty::Clear);
4160
4161// BackgroundContent uses the standard From pattern
4162impl_from_css_prop!(StyleBackgroundContentVec, CssProperty::BackgroundContent);
4163
4164impl_from_css_prop!(StyleBackgroundPositionVec, CssProperty::BackgroundPosition);
4165impl_from_css_prop!(StyleBackgroundSizeVec, CssProperty::BackgroundSize);
4166impl_from_css_prop!(StyleBackgroundRepeatVec, CssProperty::BackgroundRepeat);
4167impl_from_css_prop!(LayoutPaddingTop, CssProperty::PaddingTop);
4168impl_from_css_prop!(LayoutPaddingLeft, CssProperty::PaddingLeft);
4169impl_from_css_prop!(LayoutPaddingRight, CssProperty::PaddingRight);
4170impl_from_css_prop!(LayoutPaddingBottom, CssProperty::PaddingBottom);
4171impl_from_css_prop!(LayoutPaddingInlineStart, CssProperty::PaddingInlineStart);
4172impl_from_css_prop!(LayoutPaddingInlineEnd, CssProperty::PaddingInlineEnd);
4173impl_from_css_prop!(LayoutMarginTop, CssProperty::MarginTop);
4174impl_from_css_prop!(LayoutMarginLeft, CssProperty::MarginLeft);
4175impl_from_css_prop!(LayoutMarginRight, CssProperty::MarginRight);
4176impl_from_css_prop!(LayoutMarginBottom, CssProperty::MarginBottom);
4177impl_from_css_prop!(StyleBorderTopLeftRadius, CssProperty::BorderTopLeftRadius);
4178impl_from_css_prop!(StyleBorderTopRightRadius, CssProperty::BorderTopRightRadius);
4179impl_from_css_prop!(
4180    StyleBorderBottomLeftRadius,
4181    CssProperty::BorderBottomLeftRadius
4182);
4183impl_from_css_prop!(
4184    StyleBorderBottomRightRadius,
4185    CssProperty::BorderBottomRightRadius
4186);
4187impl_from_css_prop!(StyleBorderTopColor, CssProperty::BorderTopColor);
4188impl_from_css_prop!(StyleBorderRightColor, CssProperty::BorderRightColor);
4189impl_from_css_prop!(StyleBorderLeftColor, CssProperty::BorderLeftColor);
4190impl_from_css_prop!(StyleBorderBottomColor, CssProperty::BorderBottomColor);
4191impl_from_css_prop!(StyleBorderTopStyle, CssProperty::BorderTopStyle);
4192impl_from_css_prop!(StyleBorderRightStyle, CssProperty::BorderRightStyle);
4193impl_from_css_prop!(StyleBorderLeftStyle, CssProperty::BorderLeftStyle);
4194impl_from_css_prop!(StyleBorderBottomStyle, CssProperty::BorderBottomStyle);
4195impl_from_css_prop!(LayoutBorderTopWidth, CssProperty::BorderTopWidth);
4196impl_from_css_prop!(LayoutBorderRightWidth, CssProperty::BorderRightWidth);
4197impl_from_css_prop!(LayoutBorderLeftWidth, CssProperty::BorderLeftWidth);
4198impl_from_css_prop!(LayoutBorderBottomWidth, CssProperty::BorderBottomWidth);
4199impl_from_css_prop!(LayoutScrollbarWidth, CssProperty::ScrollbarWidth);
4200impl_from_css_prop!(StyleScrollbarColor, CssProperty::ScrollbarColor);
4201impl_from_css_prop!(ScrollbarVisibilityMode, CssProperty::ScrollbarVisibility);
4202impl_from_css_prop!(ScrollbarFadeDelay, CssProperty::ScrollbarFadeDelay);
4203impl_from_css_prop!(ScrollbarFadeDuration, CssProperty::ScrollbarFadeDuration);
4204impl_from_css_prop!(StyleOpacity, CssProperty::Opacity);
4205impl_from_css_prop!(StyleVisibility, CssProperty::Visibility);
4206impl_from_css_prop!(StyleTransformVec, CssProperty::Transform);
4207impl_from_css_prop!(StyleTransformOrigin, CssProperty::TransformOrigin);
4208impl_from_css_prop!(StylePerspectiveOrigin, CssProperty::PerspectiveOrigin);
4209impl_from_css_prop!(StyleBackfaceVisibility, CssProperty::BackfaceVisibility);
4210impl_from_css_prop!(StyleMixBlendMode, CssProperty::MixBlendMode);
4211impl_from_css_prop!(StyleHyphens, CssProperty::Hyphens);
4212impl_from_css_prop!(StyleWordBreak, CssProperty::WordBreak);
4213impl_from_css_prop!(StyleOverflowWrap, CssProperty::OverflowWrap);
4214impl_from_css_prop!(StyleLineBreak, CssProperty::LineBreak);
4215impl_from_css_prop!(StyleObjectFit, CssProperty::ObjectFit);
4216impl_from_css_prop!(StyleObjectPosition, CssProperty::ObjectPosition);
4217impl_from_css_prop!(StyleAspectRatio, CssProperty::AspectRatio);
4218impl_from_css_prop!(StyleTextOrientation, CssProperty::TextOrientation);
4219impl_from_css_prop!(StyleTextAlignLast, CssProperty::TextAlignLast);
4220impl_from_css_prop!(StyleDirection, CssProperty::Direction);
4221impl_from_css_prop!(StyleWhiteSpace, CssProperty::WhiteSpace);
4222impl_from_css_prop!(PageBreak, CssProperty::BreakBefore);
4223impl_from_css_prop!(BreakInside, CssProperty::BreakInside);
4224impl_from_css_prop!(Widows, CssProperty::Widows);
4225impl_from_css_prop!(Orphans, CssProperty::Orphans);
4226impl_from_css_prop!(BoxDecorationBreak, CssProperty::BoxDecorationBreak);
4227impl_from_css_prop!(ColumnCount, CssProperty::ColumnCount);
4228impl_from_css_prop!(ColumnWidth, CssProperty::ColumnWidth);
4229impl_from_css_prop!(ColumnSpan, CssProperty::ColumnSpan);
4230impl_from_css_prop!(ColumnFill, CssProperty::ColumnFill);
4231impl_from_css_prop!(ColumnRuleWidth, CssProperty::ColumnRuleWidth);
4232impl_from_css_prop!(ColumnRuleStyle, CssProperty::ColumnRuleStyle);
4233impl_from_css_prop!(ColumnRuleColor, CssProperty::ColumnRuleColor);
4234impl_from_css_prop!(FlowInto, CssProperty::FlowInto);
4235impl_from_css_prop!(FlowFrom, CssProperty::FlowFrom);
4236impl_from_css_prop!(ShapeOutside, CssProperty::ShapeOutside);
4237impl_from_css_prop!(ShapeInside, CssProperty::ShapeInside);
4238impl_from_css_prop!(ClipPath, CssProperty::ClipPath);
4239impl_from_css_prop!(ShapeMargin, CssProperty::ShapeMargin);
4240impl_from_css_prop!(ShapeImageThreshold, CssProperty::ShapeImageThreshold);
4241impl_from_css_prop!(Content, CssProperty::Content);
4242impl_from_css_prop!(CounterReset, CssProperty::CounterReset);
4243impl_from_css_prop!(CounterIncrement, CssProperty::CounterIncrement);
4244impl_from_css_prop!(StyleListStyleType, CssProperty::ListStyleType);
4245impl_from_css_prop!(StyleListStylePosition, CssProperty::ListStylePosition);
4246impl_from_css_prop!(StringSet, CssProperty::StringSet);
4247impl_from_css_prop!(LayoutTableLayout, CssProperty::TableLayout);
4248impl_from_css_prop!(StyleBorderCollapse, CssProperty::BorderCollapse);
4249impl_from_css_prop!(LayoutBorderSpacing, CssProperty::BorderSpacing);
4250impl_from_css_prop!(StyleCaptionSide, CssProperty::CaptionSide);
4251impl_from_css_prop!(StyleEmptyCells, CssProperty::EmptyCells);
4252
4253impl CssProperty {
4254    pub fn key(&self) -> &'static str {
4255        self.get_type().to_str()
4256    }
4257
4258    pub fn value(&self) -> String {
4259        match self {
4260            CssProperty::CaretColor(v) => v.get_css_value_fmt(),
4261            CssProperty::CaretWidth(v) => v.get_css_value_fmt(),
4262            CssProperty::CaretAnimationDuration(v) => v.get_css_value_fmt(),
4263            CssProperty::SelectionBackgroundColor(v) => v.get_css_value_fmt(),
4264            CssProperty::SelectionColor(v) => v.get_css_value_fmt(),
4265            CssProperty::SelectionRadius(v) => v.get_css_value_fmt(),
4266            CssProperty::TextJustify(v) => v.get_css_value_fmt(),
4267            CssProperty::TextColor(v) => v.get_css_value_fmt(),
4268            CssProperty::FontSize(v) => v.get_css_value_fmt(),
4269            CssProperty::FontFamily(v) => v.get_css_value_fmt(),
4270            CssProperty::TextAlign(v) => v.get_css_value_fmt(),
4271            CssProperty::LetterSpacing(v) => v.get_css_value_fmt(),
4272            CssProperty::TextIndent(v) => v.get_css_value_fmt(),
4273            CssProperty::InitialLetter(v) => v.get_css_value_fmt(),
4274            CssProperty::LineClamp(v) => v.get_css_value_fmt(),
4275            CssProperty::HangingPunctuation(v) => v.get_css_value_fmt(),
4276            CssProperty::TextCombineUpright(v) => v.get_css_value_fmt(),
4277            CssProperty::UnicodeBidi(v) => v.get_css_value_fmt(),
4278            CssProperty::TextBoxTrim(v) => v.get_css_value_fmt(),
4279            CssProperty::TextBoxEdge(v) => v.get_css_value_fmt(),
4280            CssProperty::DominantBaseline(v) => v.get_css_value_fmt(),
4281            CssProperty::AlignmentBaseline(v) => v.get_css_value_fmt(),
4282            CssProperty::InitialLetterAlign(v) => v.get_css_value_fmt(),
4283            CssProperty::InitialLetterWrap(v) => v.get_css_value_fmt(),
4284            CssProperty::ScrollbarGutter(v) => v.get_css_value_fmt(),
4285            CssProperty::OverflowClipMargin(v) => v.get_css_value_fmt(),
4286            CssProperty::Clip(v) => v.get_css_value_fmt(),
4287            CssProperty::ExclusionMargin(v) => v.get_css_value_fmt(),
4288            CssProperty::HyphenationLanguage(v) => v.get_css_value_fmt(),
4289            CssProperty::LineHeight(v) => v.get_css_value_fmt(),
4290            CssProperty::WordSpacing(v) => v.get_css_value_fmt(),
4291            CssProperty::TabSize(v) => v.get_css_value_fmt(),
4292            CssProperty::Cursor(v) => v.get_css_value_fmt(),
4293            CssProperty::Display(v) => v.get_css_value_fmt(),
4294            CssProperty::Float(v) => v.get_css_value_fmt(),
4295            CssProperty::BoxSizing(v) => v.get_css_value_fmt(),
4296            CssProperty::Width(v) => v.get_css_value_fmt(),
4297            CssProperty::Height(v) => v.get_css_value_fmt(),
4298            CssProperty::MinWidth(v) => v.get_css_value_fmt(),
4299            CssProperty::MinHeight(v) => v.get_css_value_fmt(),
4300            CssProperty::MaxWidth(v) => v.get_css_value_fmt(),
4301            CssProperty::MaxHeight(v) => v.get_css_value_fmt(),
4302            CssProperty::Position(v) => v.get_css_value_fmt(),
4303            CssProperty::Top(v) => v.get_css_value_fmt(),
4304            CssProperty::Right(v) => v.get_css_value_fmt(),
4305            CssProperty::Left(v) => v.get_css_value_fmt(),
4306            CssProperty::Bottom(v) => v.get_css_value_fmt(),
4307            CssProperty::ZIndex(v) => v.get_css_value_fmt(),
4308            CssProperty::FlexWrap(v) => v.get_css_value_fmt(),
4309            CssProperty::FlexDirection(v) => v.get_css_value_fmt(),
4310            CssProperty::FlexGrow(v) => v.get_css_value_fmt(),
4311            CssProperty::FlexShrink(v) => v.get_css_value_fmt(),
4312            CssProperty::FlexBasis(v) => v.get_css_value_fmt(),
4313            CssProperty::JustifyContent(v) => v.get_css_value_fmt(),
4314            CssProperty::AlignItems(v) => v.get_css_value_fmt(),
4315            CssProperty::AlignContent(v) => v.get_css_value_fmt(),
4316            CssProperty::ColumnGap(v) => v.get_css_value_fmt(),
4317            CssProperty::RowGap(v) => v.get_css_value_fmt(),
4318            CssProperty::GridTemplateColumns(v) => v.get_css_value_fmt(),
4319            CssProperty::GridTemplateRows(v) => v.get_css_value_fmt(),
4320            CssProperty::GridAutoFlow(v) => v.get_css_value_fmt(),
4321            CssProperty::JustifySelf(v) => v.get_css_value_fmt(),
4322            CssProperty::JustifyItems(v) => v.get_css_value_fmt(),
4323            CssProperty::Gap(v) => v.get_css_value_fmt(),
4324            CssProperty::GridGap(v) => v.get_css_value_fmt(),
4325            CssProperty::AlignSelf(v) => v.get_css_value_fmt(),
4326            CssProperty::Font(v) => v.get_css_value_fmt(),
4327            CssProperty::GridAutoColumns(v) => v.get_css_value_fmt(),
4328            CssProperty::GridAutoRows(v) => v.get_css_value_fmt(),
4329            CssProperty::GridColumn(v) => v.get_css_value_fmt(),
4330            CssProperty::GridRow(v) => v.get_css_value_fmt(),
4331            CssProperty::GridTemplateAreas(v) => v.get_css_value_fmt(),
4332            CssProperty::WritingMode(v) => v.get_css_value_fmt(),
4333            CssProperty::Clear(v) => v.get_css_value_fmt(),
4334            CssProperty::BackgroundContent(v) => v.get_css_value_fmt(),
4335            CssProperty::BackgroundPosition(v) => v.get_css_value_fmt(),
4336            CssProperty::BackgroundSize(v) => v.get_css_value_fmt(),
4337            CssProperty::BackgroundRepeat(v) => v.get_css_value_fmt(),
4338            CssProperty::OverflowX(v) => v.get_css_value_fmt(),
4339            CssProperty::OverflowY(v) => v.get_css_value_fmt(),
4340            CssProperty::OverflowBlock(v) => v.get_css_value_fmt(),
4341            CssProperty::OverflowInline(v) => v.get_css_value_fmt(),
4342            CssProperty::PaddingTop(v) => v.get_css_value_fmt(),
4343            CssProperty::PaddingLeft(v) => v.get_css_value_fmt(),
4344            CssProperty::PaddingRight(v) => v.get_css_value_fmt(),
4345            CssProperty::PaddingBottom(v) => v.get_css_value_fmt(),
4346            CssProperty::PaddingInlineStart(v) => v.get_css_value_fmt(),
4347            CssProperty::PaddingInlineEnd(v) => v.get_css_value_fmt(),
4348            CssProperty::MarginTop(v) => v.get_css_value_fmt(),
4349            CssProperty::MarginLeft(v) => v.get_css_value_fmt(),
4350            CssProperty::MarginRight(v) => v.get_css_value_fmt(),
4351            CssProperty::MarginBottom(v) => v.get_css_value_fmt(),
4352            CssProperty::BorderTopLeftRadius(v) => v.get_css_value_fmt(),
4353            CssProperty::BorderTopRightRadius(v) => v.get_css_value_fmt(),
4354            CssProperty::BorderBottomLeftRadius(v) => v.get_css_value_fmt(),
4355            CssProperty::BorderBottomRightRadius(v) => v.get_css_value_fmt(),
4356            CssProperty::BorderTopColor(v) => v.get_css_value_fmt(),
4357            CssProperty::BorderRightColor(v) => v.get_css_value_fmt(),
4358            CssProperty::BorderLeftColor(v) => v.get_css_value_fmt(),
4359            CssProperty::BorderBottomColor(v) => v.get_css_value_fmt(),
4360            CssProperty::BorderTopStyle(v) => v.get_css_value_fmt(),
4361            CssProperty::BorderRightStyle(v) => v.get_css_value_fmt(),
4362            CssProperty::BorderLeftStyle(v) => v.get_css_value_fmt(),
4363            CssProperty::BorderBottomStyle(v) => v.get_css_value_fmt(),
4364            CssProperty::BorderTopWidth(v) => v.get_css_value_fmt(),
4365            CssProperty::BorderRightWidth(v) => v.get_css_value_fmt(),
4366            CssProperty::BorderLeftWidth(v) => v.get_css_value_fmt(),
4367            CssProperty::BorderBottomWidth(v) => v.get_css_value_fmt(),
4368            CssProperty::BoxShadowLeft(v) => v.get_css_value_fmt(),
4369            CssProperty::BoxShadowRight(v) => v.get_css_value_fmt(),
4370            CssProperty::BoxShadowTop(v) => v.get_css_value_fmt(),
4371            CssProperty::BoxShadowBottom(v) => v.get_css_value_fmt(),
4372            CssProperty::ScrollbarTrack(v) => v.get_css_value_fmt(),
4373            CssProperty::ScrollbarThumb(v) => v.get_css_value_fmt(),
4374            CssProperty::ScrollbarButton(v) => v.get_css_value_fmt(),
4375            CssProperty::ScrollbarCorner(v) => v.get_css_value_fmt(),
4376            CssProperty::ScrollbarResizer(v) => v.get_css_value_fmt(),
4377            CssProperty::ScrollbarWidth(v) => v.get_css_value_fmt(),
4378            CssProperty::ScrollbarColor(v) => v.get_css_value_fmt(),
4379            CssProperty::ScrollbarVisibility(v) => v.get_css_value_fmt(),
4380            CssProperty::ScrollbarFadeDelay(v) => v.get_css_value_fmt(),
4381            CssProperty::ScrollbarFadeDuration(v) => v.get_css_value_fmt(),
4382            CssProperty::Opacity(v) => v.get_css_value_fmt(),
4383            CssProperty::Visibility(v) => v.get_css_value_fmt(),
4384            CssProperty::Transform(v) => v.get_css_value_fmt(),
4385            CssProperty::TransformOrigin(v) => v.get_css_value_fmt(),
4386            CssProperty::PerspectiveOrigin(v) => v.get_css_value_fmt(),
4387            CssProperty::BackfaceVisibility(v) => v.get_css_value_fmt(),
4388            CssProperty::MixBlendMode(v) => v.get_css_value_fmt(),
4389            CssProperty::Filter(v) => v.get_css_value_fmt(),
4390            CssProperty::BackdropFilter(v) => v.get_css_value_fmt(),
4391            CssProperty::TextShadow(v) => v.get_css_value_fmt(),
4392            CssProperty::Hyphens(v) => v.get_css_value_fmt(),
4393            CssProperty::WordBreak(v) => v.get_css_value_fmt(),
4394            CssProperty::OverflowWrap(v) => v.get_css_value_fmt(),
4395            CssProperty::LineBreak(v) => v.get_css_value_fmt(),
4396            CssProperty::ObjectFit(v) => v.get_css_value_fmt(),
4397            CssProperty::ObjectPosition(v) => v.get_css_value_fmt(),
4398            CssProperty::AspectRatio(v) => v.get_css_value_fmt(),
4399            CssProperty::TextOrientation(v) => v.get_css_value_fmt(),
4400            CssProperty::TextAlignLast(v) => v.get_css_value_fmt(),
4401            CssProperty::Direction(v) => v.get_css_value_fmt(),
4402            CssProperty::UserSelect(v) => v.get_css_value_fmt(),
4403            CssProperty::TextDecoration(v) => v.get_css_value_fmt(),
4404            CssProperty::WhiteSpace(v) => v.get_css_value_fmt(),
4405            CssProperty::BreakBefore(v) => v.get_css_value_fmt(),
4406            CssProperty::BreakAfter(v) => v.get_css_value_fmt(),
4407            CssProperty::BreakInside(v) => v.get_css_value_fmt(),
4408            CssProperty::Orphans(v) => v.get_css_value_fmt(),
4409            CssProperty::Widows(v) => v.get_css_value_fmt(),
4410            CssProperty::BoxDecorationBreak(v) => v.get_css_value_fmt(),
4411            CssProperty::ColumnCount(v) => v.get_css_value_fmt(),
4412            CssProperty::ColumnWidth(v) => v.get_css_value_fmt(),
4413            CssProperty::ColumnSpan(v) => v.get_css_value_fmt(),
4414            CssProperty::ColumnFill(v) => v.get_css_value_fmt(),
4415            CssProperty::ColumnRuleWidth(v) => v.get_css_value_fmt(),
4416            CssProperty::ColumnRuleStyle(v) => v.get_css_value_fmt(),
4417            CssProperty::ColumnRuleColor(v) => v.get_css_value_fmt(),
4418            CssProperty::FlowInto(v) => v.get_css_value_fmt(),
4419            CssProperty::FlowFrom(v) => v.get_css_value_fmt(),
4420            CssProperty::ShapeOutside(v) => v.get_css_value_fmt(),
4421            CssProperty::ShapeInside(v) => v.get_css_value_fmt(),
4422            CssProperty::ClipPath(v) => v.get_css_value_fmt(),
4423            CssProperty::ShapeMargin(v) => v.get_css_value_fmt(),
4424            CssProperty::ShapeImageThreshold(v) => v.get_css_value_fmt(),
4425            CssProperty::Content(v) => v.get_css_value_fmt(),
4426            CssProperty::CounterReset(v) => v.get_css_value_fmt(),
4427            CssProperty::CounterIncrement(v) => v.get_css_value_fmt(),
4428            CssProperty::ListStyleType(v) => v.get_css_value_fmt(),
4429            CssProperty::ListStylePosition(v) => v.get_css_value_fmt(),
4430            CssProperty::StringSet(v) => v.get_css_value_fmt(),
4431            CssProperty::TableLayout(v) => v.get_css_value_fmt(),
4432            CssProperty::BorderCollapse(v) => v.get_css_value_fmt(),
4433            CssProperty::BorderSpacing(v) => v.get_css_value_fmt(),
4434            CssProperty::CaptionSide(v) => v.get_css_value_fmt(),
4435            CssProperty::EmptyCells(v) => v.get_css_value_fmt(),
4436            CssProperty::FontWeight(v) => v.get_css_value_fmt(),
4437            CssProperty::FontStyle(v) => v.get_css_value_fmt(),
4438            CssProperty::VerticalAlign(v) => v.get_css_value_fmt(),
4439        }
4440    }
4441
4442    pub fn format_css(&self) -> String {
4443        format!("{}: {};", self.key(), self.value())
4444    }
4445
4446    pub fn interpolate(
4447        &self,
4448        other: &Self,
4449        t: f32,
4450        interpolate_resolver: &InterpolateResolver,
4451    ) -> Self {
4452        if t <= 0.0 {
4453            return self.clone();
4454        } else if t >= 1.0 {
4455            return other.clone();
4456        }
4457
4458        // Map from linear interpolation function to Easing curve
4459        let t: f32 = interpolate_resolver.interpolate_func.evaluate(t as f64);
4460
4461        let t = t.max(0.0).min(1.0);
4462
4463        match (self, other) {
4464            (CssProperty::TextColor(col_start), CssProperty::TextColor(col_end)) => {
4465                let col_start = col_start.get_property().copied().unwrap_or_default();
4466                let col_end = col_end.get_property().copied().unwrap_or_default();
4467                CssProperty::text_color(col_start.interpolate(&col_end, t))
4468            }
4469            (CssProperty::FontSize(fs_start), CssProperty::FontSize(fs_end)) => {
4470                let fs_start = fs_start.get_property().copied().unwrap_or_default();
4471                let fs_end = fs_end.get_property().copied().unwrap_or_default();
4472                CssProperty::font_size(fs_start.interpolate(&fs_end, t))
4473            }
4474            (CssProperty::LetterSpacing(ls_start), CssProperty::LetterSpacing(ls_end)) => {
4475                let ls_start = ls_start.get_property().copied().unwrap_or_default();
4476                let ls_end = ls_end.get_property().copied().unwrap_or_default();
4477                CssProperty::letter_spacing(ls_start.interpolate(&ls_end, t))
4478            }
4479            (CssProperty::TextIndent(ti_start), CssProperty::TextIndent(ti_end)) => {
4480                let ti_start = ti_start.get_property().copied().unwrap_or_default();
4481                let ti_end = ti_end.get_property().copied().unwrap_or_default();
4482                CssProperty::text_indent(ti_start.interpolate(&ti_end, t))
4483            }
4484            (CssProperty::LineHeight(lh_start), CssProperty::LineHeight(lh_end)) => {
4485                let lh_start = lh_start.get_property().copied().unwrap_or_default();
4486                let lh_end = lh_end.get_property().copied().unwrap_or_default();
4487                CssProperty::line_height(lh_start.interpolate(&lh_end, t))
4488            }
4489            (CssProperty::WordSpacing(ws_start), CssProperty::WordSpacing(ws_end)) => {
4490                let ws_start = ws_start.get_property().copied().unwrap_or_default();
4491                let ws_end = ws_end.get_property().copied().unwrap_or_default();
4492                CssProperty::word_spacing(ws_start.interpolate(&ws_end, t))
4493            }
4494            (CssProperty::TabSize(tw_start), CssProperty::TabSize(tw_end)) => {
4495                let tw_start = tw_start.get_property().copied().unwrap_or_default();
4496                let tw_end = tw_end.get_property().copied().unwrap_or_default();
4497                CssProperty::tab_size(tw_start.interpolate(&tw_end, t))
4498            }
4499            (CssProperty::Width(start), CssProperty::Width(end)) => {
4500                let start =
4501                    start
4502                        .get_property()
4503                        .cloned()
4504                        .unwrap_or(LayoutWidth::Px(PixelValue::px(
4505                            interpolate_resolver.current_rect_width,
4506                        )));
4507                let end = end.get_property().cloned().unwrap_or_default();
4508                CssProperty::Width(CssPropertyValue::Exact(start.interpolate(&end, t)))
4509            }
4510            (CssProperty::Height(start), CssProperty::Height(end)) => {
4511                let start =
4512                    start
4513                        .get_property()
4514                        .cloned()
4515                        .unwrap_or(LayoutHeight::Px(PixelValue::px(
4516                            interpolate_resolver.current_rect_height,
4517                        )));
4518                let end = end.get_property().cloned().unwrap_or_default();
4519                CssProperty::Height(CssPropertyValue::Exact(start.interpolate(&end, t)))
4520            }
4521            (CssProperty::MinWidth(start), CssProperty::MinWidth(end)) => {
4522                let start = start.get_property().copied().unwrap_or_default();
4523                let end = end.get_property().copied().unwrap_or_default();
4524                CssProperty::MinWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4525            }
4526            (CssProperty::MinHeight(start), CssProperty::MinHeight(end)) => {
4527                let start = start.get_property().copied().unwrap_or_default();
4528                let end = end.get_property().copied().unwrap_or_default();
4529                CssProperty::MinHeight(CssPropertyValue::Exact(start.interpolate(&end, t)))
4530            }
4531            (CssProperty::MaxWidth(start), CssProperty::MaxWidth(end)) => {
4532                let start = start.get_property().copied().unwrap_or_default();
4533                let end = end.get_property().copied().unwrap_or_default();
4534                CssProperty::MaxWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4535            }
4536            (CssProperty::MaxHeight(start), CssProperty::MaxHeight(end)) => {
4537                let start = start.get_property().copied().unwrap_or_default();
4538                let end = end.get_property().copied().unwrap_or_default();
4539                CssProperty::MaxHeight(CssPropertyValue::Exact(start.interpolate(&end, t)))
4540            }
4541            (CssProperty::Top(start), CssProperty::Top(end)) => {
4542                let start = start.get_property().copied().unwrap_or_default();
4543                let end = end.get_property().copied().unwrap_or_default();
4544                CssProperty::Top(CssPropertyValue::Exact(start.interpolate(&end, t)))
4545            }
4546            (CssProperty::Right(start), CssProperty::Right(end)) => {
4547                let start = start.get_property().copied().unwrap_or_default();
4548                let end = end.get_property().copied().unwrap_or_default();
4549                CssProperty::Right(CssPropertyValue::Exact(start.interpolate(&end, t)))
4550            }
4551            (CssProperty::Left(start), CssProperty::Left(end)) => {
4552                let start = start.get_property().copied().unwrap_or_default();
4553                let end = end.get_property().copied().unwrap_or_default();
4554                CssProperty::Left(CssPropertyValue::Exact(start.interpolate(&end, t)))
4555            }
4556            (CssProperty::Bottom(start), CssProperty::Bottom(end)) => {
4557                let start = start.get_property().copied().unwrap_or_default();
4558                let end = end.get_property().copied().unwrap_or_default();
4559                CssProperty::Bottom(CssPropertyValue::Exact(start.interpolate(&end, t)))
4560            }
4561            (CssProperty::FlexGrow(start), CssProperty::FlexGrow(end)) => {
4562                let start = start.get_property().copied().unwrap_or_default();
4563                let end = end.get_property().copied().unwrap_or_default();
4564                CssProperty::FlexGrow(CssPropertyValue::Exact(start.interpolate(&end, t)))
4565            }
4566            (CssProperty::FlexShrink(start), CssProperty::FlexShrink(end)) => {
4567                let start = start.get_property().copied().unwrap_or_default();
4568                let end = end.get_property().copied().unwrap_or_default();
4569                CssProperty::FlexShrink(CssPropertyValue::Exact(start.interpolate(&end, t)))
4570            }
4571            (CssProperty::PaddingTop(start), CssProperty::PaddingTop(end)) => {
4572                let start = start.get_property().copied().unwrap_or_default();
4573                let end = end.get_property().copied().unwrap_or_default();
4574                CssProperty::PaddingTop(CssPropertyValue::Exact(start.interpolate(&end, t)))
4575            }
4576            (CssProperty::PaddingLeft(start), CssProperty::PaddingLeft(end)) => {
4577                let start = start.get_property().copied().unwrap_or_default();
4578                let end = end.get_property().copied().unwrap_or_default();
4579                CssProperty::PaddingLeft(CssPropertyValue::Exact(start.interpolate(&end, t)))
4580            }
4581            (CssProperty::PaddingRight(start), CssProperty::PaddingRight(end)) => {
4582                let start = start.get_property().copied().unwrap_or_default();
4583                let end = end.get_property().copied().unwrap_or_default();
4584                CssProperty::PaddingRight(CssPropertyValue::Exact(start.interpolate(&end, t)))
4585            }
4586            (CssProperty::PaddingBottom(start), CssProperty::PaddingBottom(end)) => {
4587                let start = start.get_property().copied().unwrap_or_default();
4588                let end = end.get_property().copied().unwrap_or_default();
4589                CssProperty::PaddingBottom(CssPropertyValue::Exact(start.interpolate(&end, t)))
4590            }
4591            (CssProperty::MarginTop(start), CssProperty::MarginTop(end)) => {
4592                let start = start.get_property().copied().unwrap_or_default();
4593                let end = end.get_property().copied().unwrap_or_default();
4594                CssProperty::MarginTop(CssPropertyValue::Exact(start.interpolate(&end, t)))
4595            }
4596            (CssProperty::MarginLeft(start), CssProperty::MarginLeft(end)) => {
4597                let start = start.get_property().copied().unwrap_or_default();
4598                let end = end.get_property().copied().unwrap_or_default();
4599                CssProperty::MarginLeft(CssPropertyValue::Exact(start.interpolate(&end, t)))
4600            }
4601            (CssProperty::MarginRight(start), CssProperty::MarginRight(end)) => {
4602                let start = start.get_property().copied().unwrap_or_default();
4603                let end = end.get_property().copied().unwrap_or_default();
4604                CssProperty::MarginRight(CssPropertyValue::Exact(start.interpolate(&end, t)))
4605            }
4606            (CssProperty::MarginBottom(start), CssProperty::MarginBottom(end)) => {
4607                let start = start.get_property().copied().unwrap_or_default();
4608                let end = end.get_property().copied().unwrap_or_default();
4609                CssProperty::MarginBottom(CssPropertyValue::Exact(start.interpolate(&end, t)))
4610            }
4611            (CssProperty::BorderTopLeftRadius(start), CssProperty::BorderTopLeftRadius(end)) => {
4612                let start = start.get_property().copied().unwrap_or_default();
4613                let end = end.get_property().copied().unwrap_or_default();
4614                CssProperty::BorderTopLeftRadius(CssPropertyValue::Exact(
4615                    start.interpolate(&end, t),
4616                ))
4617            }
4618            (CssProperty::BorderTopRightRadius(start), CssProperty::BorderTopRightRadius(end)) => {
4619                let start = start.get_property().copied().unwrap_or_default();
4620                let end = end.get_property().copied().unwrap_or_default();
4621                CssProperty::BorderTopRightRadius(CssPropertyValue::Exact(
4622                    start.interpolate(&end, t),
4623                ))
4624            }
4625            (
4626                CssProperty::BorderBottomLeftRadius(start),
4627                CssProperty::BorderBottomLeftRadius(end),
4628            ) => {
4629                let start = start.get_property().copied().unwrap_or_default();
4630                let end = end.get_property().copied().unwrap_or_default();
4631                CssProperty::BorderBottomLeftRadius(CssPropertyValue::Exact(
4632                    start.interpolate(&end, t),
4633                ))
4634            }
4635            (
4636                CssProperty::BorderBottomRightRadius(start),
4637                CssProperty::BorderBottomRightRadius(end),
4638            ) => {
4639                let start = start.get_property().copied().unwrap_or_default();
4640                let end = end.get_property().copied().unwrap_or_default();
4641                CssProperty::BorderBottomRightRadius(CssPropertyValue::Exact(
4642                    start.interpolate(&end, t),
4643                ))
4644            }
4645            (CssProperty::BorderTopColor(start), CssProperty::BorderTopColor(end)) => {
4646                let start = start.get_property().copied().unwrap_or_default();
4647                let end = end.get_property().copied().unwrap_or_default();
4648                CssProperty::BorderTopColor(CssPropertyValue::Exact(start.interpolate(&end, t)))
4649            }
4650            (CssProperty::BorderRightColor(start), CssProperty::BorderRightColor(end)) => {
4651                let start = start.get_property().copied().unwrap_or_default();
4652                let end = end.get_property().copied().unwrap_or_default();
4653                CssProperty::BorderRightColor(CssPropertyValue::Exact(start.interpolate(&end, t)))
4654            }
4655            (CssProperty::BorderLeftColor(start), CssProperty::BorderLeftColor(end)) => {
4656                let start = start.get_property().copied().unwrap_or_default();
4657                let end = end.get_property().copied().unwrap_or_default();
4658                CssProperty::BorderLeftColor(CssPropertyValue::Exact(start.interpolate(&end, t)))
4659            }
4660            (CssProperty::BorderBottomColor(start), CssProperty::BorderBottomColor(end)) => {
4661                let start = start.get_property().copied().unwrap_or_default();
4662                let end = end.get_property().copied().unwrap_or_default();
4663                CssProperty::BorderBottomColor(CssPropertyValue::Exact(start.interpolate(&end, t)))
4664            }
4665            (CssProperty::BorderTopWidth(start), CssProperty::BorderTopWidth(end)) => {
4666                let start = start.get_property().copied().unwrap_or_default();
4667                let end = end.get_property().copied().unwrap_or_default();
4668                CssProperty::BorderTopWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4669            }
4670            (CssProperty::BorderRightWidth(start), CssProperty::BorderRightWidth(end)) => {
4671                let start = start.get_property().copied().unwrap_or_default();
4672                let end = end.get_property().copied().unwrap_or_default();
4673                CssProperty::BorderRightWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4674            }
4675            (CssProperty::BorderLeftWidth(start), CssProperty::BorderLeftWidth(end)) => {
4676                let start = start.get_property().copied().unwrap_or_default();
4677                let end = end.get_property().copied().unwrap_or_default();
4678                CssProperty::BorderLeftWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4679            }
4680            (CssProperty::BorderBottomWidth(start), CssProperty::BorderBottomWidth(end)) => {
4681                let start = start.get_property().copied().unwrap_or_default();
4682                let end = end.get_property().copied().unwrap_or_default();
4683                CssProperty::BorderBottomWidth(CssPropertyValue::Exact(start.interpolate(&end, t)))
4684            }
4685            (CssProperty::Opacity(start), CssProperty::Opacity(end)) => {
4686                let start = start.get_property().copied().unwrap_or_default();
4687                let end = end.get_property().copied().unwrap_or_default();
4688                CssProperty::Opacity(CssPropertyValue::Exact(start.interpolate(&end, t)))
4689            }
4690            (CssProperty::TransformOrigin(start), CssProperty::TransformOrigin(end)) => {
4691                let start = start.get_property().copied().unwrap_or_default();
4692                let end = end.get_property().copied().unwrap_or_default();
4693                CssProperty::TransformOrigin(CssPropertyValue::Exact(start.interpolate(&end, t)))
4694            }
4695            (CssProperty::PerspectiveOrigin(start), CssProperty::PerspectiveOrigin(end)) => {
4696                let start = start.get_property().copied().unwrap_or_default();
4697                let end = end.get_property().copied().unwrap_or_default();
4698                CssProperty::PerspectiveOrigin(CssPropertyValue::Exact(start.interpolate(&end, t)))
4699            }
4700            /*
4701            animate transform:
4702            CssProperty::Transform(CssPropertyValue<StyleTransformVec>),
4703
4704            animate box shadow:
4705            CssProperty::BoxShadowLeft(CssPropertyValue<StyleBoxShadow>),
4706            CssProperty::BoxShadowRight(CssPropertyValue<StyleBoxShadow>),
4707            CssProperty::BoxShadowTop(CssPropertyValue<StyleBoxShadow>),
4708            CssProperty::BoxShadowBottom(CssPropertyValue<StyleBoxShadow>),
4709
4710            animate background:
4711            CssProperty::BackgroundContent(CssPropertyValue<StyleBackgroundContentVec>),
4712            CssProperty::BackgroundPosition(CssPropertyValue<StyleBackgroundPositionVec>),
4713            CssProperty::BackgroundSize(CssPropertyValue<StyleBackgroundSizeVec>),
4714            */
4715            (_, _) => {
4716                // not animatable, fallback
4717                if t > 0.5 {
4718                    other.clone()
4719                } else {
4720                    self.clone()
4721                }
4722            }
4723        }
4724    }
4725
4726    /// Return the type (key) of this property as a statically typed enum
4727    pub const fn get_type(&self) -> CssPropertyType {
4728        match &self {
4729            CssProperty::CaretColor(_) => CssPropertyType::CaretColor,
4730            CssProperty::CaretWidth(_) => CssPropertyType::CaretWidth,
4731            CssProperty::CaretAnimationDuration(_) => CssPropertyType::CaretAnimationDuration,
4732            CssProperty::SelectionBackgroundColor(_) => CssPropertyType::SelectionBackgroundColor,
4733            CssProperty::SelectionColor(_) => CssPropertyType::SelectionColor,
4734            CssProperty::SelectionRadius(_) => CssPropertyType::SelectionRadius,
4735
4736            CssProperty::TextJustify(_) => CssPropertyType::TextJustify,
4737            CssProperty::TextColor(_) => CssPropertyType::TextColor,
4738            CssProperty::FontSize(_) => CssPropertyType::FontSize,
4739            CssProperty::FontFamily(_) => CssPropertyType::FontFamily,
4740            CssProperty::FontWeight(_) => CssPropertyType::FontWeight,
4741            CssProperty::FontStyle(_) => CssPropertyType::FontStyle,
4742            CssProperty::TextAlign(_) => CssPropertyType::TextAlign,
4743            CssProperty::VerticalAlign(_) => CssPropertyType::VerticalAlign,
4744            CssProperty::LetterSpacing(_) => CssPropertyType::LetterSpacing,
4745            CssProperty::TextIndent(_) => CssPropertyType::TextIndent,
4746            CssProperty::InitialLetter(_) => CssPropertyType::InitialLetter,
4747            CssProperty::LineClamp(_) => CssPropertyType::LineClamp,
4748            CssProperty::HangingPunctuation(_) => CssPropertyType::HangingPunctuation,
4749            CssProperty::TextCombineUpright(_) => CssPropertyType::TextCombineUpright,
4750            CssProperty::UnicodeBidi(_) => CssPropertyType::UnicodeBidi,
4751            CssProperty::TextBoxTrim(_) => CssPropertyType::TextBoxTrim,
4752            CssProperty::TextBoxEdge(_) => CssPropertyType::TextBoxEdge,
4753            CssProperty::DominantBaseline(_) => CssPropertyType::DominantBaseline,
4754            CssProperty::AlignmentBaseline(_) => CssPropertyType::AlignmentBaseline,
4755            CssProperty::InitialLetterAlign(_) => CssPropertyType::InitialLetterAlign,
4756            CssProperty::InitialLetterWrap(_) => CssPropertyType::InitialLetterWrap,
4757            CssProperty::ScrollbarGutter(_) => CssPropertyType::ScrollbarGutter,
4758            CssProperty::OverflowClipMargin(_) => CssPropertyType::OverflowClipMargin,
4759            CssProperty::Clip(_) => CssPropertyType::Clip,
4760            CssProperty::ExclusionMargin(_) => CssPropertyType::ExclusionMargin,
4761            CssProperty::HyphenationLanguage(_) => CssPropertyType::HyphenationLanguage,
4762            CssProperty::LineHeight(_) => CssPropertyType::LineHeight,
4763            CssProperty::WordSpacing(_) => CssPropertyType::WordSpacing,
4764            CssProperty::TabSize(_) => CssPropertyType::TabSize,
4765            CssProperty::Cursor(_) => CssPropertyType::Cursor,
4766            CssProperty::Display(_) => CssPropertyType::Display,
4767            CssProperty::Float(_) => CssPropertyType::Float,
4768            CssProperty::BoxSizing(_) => CssPropertyType::BoxSizing,
4769            CssProperty::Width(_) => CssPropertyType::Width,
4770            CssProperty::Height(_) => CssPropertyType::Height,
4771            CssProperty::MinWidth(_) => CssPropertyType::MinWidth,
4772            CssProperty::MinHeight(_) => CssPropertyType::MinHeight,
4773            CssProperty::MaxWidth(_) => CssPropertyType::MaxWidth,
4774            CssProperty::MaxHeight(_) => CssPropertyType::MaxHeight,
4775            CssProperty::Position(_) => CssPropertyType::Position,
4776            CssProperty::Top(_) => CssPropertyType::Top,
4777            CssProperty::Right(_) => CssPropertyType::Right,
4778            CssProperty::Left(_) => CssPropertyType::Left,
4779            CssProperty::Bottom(_) => CssPropertyType::Bottom,
4780            CssProperty::ZIndex(_) => CssPropertyType::ZIndex,
4781            CssProperty::FlexWrap(_) => CssPropertyType::FlexWrap,
4782            CssProperty::FlexDirection(_) => CssPropertyType::FlexDirection,
4783            CssProperty::FlexGrow(_) => CssPropertyType::FlexGrow,
4784            CssProperty::FlexShrink(_) => CssPropertyType::FlexShrink,
4785            CssProperty::FlexBasis(_) => CssPropertyType::FlexBasis,
4786            CssProperty::JustifyContent(_) => CssPropertyType::JustifyContent,
4787            CssProperty::AlignItems(_) => CssPropertyType::AlignItems,
4788            CssProperty::AlignContent(_) => CssPropertyType::AlignContent,
4789            CssProperty::ColumnGap(_) => CssPropertyType::ColumnGap,
4790            CssProperty::RowGap(_) => CssPropertyType::RowGap,
4791            CssProperty::GridTemplateColumns(_) => CssPropertyType::GridTemplateColumns,
4792            CssProperty::GridTemplateRows(_) => CssPropertyType::GridTemplateRows,
4793            CssProperty::GridAutoColumns(_) => CssPropertyType::GridAutoColumns,
4794            CssProperty::GridAutoRows(_) => CssPropertyType::GridAutoRows,
4795            CssProperty::GridColumn(_) => CssPropertyType::GridColumn,
4796            CssProperty::GridAutoFlow(_) => CssPropertyType::GridAutoFlow,
4797            CssProperty::JustifySelf(_) => CssPropertyType::JustifySelf,
4798            CssProperty::JustifyItems(_) => CssPropertyType::JustifyItems,
4799            CssProperty::Gap(_) => CssPropertyType::Gap,
4800            CssProperty::GridGap(_) => CssPropertyType::GridGap,
4801            CssProperty::AlignSelf(_) => CssPropertyType::AlignSelf,
4802            CssProperty::Font(_) => CssPropertyType::Font,
4803            CssProperty::GridRow(_) => CssPropertyType::GridRow,
4804            CssProperty::GridTemplateAreas(_) => CssPropertyType::GridTemplateAreas,
4805            CssProperty::WritingMode(_) => CssPropertyType::WritingMode,
4806            CssProperty::Clear(_) => CssPropertyType::Clear,
4807            CssProperty::BackgroundContent(_) => CssPropertyType::BackgroundContent,
4808            CssProperty::BackgroundPosition(_) => CssPropertyType::BackgroundPosition,
4809            CssProperty::BackgroundSize(_) => CssPropertyType::BackgroundSize,
4810            CssProperty::BackgroundRepeat(_) => CssPropertyType::BackgroundRepeat,
4811            CssProperty::OverflowX(_) => CssPropertyType::OverflowX,
4812            CssProperty::OverflowY(_) => CssPropertyType::OverflowY,
4813            CssProperty::OverflowBlock(_) => CssPropertyType::OverflowBlock,
4814            CssProperty::OverflowInline(_) => CssPropertyType::OverflowInline,
4815            CssProperty::PaddingTop(_) => CssPropertyType::PaddingTop,
4816            CssProperty::PaddingLeft(_) => CssPropertyType::PaddingLeft,
4817            CssProperty::PaddingRight(_) => CssPropertyType::PaddingRight,
4818            CssProperty::PaddingBottom(_) => CssPropertyType::PaddingBottom,
4819            CssProperty::PaddingInlineStart(_) => CssPropertyType::PaddingInlineStart,
4820            CssProperty::PaddingInlineEnd(_) => CssPropertyType::PaddingInlineEnd,
4821            CssProperty::MarginTop(_) => CssPropertyType::MarginTop,
4822            CssProperty::MarginLeft(_) => CssPropertyType::MarginLeft,
4823            CssProperty::MarginRight(_) => CssPropertyType::MarginRight,
4824            CssProperty::MarginBottom(_) => CssPropertyType::MarginBottom,
4825            CssProperty::BorderTopLeftRadius(_) => CssPropertyType::BorderTopLeftRadius,
4826            CssProperty::BorderTopRightRadius(_) => CssPropertyType::BorderTopRightRadius,
4827            CssProperty::BorderBottomLeftRadius(_) => CssPropertyType::BorderBottomLeftRadius,
4828            CssProperty::BorderBottomRightRadius(_) => CssPropertyType::BorderBottomRightRadius,
4829            CssProperty::BorderTopColor(_) => CssPropertyType::BorderTopColor,
4830            CssProperty::BorderRightColor(_) => CssPropertyType::BorderRightColor,
4831            CssProperty::BorderLeftColor(_) => CssPropertyType::BorderLeftColor,
4832            CssProperty::BorderBottomColor(_) => CssPropertyType::BorderBottomColor,
4833            CssProperty::BorderTopStyle(_) => CssPropertyType::BorderTopStyle,
4834            CssProperty::BorderRightStyle(_) => CssPropertyType::BorderRightStyle,
4835            CssProperty::BorderLeftStyle(_) => CssPropertyType::BorderLeftStyle,
4836            CssProperty::BorderBottomStyle(_) => CssPropertyType::BorderBottomStyle,
4837            CssProperty::BorderTopWidth(_) => CssPropertyType::BorderTopWidth,
4838            CssProperty::BorderRightWidth(_) => CssPropertyType::BorderRightWidth,
4839            CssProperty::BorderLeftWidth(_) => CssPropertyType::BorderLeftWidth,
4840            CssProperty::BorderBottomWidth(_) => CssPropertyType::BorderBottomWidth,
4841            CssProperty::BoxShadowLeft(_) => CssPropertyType::BoxShadowLeft,
4842            CssProperty::BoxShadowRight(_) => CssPropertyType::BoxShadowRight,
4843            CssProperty::BoxShadowTop(_) => CssPropertyType::BoxShadowTop,
4844            CssProperty::BoxShadowBottom(_) => CssPropertyType::BoxShadowBottom,
4845            CssProperty::ScrollbarTrack(_) => CssPropertyType::ScrollbarTrack,
4846            CssProperty::ScrollbarThumb(_) => CssPropertyType::ScrollbarThumb,
4847            CssProperty::ScrollbarButton(_) => CssPropertyType::ScrollbarButton,
4848            CssProperty::ScrollbarCorner(_) => CssPropertyType::ScrollbarCorner,
4849            CssProperty::ScrollbarResizer(_) => CssPropertyType::ScrollbarResizer,
4850            CssProperty::ScrollbarWidth(_) => CssPropertyType::ScrollbarWidth,
4851            CssProperty::ScrollbarColor(_) => CssPropertyType::ScrollbarColor,
4852            CssProperty::ScrollbarVisibility(_) => CssPropertyType::ScrollbarVisibility,
4853            CssProperty::ScrollbarFadeDelay(_) => CssPropertyType::ScrollbarFadeDelay,
4854            CssProperty::ScrollbarFadeDuration(_) => CssPropertyType::ScrollbarFadeDuration,
4855            CssProperty::Opacity(_) => CssPropertyType::Opacity,
4856            CssProperty::Visibility(_) => CssPropertyType::Visibility,
4857            CssProperty::Transform(_) => CssPropertyType::Transform,
4858            CssProperty::PerspectiveOrigin(_) => CssPropertyType::PerspectiveOrigin,
4859            CssProperty::TransformOrigin(_) => CssPropertyType::TransformOrigin,
4860            CssProperty::BackfaceVisibility(_) => CssPropertyType::BackfaceVisibility,
4861            CssProperty::MixBlendMode(_) => CssPropertyType::MixBlendMode,
4862            CssProperty::Filter(_) => CssPropertyType::Filter,
4863            CssProperty::BackdropFilter(_) => CssPropertyType::BackdropFilter,
4864            CssProperty::TextShadow(_) => CssPropertyType::TextShadow,
4865            CssProperty::WhiteSpace(_) => CssPropertyType::WhiteSpace,
4866            CssProperty::Hyphens(_) => CssPropertyType::Hyphens,
4867            CssProperty::WordBreak(_) => CssPropertyType::WordBreak,
4868            CssProperty::OverflowWrap(_) => CssPropertyType::OverflowWrap,
4869            CssProperty::LineBreak(_) => CssPropertyType::LineBreak,
4870            CssProperty::ObjectFit(_) => CssPropertyType::ObjectFit,
4871            CssProperty::ObjectPosition(_) => CssPropertyType::ObjectPosition,
4872            CssProperty::AspectRatio(_) => CssPropertyType::AspectRatio,
4873            CssProperty::TextOrientation(_) => CssPropertyType::TextOrientation,
4874            CssProperty::TextAlignLast(_) => CssPropertyType::TextAlignLast,
4875            CssProperty::Direction(_) => CssPropertyType::Direction,
4876            CssProperty::UserSelect(_) => CssPropertyType::UserSelect,
4877            CssProperty::TextDecoration(_) => CssPropertyType::TextDecoration,
4878            CssProperty::BreakBefore(_) => CssPropertyType::BreakBefore,
4879            CssProperty::BreakAfter(_) => CssPropertyType::BreakAfter,
4880            CssProperty::BreakInside(_) => CssPropertyType::BreakInside,
4881            CssProperty::Orphans(_) => CssPropertyType::Orphans,
4882            CssProperty::Widows(_) => CssPropertyType::Widows,
4883            CssProperty::BoxDecorationBreak(_) => CssPropertyType::BoxDecorationBreak,
4884            CssProperty::ColumnCount(_) => CssPropertyType::ColumnCount,
4885            CssProperty::ColumnWidth(_) => CssPropertyType::ColumnWidth,
4886            CssProperty::ColumnSpan(_) => CssPropertyType::ColumnSpan,
4887            CssProperty::ColumnFill(_) => CssPropertyType::ColumnFill,
4888            CssProperty::ColumnRuleWidth(_) => CssPropertyType::ColumnRuleWidth,
4889            CssProperty::ColumnRuleStyle(_) => CssPropertyType::ColumnRuleStyle,
4890            CssProperty::ColumnRuleColor(_) => CssPropertyType::ColumnRuleColor,
4891            CssProperty::FlowInto(_) => CssPropertyType::FlowInto,
4892            CssProperty::FlowFrom(_) => CssPropertyType::FlowFrom,
4893            CssProperty::ShapeOutside(_) => CssPropertyType::ShapeOutside,
4894            CssProperty::ShapeInside(_) => CssPropertyType::ShapeInside,
4895            CssProperty::ClipPath(_) => CssPropertyType::ClipPath,
4896            CssProperty::ShapeMargin(_) => CssPropertyType::ShapeMargin,
4897            CssProperty::ShapeImageThreshold(_) => CssPropertyType::ShapeImageThreshold,
4898            CssProperty::Content(_) => CssPropertyType::Content,
4899            CssProperty::CounterReset(_) => CssPropertyType::CounterReset,
4900            CssProperty::CounterIncrement(_) => CssPropertyType::CounterIncrement,
4901            CssProperty::ListStyleType(_) => CssPropertyType::ListStyleType,
4902            CssProperty::ListStylePosition(_) => CssPropertyType::ListStylePosition,
4903            CssProperty::StringSet(_) => CssPropertyType::StringSet,
4904            CssProperty::TableLayout(_) => CssPropertyType::TableLayout,
4905            CssProperty::BorderCollapse(_) => CssPropertyType::BorderCollapse,
4906            CssProperty::BorderSpacing(_) => CssPropertyType::BorderSpacing,
4907            CssProperty::CaptionSide(_) => CssPropertyType::CaptionSide,
4908            CssProperty::EmptyCells(_) => CssPropertyType::EmptyCells,
4909            CssProperty::FontWeight(_) => CssPropertyType::FontWeight,
4910            CssProperty::FontStyle(_) => CssPropertyType::FontStyle,
4911        }
4912    }
4913
4914    // const constructors for easier API access
4915
4916    pub fn none(prop_type: CssPropertyType) -> Self {
4917        css_property_from_type!(prop_type, None)
4918    }
4919    pub fn auto(prop_type: CssPropertyType) -> Self {
4920        css_property_from_type!(prop_type, Auto)
4921    }
4922    pub fn initial(prop_type: CssPropertyType) -> Self {
4923        css_property_from_type!(prop_type, Initial)
4924    }
4925    pub fn inherit(prop_type: CssPropertyType) -> Self {
4926        css_property_from_type!(prop_type, Inherit)
4927    }
4928
4929    pub const fn text_color(input: StyleTextColor) -> Self {
4930        CssProperty::TextColor(CssPropertyValue::Exact(input))
4931    }
4932    pub const fn font_size(input: StyleFontSize) -> Self {
4933        CssProperty::FontSize(CssPropertyValue::Exact(input))
4934    }
4935    pub const fn font_family(input: StyleFontFamilyVec) -> Self {
4936        CssProperty::FontFamily(CssPropertyValue::Exact(input))
4937    }
4938    pub const fn font_weight(input: StyleFontWeight) -> Self {
4939        CssProperty::FontWeight(CssPropertyValue::Exact(input))
4940    }
4941    pub const fn font_style(input: StyleFontStyle) -> Self {
4942        CssProperty::FontStyle(CssPropertyValue::Exact(input))
4943    }
4944    pub const fn text_align(input: StyleTextAlign) -> Self {
4945        CssProperty::TextAlign(CssPropertyValue::Exact(input))
4946    }
4947    pub const fn text_justify(input: LayoutTextJustify) -> Self {
4948        CssProperty::TextJustify(CssPropertyValue::Exact(input))
4949    }
4950    pub const fn vertical_align(input: StyleVerticalAlign) -> Self {
4951        CssProperty::VerticalAlign(CssPropertyValue::Exact(input))
4952    }
4953    pub const fn letter_spacing(input: StyleLetterSpacing) -> Self {
4954        CssProperty::LetterSpacing(CssPropertyValue::Exact(input))
4955    }
4956    pub const fn text_indent(input: StyleTextIndent) -> Self {
4957        CssProperty::TextIndent(CssPropertyValue::Exact(input))
4958    }
4959    pub const fn line_height(input: StyleLineHeight) -> Self {
4960        CssProperty::LineHeight(CssPropertyValue::Exact(input))
4961    }
4962    pub const fn word_spacing(input: StyleWordSpacing) -> Self {
4963        CssProperty::WordSpacing(CssPropertyValue::Exact(input))
4964    }
4965    pub const fn tab_size(input: StyleTabSize) -> Self {
4966        CssProperty::TabSize(CssPropertyValue::Exact(input))
4967    }
4968    pub const fn cursor(input: StyleCursor) -> Self {
4969        CssProperty::Cursor(CssPropertyValue::Exact(input))
4970    }
4971    pub const fn user_select(input: StyleUserSelect) -> Self {
4972        CssProperty::UserSelect(CssPropertyValue::Exact(input))
4973    }
4974    pub const fn text_decoration(input: StyleTextDecoration) -> Self {
4975        CssProperty::TextDecoration(CssPropertyValue::Exact(input))
4976    }
4977    pub const fn display(input: LayoutDisplay) -> Self {
4978        CssProperty::Display(CssPropertyValue::Exact(input))
4979    }
4980    pub const fn box_sizing(input: LayoutBoxSizing) -> Self {
4981        CssProperty::BoxSizing(CssPropertyValue::Exact(input))
4982    }
4983    pub const fn width(input: LayoutWidth) -> Self {
4984        CssProperty::Width(CssPropertyValue::Exact(input))
4985    }
4986    pub const fn height(input: LayoutHeight) -> Self {
4987        CssProperty::Height(CssPropertyValue::Exact(input))
4988    }
4989    pub const fn min_width(input: LayoutMinWidth) -> Self {
4990        CssProperty::MinWidth(CssPropertyValue::Exact(input))
4991    }
4992    pub const fn caret_color(input: CaretColor) -> Self {
4993        CssProperty::CaretColor(CssPropertyValue::Exact(input))
4994    }
4995    pub const fn caret_width(input: CaretWidth) -> Self {
4996        CssProperty::CaretWidth(CssPropertyValue::Exact(input))
4997    }
4998    pub const fn caret_animation_duration(input: CaretAnimationDuration) -> Self {
4999        CssProperty::CaretAnimationDuration(CssPropertyValue::Exact(input))
5000    }
5001    pub const fn selection_background_color(input: SelectionBackgroundColor) -> Self {
5002        CssProperty::SelectionBackgroundColor(CssPropertyValue::Exact(input))
5003    }
5004    pub const fn selection_color(input: SelectionColor) -> Self {
5005        CssProperty::SelectionColor(CssPropertyValue::Exact(input))
5006    }
5007    pub const fn min_height(input: LayoutMinHeight) -> Self {
5008        CssProperty::MinHeight(CssPropertyValue::Exact(input))
5009    }
5010    pub const fn max_width(input: LayoutMaxWidth) -> Self {
5011        CssProperty::MaxWidth(CssPropertyValue::Exact(input))
5012    }
5013    pub const fn max_height(input: LayoutMaxHeight) -> Self {
5014        CssProperty::MaxHeight(CssPropertyValue::Exact(input))
5015    }
5016    pub const fn position(input: LayoutPosition) -> Self {
5017        CssProperty::Position(CssPropertyValue::Exact(input))
5018    }
5019    pub const fn top(input: LayoutTop) -> Self {
5020        CssProperty::Top(CssPropertyValue::Exact(input))
5021    }
5022    pub const fn right(input: LayoutRight) -> Self {
5023        CssProperty::Right(CssPropertyValue::Exact(input))
5024    }
5025    pub const fn left(input: LayoutLeft) -> Self {
5026        CssProperty::Left(CssPropertyValue::Exact(input))
5027    }
5028    pub const fn bottom(input: LayoutInsetBottom) -> Self {
5029        CssProperty::Bottom(CssPropertyValue::Exact(input))
5030    }
5031    pub const fn z_index(input: LayoutZIndex) -> Self {
5032        CssProperty::ZIndex(CssPropertyValue::Exact(input))
5033    }
5034    pub const fn flex_wrap(input: LayoutFlexWrap) -> Self {
5035        CssProperty::FlexWrap(CssPropertyValue::Exact(input))
5036    }
5037    pub const fn flex_direction(input: LayoutFlexDirection) -> Self {
5038        CssProperty::FlexDirection(CssPropertyValue::Exact(input))
5039    }
5040    pub const fn flex_grow(input: LayoutFlexGrow) -> Self {
5041        CssProperty::FlexGrow(CssPropertyValue::Exact(input))
5042    }
5043    pub const fn flex_shrink(input: LayoutFlexShrink) -> Self {
5044        CssProperty::FlexShrink(CssPropertyValue::Exact(input))
5045    }
5046    pub const fn justify_content(input: LayoutJustifyContent) -> Self {
5047        CssProperty::JustifyContent(CssPropertyValue::Exact(input))
5048    }
5049    pub const fn grid_auto_flow(input: LayoutGridAutoFlow) -> Self {
5050        CssProperty::GridAutoFlow(CssPropertyValue::Exact(input))
5051    }
5052    pub const fn justify_self(input: LayoutJustifySelf) -> Self {
5053        CssProperty::JustifySelf(CssPropertyValue::Exact(input))
5054    }
5055    pub const fn justify_items(input: LayoutJustifyItems) -> Self {
5056        CssProperty::JustifyItems(CssPropertyValue::Exact(input))
5057    }
5058    pub const fn gap(input: LayoutGap) -> Self {
5059        CssProperty::Gap(CssPropertyValue::Exact(input))
5060    }
5061    pub const fn grid_gap(input: LayoutGap) -> Self {
5062        CssProperty::GridGap(CssPropertyValue::Exact(input))
5063    }
5064    pub const fn align_self(input: LayoutAlignSelf) -> Self {
5065        CssProperty::AlignSelf(CssPropertyValue::Exact(input))
5066    }
5067    pub const fn font(input: StyleFontFamilyVec) -> Self {
5068        CssProperty::Font(StyleFontValue::Exact(input))
5069    }
5070    pub const fn align_items(input: LayoutAlignItems) -> Self {
5071        CssProperty::AlignItems(CssPropertyValue::Exact(input))
5072    }
5073    pub const fn align_content(input: LayoutAlignContent) -> Self {
5074        CssProperty::AlignContent(CssPropertyValue::Exact(input))
5075    }
5076    pub fn background_content(input: StyleBackgroundContentVec) -> Self {
5077        CssProperty::BackgroundContent(CssPropertyValue::Exact(input))
5078    }
5079    pub const fn background_position(input: StyleBackgroundPositionVec) -> Self {
5080        CssProperty::BackgroundPosition(CssPropertyValue::Exact(input))
5081    }
5082    pub const fn background_size(input: StyleBackgroundSizeVec) -> Self {
5083        CssProperty::BackgroundSize(CssPropertyValue::Exact(input))
5084    }
5085    pub const fn background_repeat(input: StyleBackgroundRepeatVec) -> Self {
5086        CssProperty::BackgroundRepeat(CssPropertyValue::Exact(input))
5087    }
5088    pub const fn overflow_x(input: LayoutOverflow) -> Self {
5089        CssProperty::OverflowX(CssPropertyValue::Exact(input))
5090    }
5091    pub const fn overflow_y(input: LayoutOverflow) -> Self {
5092        CssProperty::OverflowY(CssPropertyValue::Exact(input))
5093    }
5094    pub const fn overflow_block(input: LayoutOverflow) -> Self {
5095        CssProperty::OverflowBlock(CssPropertyValue::Exact(input))
5096    }
5097    pub const fn overflow_inline(input: LayoutOverflow) -> Self {
5098        CssProperty::OverflowInline(CssPropertyValue::Exact(input))
5099    }
5100    pub const fn padding_top(input: LayoutPaddingTop) -> Self {
5101        CssProperty::PaddingTop(CssPropertyValue::Exact(input))
5102    }
5103    pub const fn padding_left(input: LayoutPaddingLeft) -> Self {
5104        CssProperty::PaddingLeft(CssPropertyValue::Exact(input))
5105    }
5106    pub const fn padding_right(input: LayoutPaddingRight) -> Self {
5107        CssProperty::PaddingRight(CssPropertyValue::Exact(input))
5108    }
5109    pub const fn padding_bottom(input: LayoutPaddingBottom) -> Self {
5110        CssProperty::PaddingBottom(CssPropertyValue::Exact(input))
5111    }
5112    pub const fn margin_top(input: LayoutMarginTop) -> Self {
5113        CssProperty::MarginTop(CssPropertyValue::Exact(input))
5114    }
5115    pub const fn margin_left(input: LayoutMarginLeft) -> Self {
5116        CssProperty::MarginLeft(CssPropertyValue::Exact(input))
5117    }
5118    pub const fn margin_right(input: LayoutMarginRight) -> Self {
5119        CssProperty::MarginRight(CssPropertyValue::Exact(input))
5120    }
5121    pub const fn margin_bottom(input: LayoutMarginBottom) -> Self {
5122        CssProperty::MarginBottom(CssPropertyValue::Exact(input))
5123    }
5124    pub const fn border_top_left_radius(input: StyleBorderTopLeftRadius) -> Self {
5125        CssProperty::BorderTopLeftRadius(CssPropertyValue::Exact(input))
5126    }
5127    pub const fn border_top_right_radius(input: StyleBorderTopRightRadius) -> Self {
5128        CssProperty::BorderTopRightRadius(CssPropertyValue::Exact(input))
5129    }
5130    pub const fn border_bottom_left_radius(input: StyleBorderBottomLeftRadius) -> Self {
5131        CssProperty::BorderBottomLeftRadius(CssPropertyValue::Exact(input))
5132    }
5133    pub const fn border_bottom_right_radius(input: StyleBorderBottomRightRadius) -> Self {
5134        CssProperty::BorderBottomRightRadius(CssPropertyValue::Exact(input))
5135    }
5136    pub const fn border_top_color(input: StyleBorderTopColor) -> Self {
5137        CssProperty::BorderTopColor(CssPropertyValue::Exact(input))
5138    }
5139    pub const fn border_right_color(input: StyleBorderRightColor) -> Self {
5140        CssProperty::BorderRightColor(CssPropertyValue::Exact(input))
5141    }
5142    pub const fn border_left_color(input: StyleBorderLeftColor) -> Self {
5143        CssProperty::BorderLeftColor(CssPropertyValue::Exact(input))
5144    }
5145    pub const fn border_bottom_color(input: StyleBorderBottomColor) -> Self {
5146        CssProperty::BorderBottomColor(CssPropertyValue::Exact(input))
5147    }
5148    pub const fn border_top_style(input: StyleBorderTopStyle) -> Self {
5149        CssProperty::BorderTopStyle(CssPropertyValue::Exact(input))
5150    }
5151    pub const fn border_right_style(input: StyleBorderRightStyle) -> Self {
5152        CssProperty::BorderRightStyle(CssPropertyValue::Exact(input))
5153    }
5154    pub const fn border_left_style(input: StyleBorderLeftStyle) -> Self {
5155        CssProperty::BorderLeftStyle(CssPropertyValue::Exact(input))
5156    }
5157    pub const fn border_bottom_style(input: StyleBorderBottomStyle) -> Self {
5158        CssProperty::BorderBottomStyle(CssPropertyValue::Exact(input))
5159    }
5160    pub const fn border_top_width(input: LayoutBorderTopWidth) -> Self {
5161        CssProperty::BorderTopWidth(CssPropertyValue::Exact(input))
5162    }
5163    pub const fn border_right_width(input: LayoutBorderRightWidth) -> Self {
5164        CssProperty::BorderRightWidth(CssPropertyValue::Exact(input))
5165    }
5166    pub const fn border_left_width(input: LayoutBorderLeftWidth) -> Self {
5167        CssProperty::BorderLeftWidth(CssPropertyValue::Exact(input))
5168    }
5169    pub const fn border_bottom_width(input: LayoutBorderBottomWidth) -> Self {
5170        CssProperty::BorderBottomWidth(CssPropertyValue::Exact(input))
5171    }
5172    pub fn box_shadow_left(input: StyleBoxShadow) -> Self {
5173        CssProperty::BoxShadowLeft(CssPropertyValue::Exact(BoxOrStatic::heap(input)))
5174    }
5175    pub fn box_shadow_right(input: StyleBoxShadow) -> Self {
5176        CssProperty::BoxShadowRight(CssPropertyValue::Exact(BoxOrStatic::heap(input)))
5177    }
5178    pub fn box_shadow_top(input: StyleBoxShadow) -> Self {
5179        CssProperty::BoxShadowTop(CssPropertyValue::Exact(BoxOrStatic::heap(input)))
5180    }
5181    pub fn box_shadow_bottom(input: StyleBoxShadow) -> Self {
5182        CssProperty::BoxShadowBottom(CssPropertyValue::Exact(BoxOrStatic::heap(input)))
5183    }
5184    pub const fn opacity(input: StyleOpacity) -> Self {
5185        CssProperty::Opacity(CssPropertyValue::Exact(input))
5186    }
5187    pub const fn visibility(input: StyleVisibility) -> Self {
5188        CssProperty::Visibility(CssPropertyValue::Exact(input))
5189    }
5190    pub const fn transform(input: StyleTransformVec) -> Self {
5191        CssProperty::Transform(CssPropertyValue::Exact(input))
5192    }
5193    pub const fn transform_origin(input: StyleTransformOrigin) -> Self {
5194        CssProperty::TransformOrigin(CssPropertyValue::Exact(input))
5195    }
5196    pub const fn perspective_origin(input: StylePerspectiveOrigin) -> Self {
5197        CssProperty::PerspectiveOrigin(CssPropertyValue::Exact(input))
5198    }
5199    pub const fn backface_visibility(input: StyleBackfaceVisibility) -> Self {
5200        CssProperty::BackfaceVisibility(CssPropertyValue::Exact(input))
5201    }
5202
5203    // New DTP const fn constructors
5204    pub const fn break_before(input: PageBreak) -> Self {
5205        CssProperty::BreakBefore(CssPropertyValue::Exact(input))
5206    }
5207    pub const fn break_after(input: PageBreak) -> Self {
5208        CssProperty::BreakAfter(CssPropertyValue::Exact(input))
5209    }
5210    pub const fn break_inside(input: BreakInside) -> Self {
5211        CssProperty::BreakInside(CssPropertyValue::Exact(input))
5212    }
5213    pub const fn orphans(input: Orphans) -> Self {
5214        CssProperty::Orphans(CssPropertyValue::Exact(input))
5215    }
5216    pub const fn widows(input: Widows) -> Self {
5217        CssProperty::Widows(CssPropertyValue::Exact(input))
5218    }
5219    pub const fn box_decoration_break(input: BoxDecorationBreak) -> Self {
5220        CssProperty::BoxDecorationBreak(CssPropertyValue::Exact(input))
5221    }
5222    pub const fn column_count(input: ColumnCount) -> Self {
5223        CssProperty::ColumnCount(CssPropertyValue::Exact(input))
5224    }
5225    pub const fn column_width(input: ColumnWidth) -> Self {
5226        CssProperty::ColumnWidth(CssPropertyValue::Exact(input))
5227    }
5228    pub const fn column_span(input: ColumnSpan) -> Self {
5229        CssProperty::ColumnSpan(CssPropertyValue::Exact(input))
5230    }
5231    pub const fn column_fill(input: ColumnFill) -> Self {
5232        CssProperty::ColumnFill(CssPropertyValue::Exact(input))
5233    }
5234    pub const fn column_rule_width(input: ColumnRuleWidth) -> Self {
5235        CssProperty::ColumnRuleWidth(CssPropertyValue::Exact(input))
5236    }
5237    pub const fn column_rule_style(input: ColumnRuleStyle) -> Self {
5238        CssProperty::ColumnRuleStyle(CssPropertyValue::Exact(input))
5239    }
5240    pub const fn column_rule_color(input: ColumnRuleColor) -> Self {
5241        CssProperty::ColumnRuleColor(CssPropertyValue::Exact(input))
5242    }
5243    pub const fn flow_into(input: FlowInto) -> Self {
5244        CssProperty::FlowInto(CssPropertyValue::Exact(input))
5245    }
5246    pub const fn flow_from(input: FlowFrom) -> Self {
5247        CssProperty::FlowFrom(CssPropertyValue::Exact(input))
5248    }
5249    pub fn shape_outside(input: ShapeOutside) -> Self {
5250        CssProperty::ShapeOutside(CssPropertyValue::Exact(input))
5251    }
5252    pub fn shape_inside(input: ShapeInside) -> Self {
5253        CssProperty::ShapeInside(CssPropertyValue::Exact(input))
5254    }
5255    pub fn clip_path(input: ClipPath) -> Self {
5256        CssProperty::ClipPath(CssPropertyValue::Exact(input))
5257    }
5258    pub const fn shape_margin(input: ShapeMargin) -> Self {
5259        CssProperty::ShapeMargin(CssPropertyValue::Exact(input))
5260    }
5261    pub const fn shape_image_threshold(input: ShapeImageThreshold) -> Self {
5262        CssProperty::ShapeImageThreshold(CssPropertyValue::Exact(input))
5263    }
5264    pub const fn content(input: Content) -> Self {
5265        CssProperty::Content(CssPropertyValue::Exact(input))
5266    }
5267    pub const fn counter_reset(input: CounterReset) -> Self {
5268        CssProperty::CounterReset(CssPropertyValue::Exact(input))
5269    }
5270    pub const fn counter_increment(input: CounterIncrement) -> Self {
5271        CssProperty::CounterIncrement(CssPropertyValue::Exact(input))
5272    }
5273    pub const fn list_style_type(input: StyleListStyleType) -> Self {
5274        CssProperty::ListStyleType(CssPropertyValue::Exact(input))
5275    }
5276    pub const fn list_style_position(input: StyleListStylePosition) -> Self {
5277        CssProperty::ListStylePosition(CssPropertyValue::Exact(input))
5278    }
5279    pub const fn string_set(input: StringSet) -> Self {
5280        CssProperty::StringSet(CssPropertyValue::Exact(input))
5281    }
5282    pub const fn table_layout(input: LayoutTableLayout) -> Self {
5283        CssProperty::TableLayout(CssPropertyValue::Exact(input))
5284    }
5285    pub const fn border_collapse(input: StyleBorderCollapse) -> Self {
5286        CssProperty::BorderCollapse(CssPropertyValue::Exact(input))
5287    }
5288    pub const fn border_spacing(input: LayoutBorderSpacing) -> Self {
5289        CssProperty::BorderSpacing(CssPropertyValue::Exact(input))
5290    }
5291    pub const fn caption_side(input: StyleCaptionSide) -> Self {
5292        CssProperty::CaptionSide(CssPropertyValue::Exact(input))
5293    }
5294    pub const fn empty_cells(input: StyleEmptyCells) -> Self {
5295        CssProperty::EmptyCells(CssPropertyValue::Exact(input))
5296    }
5297
5298    pub const fn as_z_index(&self) -> Option<&LayoutZIndexValue> {
5299        match self {
5300            CssProperty::ZIndex(f) => Some(f),
5301            _ => None,
5302        }
5303    }
5304
5305    pub const fn as_flex_basis(&self) -> Option<&LayoutFlexBasisValue> {
5306        match self {
5307            CssProperty::FlexBasis(f) => Some(f),
5308            _ => None,
5309        }
5310    }
5311
5312    pub const fn as_column_gap(&self) -> Option<&LayoutColumnGapValue> {
5313        match self {
5314            CssProperty::ColumnGap(f) => Some(f),
5315            _ => None,
5316        }
5317    }
5318
5319    pub const fn as_row_gap(&self) -> Option<&LayoutRowGapValue> {
5320        match self {
5321            CssProperty::RowGap(f) => Some(f),
5322            _ => None,
5323        }
5324    }
5325
5326    pub const fn as_grid_template_columns(&self) -> Option<&LayoutGridTemplateColumnsValue> {
5327        match self {
5328            CssProperty::GridTemplateColumns(f) => Some(f),
5329            _ => None,
5330        }
5331    }
5332
5333    pub const fn as_grid_template_rows(&self) -> Option<&LayoutGridTemplateRowsValue> {
5334        match self {
5335            CssProperty::GridTemplateRows(f) => Some(f),
5336            _ => None,
5337        }
5338    }
5339
5340    pub const fn as_grid_auto_columns(&self) -> Option<&LayoutGridAutoColumnsValue> {
5341        match self {
5342            CssProperty::GridAutoColumns(f) => Some(f),
5343            _ => None,
5344        }
5345    }
5346
5347    pub const fn as_grid_auto_rows(&self) -> Option<&LayoutGridAutoRowsValue> {
5348        match self {
5349            CssProperty::GridAutoRows(f) => Some(f),
5350            _ => None,
5351        }
5352    }
5353
5354    pub fn as_grid_column(&self) -> Option<&LayoutGridColumnValue> {
5355        match self {
5356            CssProperty::GridColumn(f) => Some(f),
5357            _ => None,
5358        }
5359    }
5360
5361    pub fn as_grid_row(&self) -> Option<&LayoutGridRowValue> {
5362        match self {
5363            CssProperty::GridRow(f) => Some(f),
5364            _ => None,
5365        }
5366    }
5367
5368    pub const fn as_writing_mode(&self) -> Option<&LayoutWritingModeValue> {
5369        match self {
5370            CssProperty::WritingMode(f) => Some(f),
5371            _ => None,
5372        }
5373    }
5374
5375    pub const fn as_clear(&self) -> Option<&LayoutClearValue> {
5376        match self {
5377            CssProperty::Clear(f) => Some(f),
5378            _ => None,
5379        }
5380    }
5381
5382    pub fn as_scrollbar_track(&self) -> Option<&StyleBackgroundContentValue> {
5383        match self {
5384            CssProperty::ScrollbarTrack(f) => Some(f),
5385            _ => None,
5386        }
5387    }
5388
5389    pub fn as_scrollbar_thumb(&self) -> Option<&StyleBackgroundContentValue> {
5390        match self {
5391            CssProperty::ScrollbarThumb(f) => Some(f),
5392            _ => None,
5393        }
5394    }
5395
5396    pub fn as_scrollbar_button(&self) -> Option<&StyleBackgroundContentValue> {
5397        match self {
5398            CssProperty::ScrollbarButton(f) => Some(f),
5399            _ => None,
5400        }
5401    }
5402
5403    pub fn as_scrollbar_corner(&self) -> Option<&StyleBackgroundContentValue> {
5404        match self {
5405            CssProperty::ScrollbarCorner(f) => Some(f),
5406            _ => None,
5407        }
5408    }
5409
5410    pub fn as_scrollbar_resizer(&self) -> Option<&StyleBackgroundContentValue> {
5411        match self {
5412            CssProperty::ScrollbarResizer(f) => Some(f),
5413            _ => None,
5414        }
5415    }
5416
5417    pub const fn as_visibility(&self) -> Option<&StyleVisibilityValue> {
5418        match self {
5419            CssProperty::Visibility(f) => Some(f),
5420            _ => None,
5421        }
5422    }
5423
5424    pub const fn as_background_content(&self) -> Option<&StyleBackgroundContentVecValue> {
5425        match self {
5426            CssProperty::BackgroundContent(f) => Some(f),
5427            _ => None,
5428        }
5429    }
5430    pub const fn as_text_justify(&self) -> Option<&LayoutTextJustifyValue> {
5431        match self {
5432            CssProperty::TextJustify(f) => Some(f),
5433            _ => None,
5434        }
5435    }
5436    pub const fn as_caret_color(&self) -> Option<&CaretColorValue> {
5437        match self {
5438            CssProperty::CaretColor(f) => Some(f),
5439            _ => None,
5440        }
5441    }
5442    pub const fn as_caret_width(&self) -> Option<&CaretWidthValue> {
5443        match self {
5444            CssProperty::CaretWidth(f) => Some(f),
5445            _ => None,
5446        }
5447    }
5448    pub const fn as_caret_animation_duration(&self) -> Option<&CaretAnimationDurationValue> {
5449        match self {
5450            CssProperty::CaretAnimationDuration(f) => Some(f),
5451            _ => None,
5452        }
5453    }
5454    pub const fn as_selection_background_color(&self) -> Option<&SelectionBackgroundColorValue> {
5455        match self {
5456            CssProperty::SelectionBackgroundColor(f) => Some(f),
5457            _ => None,
5458        }
5459    }
5460    pub const fn as_selection_color(&self) -> Option<&SelectionColorValue> {
5461        match self {
5462            CssProperty::SelectionColor(f) => Some(f),
5463            _ => None,
5464        }
5465    }
5466    pub const fn as_selection_radius(&self) -> Option<&SelectionRadiusValue> {
5467        match self {
5468            CssProperty::SelectionRadius(f) => Some(f),
5469            _ => None,
5470        }
5471    }
5472    pub const fn as_background_position(&self) -> Option<&StyleBackgroundPositionVecValue> {
5473        match self {
5474            CssProperty::BackgroundPosition(f) => Some(f),
5475            _ => None,
5476        }
5477    }
5478    pub const fn as_background_size(&self) -> Option<&StyleBackgroundSizeVecValue> {
5479        match self {
5480            CssProperty::BackgroundSize(f) => Some(f),
5481            _ => None,
5482        }
5483    }
5484    pub const fn as_background_repeat(&self) -> Option<&StyleBackgroundRepeatVecValue> {
5485        match self {
5486            CssProperty::BackgroundRepeat(f) => Some(f),
5487            _ => None,
5488        }
5489    }
5490
5491    pub const fn as_grid_auto_flow(&self) -> Option<&LayoutGridAutoFlowValue> {
5492        match self {
5493            CssProperty::GridAutoFlow(f) => Some(f),
5494            _ => None,
5495        }
5496    }
5497    pub const fn as_justify_self(&self) -> Option<&LayoutJustifySelfValue> {
5498        match self {
5499            CssProperty::JustifySelf(f) => Some(f),
5500            _ => None,
5501        }
5502    }
5503    pub const fn as_justify_items(&self) -> Option<&LayoutJustifyItemsValue> {
5504        match self {
5505            CssProperty::JustifyItems(f) => Some(f),
5506            _ => None,
5507        }
5508    }
5509    pub const fn as_gap(&self) -> Option<&LayoutGapValue> {
5510        match self {
5511            CssProperty::Gap(f) => Some(f),
5512            _ => None,
5513        }
5514    }
5515    pub const fn as_grid_gap(&self) -> Option<&LayoutGapValue> {
5516        match self {
5517            CssProperty::GridGap(f) => Some(f),
5518            _ => None,
5519        }
5520    }
5521    pub const fn as_align_self(&self) -> Option<&LayoutAlignSelfValue> {
5522        match self {
5523            CssProperty::AlignSelf(f) => Some(f),
5524            _ => None,
5525        }
5526    }
5527    pub const fn as_font(&self) -> Option<&StyleFontValue> {
5528        match self {
5529            CssProperty::Font(f) => Some(f),
5530            _ => None,
5531        }
5532    }
5533    pub const fn as_font_size(&self) -> Option<&StyleFontSizeValue> {
5534        match self {
5535            CssProperty::FontSize(f) => Some(f),
5536            _ => None,
5537        }
5538    }
5539    pub const fn as_font_family(&self) -> Option<&StyleFontFamilyVecValue> {
5540        match self {
5541            CssProperty::FontFamily(f) => Some(f),
5542            _ => None,
5543        }
5544    }
5545    pub const fn as_font_weight(&self) -> Option<&StyleFontWeightValue> {
5546        match self {
5547            CssProperty::FontWeight(f) => Some(f),
5548            _ => None,
5549        }
5550    }
5551    pub const fn as_font_style(&self) -> Option<&StyleFontStyleValue> {
5552        match self {
5553            CssProperty::FontStyle(f) => Some(f),
5554            _ => None,
5555        }
5556    }
5557    pub const fn as_text_color(&self) -> Option<&StyleTextColorValue> {
5558        match self {
5559            CssProperty::TextColor(f) => Some(f),
5560            _ => None,
5561        }
5562    }
5563    pub const fn as_text_align(&self) -> Option<&StyleTextAlignValue> {
5564        match self {
5565            CssProperty::TextAlign(f) => Some(f),
5566            _ => None,
5567        }
5568    }
5569    pub const fn as_vertical_align(&self) -> Option<&StyleVerticalAlignValue> {
5570        match self {
5571            CssProperty::VerticalAlign(f) => Some(f),
5572            _ => None,
5573        }
5574    }
5575    pub const fn as_line_height(&self) -> Option<&StyleLineHeightValue> {
5576        match self {
5577            CssProperty::LineHeight(f) => Some(f),
5578            _ => None,
5579        }
5580    }
5581    pub const fn as_text_indent(&self) -> Option<&StyleTextIndentValue> {
5582        match self {
5583            CssProperty::TextIndent(f) => Some(f),
5584            _ => None,
5585        }
5586    }
5587    pub const fn as_initial_letter(&self) -> Option<&StyleInitialLetterValue> {
5588        match self {
5589            CssProperty::InitialLetter(f) => Some(f),
5590            _ => None,
5591        }
5592    }
5593    pub const fn as_line_clamp(&self) -> Option<&StyleLineClampValue> {
5594        match self {
5595            CssProperty::LineClamp(f) => Some(f),
5596            _ => None,
5597        }
5598    }
5599    pub const fn as_hanging_punctuation(&self) -> Option<&StyleHangingPunctuationValue> {
5600        match self {
5601            CssProperty::HangingPunctuation(f) => Some(f),
5602            _ => None,
5603        }
5604    }
5605    pub const fn as_text_combine_upright(&self) -> Option<&StyleTextCombineUprightValue> {
5606        match self {
5607            CssProperty::TextCombineUpright(f) => Some(f),
5608            _ => None,
5609        }
5610    }
5611    pub const fn as_unicode_bidi(&self) -> Option<&StyleUnicodeBidiValue> {
5612        match self {
5613            CssProperty::UnicodeBidi(f) => Some(f),
5614            _ => None,
5615        }
5616    }
5617    pub const fn as_text_box_trim(&self) -> Option<&StyleTextBoxTrimValue> {
5618        match self {
5619            CssProperty::TextBoxTrim(f) => Some(f),
5620            _ => None,
5621        }
5622    }
5623    pub const fn as_text_box_edge(&self) -> Option<&StyleTextBoxEdgeValue> {
5624        match self {
5625            CssProperty::TextBoxEdge(f) => Some(f),
5626            _ => None,
5627        }
5628    }
5629    pub const fn as_dominant_baseline(&self) -> Option<&StyleDominantBaselineValue> {
5630        match self {
5631            CssProperty::DominantBaseline(f) => Some(f),
5632            _ => None,
5633        }
5634    }
5635    pub const fn as_alignment_baseline(&self) -> Option<&StyleAlignmentBaselineValue> {
5636        match self {
5637            CssProperty::AlignmentBaseline(f) => Some(f),
5638            _ => None,
5639        }
5640    }
5641    pub const fn as_initial_letter_align(&self) -> Option<&StyleInitialLetterAlignValue> {
5642        match self {
5643            CssProperty::InitialLetterAlign(f) => Some(f),
5644            _ => None,
5645        }
5646    }
5647    pub const fn as_initial_letter_wrap(&self) -> Option<&StyleInitialLetterWrapValue> {
5648        match self {
5649            CssProperty::InitialLetterWrap(f) => Some(f),
5650            _ => None,
5651        }
5652    }
5653    pub const fn as_scrollbar_gutter(&self) -> Option<&StyleScrollbarGutterValue> {
5654        match self {
5655            CssProperty::ScrollbarGutter(f) => Some(f),
5656            _ => None,
5657        }
5658    }
5659    pub const fn as_overflow_clip_margin(&self) -> Option<&StyleOverflowClipMarginValue> {
5660        match self {
5661            CssProperty::OverflowClipMargin(f) => Some(f),
5662            _ => None,
5663        }
5664    }
5665    pub const fn as_clip(&self) -> Option<&StyleClipRectValue> {
5666        match self {
5667            CssProperty::Clip(f) => Some(f),
5668            _ => None,
5669        }
5670    }
5671    pub const fn as_exclusion_margin(&self) -> Option<&StyleExclusionMarginValue> {
5672        match self {
5673            CssProperty::ExclusionMargin(f) => Some(f),
5674            _ => None,
5675        }
5676    }
5677    pub const fn as_hyphenation_language(&self) -> Option<&StyleHyphenationLanguageValue> {
5678        match self {
5679            CssProperty::HyphenationLanguage(f) => Some(f),
5680            _ => None,
5681        }
5682    }
5683    pub const fn as_letter_spacing(&self) -> Option<&StyleLetterSpacingValue> {
5684        match self {
5685            CssProperty::LetterSpacing(f) => Some(f),
5686            _ => None,
5687        }
5688    }
5689    pub const fn as_word_spacing(&self) -> Option<&StyleWordSpacingValue> {
5690        match self {
5691            CssProperty::WordSpacing(f) => Some(f),
5692            _ => None,
5693        }
5694    }
5695    pub const fn as_tab_size(&self) -> Option<&StyleTabSizeValue> {
5696        match self {
5697            CssProperty::TabSize(f) => Some(f),
5698            _ => None,
5699        }
5700    }
5701    pub const fn as_cursor(&self) -> Option<&StyleCursorValue> {
5702        match self {
5703            CssProperty::Cursor(f) => Some(f),
5704            _ => None,
5705        }
5706    }
5707    pub const fn as_box_shadow_left(&self) -> Option<&StyleBoxShadowValue> {
5708        match self {
5709            CssProperty::BoxShadowLeft(f) => Some(f),
5710            _ => None,
5711        }
5712    }
5713    pub const fn as_box_shadow_right(&self) -> Option<&StyleBoxShadowValue> {
5714        match self {
5715            CssProperty::BoxShadowRight(f) => Some(f),
5716            _ => None,
5717        }
5718    }
5719    pub const fn as_box_shadow_top(&self) -> Option<&StyleBoxShadowValue> {
5720        match self {
5721            CssProperty::BoxShadowTop(f) => Some(f),
5722            _ => None,
5723        }
5724    }
5725    pub const fn as_box_shadow_bottom(&self) -> Option<&StyleBoxShadowValue> {
5726        match self {
5727            CssProperty::BoxShadowBottom(f) => Some(f),
5728            _ => None,
5729        }
5730    }
5731    pub const fn as_border_top_color(&self) -> Option<&StyleBorderTopColorValue> {
5732        match self {
5733            CssProperty::BorderTopColor(f) => Some(f),
5734            _ => None,
5735        }
5736    }
5737    pub const fn as_border_left_color(&self) -> Option<&StyleBorderLeftColorValue> {
5738        match self {
5739            CssProperty::BorderLeftColor(f) => Some(f),
5740            _ => None,
5741        }
5742    }
5743    pub const fn as_border_right_color(&self) -> Option<&StyleBorderRightColorValue> {
5744        match self {
5745            CssProperty::BorderRightColor(f) => Some(f),
5746            _ => None,
5747        }
5748    }
5749    pub const fn as_border_bottom_color(&self) -> Option<&StyleBorderBottomColorValue> {
5750        match self {
5751            CssProperty::BorderBottomColor(f) => Some(f),
5752            _ => None,
5753        }
5754    }
5755    pub const fn as_border_top_style(&self) -> Option<&StyleBorderTopStyleValue> {
5756        match self {
5757            CssProperty::BorderTopStyle(f) => Some(f),
5758            _ => None,
5759        }
5760    }
5761    pub const fn as_border_left_style(&self) -> Option<&StyleBorderLeftStyleValue> {
5762        match self {
5763            CssProperty::BorderLeftStyle(f) => Some(f),
5764            _ => None,
5765        }
5766    }
5767    pub const fn as_border_right_style(&self) -> Option<&StyleBorderRightStyleValue> {
5768        match self {
5769            CssProperty::BorderRightStyle(f) => Some(f),
5770            _ => None,
5771        }
5772    }
5773    pub const fn as_border_bottom_style(&self) -> Option<&StyleBorderBottomStyleValue> {
5774        match self {
5775            CssProperty::BorderBottomStyle(f) => Some(f),
5776            _ => None,
5777        }
5778    }
5779    pub const fn as_border_top_left_radius(&self) -> Option<&StyleBorderTopLeftRadiusValue> {
5780        match self {
5781            CssProperty::BorderTopLeftRadius(f) => Some(f),
5782            _ => None,
5783        }
5784    }
5785    pub const fn as_border_top_right_radius(&self) -> Option<&StyleBorderTopRightRadiusValue> {
5786        match self {
5787            CssProperty::BorderTopRightRadius(f) => Some(f),
5788            _ => None,
5789        }
5790    }
5791    pub const fn as_border_bottom_left_radius(&self) -> Option<&StyleBorderBottomLeftRadiusValue> {
5792        match self {
5793            CssProperty::BorderBottomLeftRadius(f) => Some(f),
5794            _ => None,
5795        }
5796    }
5797    pub const fn as_border_bottom_right_radius(
5798        &self,
5799    ) -> Option<&StyleBorderBottomRightRadiusValue> {
5800        match self {
5801            CssProperty::BorderBottomRightRadius(f) => Some(f),
5802            _ => None,
5803        }
5804    }
5805    pub const fn as_opacity(&self) -> Option<&StyleOpacityValue> {
5806        match self {
5807            CssProperty::Opacity(f) => Some(f),
5808            _ => None,
5809        }
5810    }
5811    pub const fn as_transform(&self) -> Option<&StyleTransformVecValue> {
5812        match self {
5813            CssProperty::Transform(f) => Some(f),
5814            _ => None,
5815        }
5816    }
5817    pub const fn as_transform_origin(&self) -> Option<&StyleTransformOriginValue> {
5818        match self {
5819            CssProperty::TransformOrigin(f) => Some(f),
5820            _ => None,
5821        }
5822    }
5823    pub const fn as_perspective_origin(&self) -> Option<&StylePerspectiveOriginValue> {
5824        match self {
5825            CssProperty::PerspectiveOrigin(f) => Some(f),
5826            _ => None,
5827        }
5828    }
5829    pub const fn as_backface_visibility(&self) -> Option<&StyleBackfaceVisibilityValue> {
5830        match self {
5831            CssProperty::BackfaceVisibility(f) => Some(f),
5832            _ => None,
5833        }
5834    }
5835    pub const fn as_mix_blend_mode(&self) -> Option<&StyleMixBlendModeValue> {
5836        match self {
5837            CssProperty::MixBlendMode(f) => Some(f),
5838            _ => None,
5839        }
5840    }
5841    pub const fn as_filter(&self) -> Option<&StyleFilterVecValue> {
5842        match self {
5843            CssProperty::Filter(f) => Some(f),
5844            _ => None,
5845        }
5846    }
5847    pub const fn as_backdrop_filter(&self) -> Option<&StyleFilterVecValue> {
5848        match self {
5849            CssProperty::BackdropFilter(f) => Some(f),
5850            _ => None,
5851        }
5852    }
5853    pub const fn as_text_shadow(&self) -> Option<&StyleBoxShadowValue> {
5854        match self {
5855            CssProperty::TextShadow(f) => Some(f),
5856            _ => None,
5857        }
5858    }
5859
5860    // functions that downcast to the concrete CSS type (layout)
5861
5862    pub const fn as_display(&self) -> Option<&LayoutDisplayValue> {
5863        match self {
5864            CssProperty::Display(f) => Some(f),
5865            _ => None,
5866        }
5867    }
5868    pub const fn as_float(&self) -> Option<&LayoutFloatValue> {
5869        match self {
5870            CssProperty::Float(f) => Some(f),
5871            _ => None,
5872        }
5873    }
5874    pub const fn as_box_sizing(&self) -> Option<&LayoutBoxSizingValue> {
5875        match self {
5876            CssProperty::BoxSizing(f) => Some(f),
5877            _ => None,
5878        }
5879    }
5880    pub const fn as_width(&self) -> Option<&LayoutWidthValue> {
5881        match self {
5882            CssProperty::Width(f) => Some(f),
5883            _ => None,
5884        }
5885    }
5886    pub const fn as_height(&self) -> Option<&LayoutHeightValue> {
5887        match self {
5888            CssProperty::Height(f) => Some(f),
5889            _ => None,
5890        }
5891    }
5892    pub const fn as_min_width(&self) -> Option<&LayoutMinWidthValue> {
5893        match self {
5894            CssProperty::MinWidth(f) => Some(f),
5895            _ => None,
5896        }
5897    }
5898    pub const fn as_min_height(&self) -> Option<&LayoutMinHeightValue> {
5899        match self {
5900            CssProperty::MinHeight(f) => Some(f),
5901            _ => None,
5902        }
5903    }
5904    pub const fn as_max_width(&self) -> Option<&LayoutMaxWidthValue> {
5905        match self {
5906            CssProperty::MaxWidth(f) => Some(f),
5907            _ => None,
5908        }
5909    }
5910    pub const fn as_max_height(&self) -> Option<&LayoutMaxHeightValue> {
5911        match self {
5912            CssProperty::MaxHeight(f) => Some(f),
5913            _ => None,
5914        }
5915    }
5916    pub const fn as_position(&self) -> Option<&LayoutPositionValue> {
5917        match self {
5918            CssProperty::Position(f) => Some(f),
5919            _ => None,
5920        }
5921    }
5922    pub const fn as_top(&self) -> Option<&LayoutTopValue> {
5923        match self {
5924            CssProperty::Top(f) => Some(f),
5925            _ => None,
5926        }
5927    }
5928    pub const fn as_bottom(&self) -> Option<&LayoutInsetBottomValue> {
5929        match self {
5930            CssProperty::Bottom(f) => Some(f),
5931            _ => None,
5932        }
5933    }
5934    pub const fn as_right(&self) -> Option<&LayoutRightValue> {
5935        match self {
5936            CssProperty::Right(f) => Some(f),
5937            _ => None,
5938        }
5939    }
5940    pub const fn as_left(&self) -> Option<&LayoutLeftValue> {
5941        match self {
5942            CssProperty::Left(f) => Some(f),
5943            _ => None,
5944        }
5945    }
5946    pub const fn as_padding_top(&self) -> Option<&LayoutPaddingTopValue> {
5947        match self {
5948            CssProperty::PaddingTop(f) => Some(f),
5949            _ => None,
5950        }
5951    }
5952    pub const fn as_padding_bottom(&self) -> Option<&LayoutPaddingBottomValue> {
5953        match self {
5954            CssProperty::PaddingBottom(f) => Some(f),
5955            _ => None,
5956        }
5957    }
5958    pub const fn as_padding_left(&self) -> Option<&LayoutPaddingLeftValue> {
5959        match self {
5960            CssProperty::PaddingLeft(f) => Some(f),
5961            _ => None,
5962        }
5963    }
5964    pub const fn as_padding_right(&self) -> Option<&LayoutPaddingRightValue> {
5965        match self {
5966            CssProperty::PaddingRight(f) => Some(f),
5967            _ => None,
5968        }
5969    }
5970    pub const fn as_margin_top(&self) -> Option<&LayoutMarginTopValue> {
5971        match self {
5972            CssProperty::MarginTop(f) => Some(f),
5973            _ => None,
5974        }
5975    }
5976    pub const fn as_margin_bottom(&self) -> Option<&LayoutMarginBottomValue> {
5977        match self {
5978            CssProperty::MarginBottom(f) => Some(f),
5979            _ => None,
5980        }
5981    }
5982    pub const fn as_margin_left(&self) -> Option<&LayoutMarginLeftValue> {
5983        match self {
5984            CssProperty::MarginLeft(f) => Some(f),
5985            _ => None,
5986        }
5987    }
5988    pub const fn as_margin_right(&self) -> Option<&LayoutMarginRightValue> {
5989        match self {
5990            CssProperty::MarginRight(f) => Some(f),
5991            _ => None,
5992        }
5993    }
5994    pub const fn as_border_top_width(&self) -> Option<&LayoutBorderTopWidthValue> {
5995        match self {
5996            CssProperty::BorderTopWidth(f) => Some(f),
5997            _ => None,
5998        }
5999    }
6000    pub const fn as_border_left_width(&self) -> Option<&LayoutBorderLeftWidthValue> {
6001        match self {
6002            CssProperty::BorderLeftWidth(f) => Some(f),
6003            _ => None,
6004        }
6005    }
6006    pub const fn as_border_right_width(&self) -> Option<&LayoutBorderRightWidthValue> {
6007        match self {
6008            CssProperty::BorderRightWidth(f) => Some(f),
6009            _ => None,
6010        }
6011    }
6012    pub const fn as_border_bottom_width(&self) -> Option<&LayoutBorderBottomWidthValue> {
6013        match self {
6014            CssProperty::BorderBottomWidth(f) => Some(f),
6015            _ => None,
6016        }
6017    }
6018    pub const fn as_overflow_x(&self) -> Option<&LayoutOverflowValue> {
6019        match self {
6020            CssProperty::OverflowX(f) => Some(f),
6021            _ => None,
6022        }
6023    }
6024    pub const fn as_overflow_y(&self) -> Option<&LayoutOverflowValue> {
6025        match self {
6026            CssProperty::OverflowY(f) => Some(f),
6027            _ => None,
6028        }
6029    }
6030    pub const fn as_overflow_block(&self) -> Option<&LayoutOverflowValue> {
6031        match self {
6032            CssProperty::OverflowBlock(f) => Some(f),
6033            _ => None,
6034        }
6035    }
6036    pub const fn as_overflow_inline(&self) -> Option<&LayoutOverflowValue> {
6037        match self {
6038            CssProperty::OverflowInline(f) => Some(f),
6039            _ => None,
6040        }
6041    }
6042    pub const fn as_flex_direction(&self) -> Option<&LayoutFlexDirectionValue> {
6043        match self {
6044            CssProperty::FlexDirection(f) => Some(f),
6045            _ => None,
6046        }
6047    }
6048    pub const fn as_direction(&self) -> Option<&StyleDirectionValue> {
6049        match self {
6050            CssProperty::Direction(f) => Some(f),
6051            _ => None,
6052        }
6053    }
6054    pub const fn as_user_select(&self) -> Option<&StyleUserSelectValue> {
6055        match self {
6056            CssProperty::UserSelect(f) => Some(f),
6057            _ => None,
6058        }
6059    }
6060    pub const fn as_text_decoration(&self) -> Option<&StyleTextDecorationValue> {
6061        match self {
6062            CssProperty::TextDecoration(f) => Some(f),
6063            _ => None,
6064        }
6065    }
6066    pub const fn as_hyphens(&self) -> Option<&StyleHyphensValue> {
6067        match self {
6068            CssProperty::Hyphens(f) => Some(f),
6069            _ => None,
6070        }
6071    }
6072    pub const fn as_word_break(&self) -> Option<&StyleWordBreakValue> {
6073        match self {
6074            CssProperty::WordBreak(f) => Some(f),
6075            _ => None,
6076        }
6077    }
6078    pub const fn as_overflow_wrap(&self) -> Option<&StyleOverflowWrapValue> {
6079        match self {
6080            CssProperty::OverflowWrap(f) => Some(f),
6081            _ => None,
6082        }
6083    }
6084    pub const fn as_line_break(&self) -> Option<&StyleLineBreakValue> {
6085        match self {
6086            CssProperty::LineBreak(f) => Some(f),
6087            _ => None,
6088        }
6089    }
6090    pub const fn as_object_fit(&self) -> Option<&StyleObjectFitValue> {
6091        match self {
6092            CssProperty::ObjectFit(f) => Some(f),
6093            _ => None,
6094        }
6095    }
6096    pub const fn as_object_position(&self) -> Option<&StyleObjectPositionValue> {
6097        match self {
6098            CssProperty::ObjectPosition(f) => Some(f),
6099            _ => None,
6100        }
6101    }
6102    pub const fn as_aspect_ratio(&self) -> Option<&StyleAspectRatioValue> {
6103        match self {
6104            CssProperty::AspectRatio(f) => Some(f),
6105            _ => None,
6106        }
6107    }
6108    pub const fn as_text_orientation(&self) -> Option<&StyleTextOrientationValue> {
6109        match self {
6110            CssProperty::TextOrientation(f) => Some(f),
6111            _ => None,
6112        }
6113    }
6114    pub const fn as_text_align_last(&self) -> Option<&StyleTextAlignLastValue> {
6115        match self {
6116            CssProperty::TextAlignLast(f) => Some(f),
6117            _ => None,
6118        }
6119    }
6120    pub const fn as_white_space(&self) -> Option<&StyleWhiteSpaceValue> {
6121        match self {
6122            CssProperty::WhiteSpace(f) => Some(f),
6123            _ => None,
6124        }
6125    }
6126    pub const fn as_flex_wrap(&self) -> Option<&LayoutFlexWrapValue> {
6127        match self {
6128            CssProperty::FlexWrap(f) => Some(f),
6129            _ => None,
6130        }
6131    }
6132    pub const fn as_flex_grow(&self) -> Option<&LayoutFlexGrowValue> {
6133        match self {
6134            CssProperty::FlexGrow(f) => Some(f),
6135            _ => None,
6136        }
6137    }
6138    pub const fn as_flex_shrink(&self) -> Option<&LayoutFlexShrinkValue> {
6139        match self {
6140            CssProperty::FlexShrink(f) => Some(f),
6141            _ => None,
6142        }
6143    }
6144    pub const fn as_justify_content(&self) -> Option<&LayoutJustifyContentValue> {
6145        match self {
6146            CssProperty::JustifyContent(f) => Some(f),
6147            _ => None,
6148        }
6149    }
6150    pub const fn as_align_items(&self) -> Option<&LayoutAlignItemsValue> {
6151        match self {
6152            CssProperty::AlignItems(f) => Some(f),
6153            _ => None,
6154        }
6155    }
6156    pub const fn as_align_content(&self) -> Option<&LayoutAlignContentValue> {
6157        match self {
6158            CssProperty::AlignContent(f) => Some(f),
6159            _ => None,
6160        }
6161    }
6162    pub const fn as_break_before(&self) -> Option<&PageBreakValue> {
6163        match self {
6164            CssProperty::BreakBefore(f) => Some(f),
6165            _ => None,
6166        }
6167    }
6168    pub const fn as_break_after(&self) -> Option<&PageBreakValue> {
6169        match self {
6170            CssProperty::BreakAfter(f) => Some(f),
6171            _ => None,
6172        }
6173    }
6174    pub const fn as_break_inside(&self) -> Option<&BreakInsideValue> {
6175        match self {
6176            CssProperty::BreakInside(f) => Some(f),
6177            _ => None,
6178        }
6179    }
6180    pub const fn as_orphans(&self) -> Option<&OrphansValue> {
6181        match self {
6182            CssProperty::Orphans(f) => Some(f),
6183            _ => None,
6184        }
6185    }
6186    pub const fn as_widows(&self) -> Option<&WidowsValue> {
6187        match self {
6188            CssProperty::Widows(f) => Some(f),
6189            _ => None,
6190        }
6191    }
6192    pub const fn as_box_decoration_break(&self) -> Option<&BoxDecorationBreakValue> {
6193        match self {
6194            CssProperty::BoxDecorationBreak(f) => Some(f),
6195            _ => None,
6196        }
6197    }
6198    pub const fn as_column_count(&self) -> Option<&ColumnCountValue> {
6199        match self {
6200            CssProperty::ColumnCount(f) => Some(f),
6201            _ => None,
6202        }
6203    }
6204    pub const fn as_column_width(&self) -> Option<&ColumnWidthValue> {
6205        match self {
6206            CssProperty::ColumnWidth(f) => Some(f),
6207            _ => None,
6208        }
6209    }
6210    pub const fn as_column_span(&self) -> Option<&ColumnSpanValue> {
6211        match self {
6212            CssProperty::ColumnSpan(f) => Some(f),
6213            _ => None,
6214        }
6215    }
6216    pub const fn as_column_fill(&self) -> Option<&ColumnFillValue> {
6217        match self {
6218            CssProperty::ColumnFill(f) => Some(f),
6219            _ => None,
6220        }
6221    }
6222    pub const fn as_column_rule_width(&self) -> Option<&ColumnRuleWidthValue> {
6223        match self {
6224            CssProperty::ColumnRuleWidth(f) => Some(f),
6225            _ => None,
6226        }
6227    }
6228    pub const fn as_column_rule_style(&self) -> Option<&ColumnRuleStyleValue> {
6229        match self {
6230            CssProperty::ColumnRuleStyle(f) => Some(f),
6231            _ => None,
6232        }
6233    }
6234    pub const fn as_column_rule_color(&self) -> Option<&ColumnRuleColorValue> {
6235        match self {
6236            CssProperty::ColumnRuleColor(f) => Some(f),
6237            _ => None,
6238        }
6239    }
6240    pub const fn as_flow_into(&self) -> Option<&FlowIntoValue> {
6241        match self {
6242            CssProperty::FlowInto(f) => Some(f),
6243            _ => None,
6244        }
6245    }
6246    pub const fn as_flow_from(&self) -> Option<&FlowFromValue> {
6247        match self {
6248            CssProperty::FlowFrom(f) => Some(f),
6249            _ => None,
6250        }
6251    }
6252    pub fn as_shape_outside(&self) -> Option<&ShapeOutsideValue> {
6253        match self {
6254            CssProperty::ShapeOutside(f) => Some(f),
6255            _ => None,
6256        }
6257    }
6258    pub fn as_shape_inside(&self) -> Option<&ShapeInsideValue> {
6259        match self {
6260            CssProperty::ShapeInside(f) => Some(f),
6261            _ => None,
6262        }
6263    }
6264    pub fn as_clip_path(&self) -> Option<&ClipPathValue> {
6265        match self {
6266            CssProperty::ClipPath(f) => Some(f),
6267            _ => None,
6268        }
6269    }
6270    pub const fn as_shape_margin(&self) -> Option<&ShapeMarginValue> {
6271        match self {
6272            CssProperty::ShapeMargin(f) => Some(f),
6273            _ => None,
6274        }
6275    }
6276    pub const fn as_shape_image_threshold(&self) -> Option<&ShapeImageThresholdValue> {
6277        match self {
6278            CssProperty::ShapeImageThreshold(f) => Some(f),
6279            _ => None,
6280        }
6281    }
6282    pub const fn as_content(&self) -> Option<&ContentValue> {
6283        match self {
6284            CssProperty::Content(f) => Some(f),
6285            _ => None,
6286        }
6287    }
6288    pub const fn as_counter_reset(&self) -> Option<&CounterResetValue> {
6289        match self {
6290            CssProperty::CounterReset(f) => Some(f),
6291            _ => None,
6292        }
6293    }
6294    pub const fn as_counter_increment(&self) -> Option<&CounterIncrementValue> {
6295        match self {
6296            CssProperty::CounterIncrement(f) => Some(f),
6297            _ => None,
6298        }
6299    }
6300    pub const fn as_list_style_type(&self) -> Option<&StyleListStyleTypeValue> {
6301        match self {
6302            CssProperty::ListStyleType(f) => Some(f),
6303            _ => None,
6304        }
6305    }
6306    pub const fn as_list_style_position(&self) -> Option<&StyleListStylePositionValue> {
6307        match self {
6308            CssProperty::ListStylePosition(f) => Some(f),
6309            _ => None,
6310        }
6311    }
6312    pub const fn as_string_set(&self) -> Option<&StringSetValue> {
6313        match self {
6314            CssProperty::StringSet(f) => Some(f),
6315            _ => None,
6316        }
6317    }
6318    pub const fn as_table_layout(&self) -> Option<&LayoutTableLayoutValue> {
6319        match self {
6320            CssProperty::TableLayout(f) => Some(f),
6321            _ => None,
6322        }
6323    }
6324    pub const fn as_border_collapse(&self) -> Option<&StyleBorderCollapseValue> {
6325        match self {
6326            CssProperty::BorderCollapse(f) => Some(f),
6327            _ => None,
6328        }
6329    }
6330    pub const fn as_border_spacing(&self) -> Option<&LayoutBorderSpacingValue> {
6331        match self {
6332            CssProperty::BorderSpacing(f) => Some(f),
6333            _ => None,
6334        }
6335    }
6336    pub const fn as_caption_side(&self) -> Option<&StyleCaptionSideValue> {
6337        match self {
6338            CssProperty::CaptionSide(f) => Some(f),
6339            _ => None,
6340        }
6341    }
6342    pub const fn as_empty_cells(&self) -> Option<&StyleEmptyCellsValue> {
6343        match self {
6344            CssProperty::EmptyCells(f) => Some(f),
6345            _ => None,
6346        }
6347    }
6348
6349    pub const fn as_scrollbar_width(&self) -> Option<&LayoutScrollbarWidthValue> {
6350        match self {
6351            CssProperty::ScrollbarWidth(f) => Some(f),
6352            _ => None,
6353        }
6354    }
6355    pub const fn as_scrollbar_color(&self) -> Option<&StyleScrollbarColorValue> {
6356        match self {
6357            CssProperty::ScrollbarColor(f) => Some(f),
6358            _ => None,
6359        }
6360    }
6361
6362    pub const fn as_scrollbar_visibility(&self) -> Option<&ScrollbarVisibilityModeValue> {
6363        match self {
6364            CssProperty::ScrollbarVisibility(f) => Some(f),
6365            _ => None,
6366        }
6367    }
6368
6369    pub const fn as_scrollbar_fade_delay(&self) -> Option<&ScrollbarFadeDelayValue> {
6370        match self {
6371            CssProperty::ScrollbarFadeDelay(f) => Some(f),
6372            _ => None,
6373        }
6374    }
6375
6376    pub const fn as_scrollbar_fade_duration(&self) -> Option<&ScrollbarFadeDurationValue> {
6377        match self {
6378            CssProperty::ScrollbarFadeDuration(f) => Some(f),
6379            _ => None,
6380        }
6381    }
6382
6383    pub fn is_initial(&self) -> bool {
6384        use self::CssProperty::*;
6385        match self {
6386            CaretColor(c) => c.is_initial(),
6387            CaretWidth(c) => c.is_initial(),
6388            CaretAnimationDuration(c) => c.is_initial(),
6389            SelectionBackgroundColor(c) => c.is_initial(),
6390            SelectionColor(c) => c.is_initial(),
6391            SelectionRadius(c) => c.is_initial(),
6392            TextJustify(c) => c.is_initial(),
6393            TextColor(c) => c.is_initial(),
6394            FontSize(c) => c.is_initial(),
6395            FontFamily(c) => c.is_initial(),
6396            TextAlign(c) => c.is_initial(),
6397            LetterSpacing(c) => c.is_initial(),
6398            TextIndent(c) => c.is_initial(),
6399            InitialLetter(c) => c.is_initial(),
6400            LineClamp(c) => c.is_initial(),
6401            HangingPunctuation(c) => c.is_initial(),
6402            TextCombineUpright(c) => c.is_initial(),
6403            UnicodeBidi(c) => c.is_initial(),
6404            TextBoxTrim(c) => c.is_initial(),
6405            TextBoxEdge(c) => c.is_initial(),
6406            DominantBaseline(c) => c.is_initial(),
6407            AlignmentBaseline(c) => c.is_initial(),
6408            InitialLetterAlign(c) => c.is_initial(),
6409            InitialLetterWrap(c) => c.is_initial(),
6410            ScrollbarGutter(c) => c.is_initial(),
6411            OverflowClipMargin(c) => c.is_initial(),
6412            Clip(c) => c.is_initial(),
6413            ExclusionMargin(c) => c.is_initial(),
6414            HyphenationLanguage(c) => c.is_initial(),
6415            LineHeight(c) => c.is_initial(),
6416            WordSpacing(c) => c.is_initial(),
6417            TabSize(c) => c.is_initial(),
6418            Cursor(c) => c.is_initial(),
6419            Display(c) => c.is_initial(),
6420            Float(c) => c.is_initial(),
6421            BoxSizing(c) => c.is_initial(),
6422            Width(c) => c.is_initial(),
6423            Height(c) => c.is_initial(),
6424            MinWidth(c) => c.is_initial(),
6425            MinHeight(c) => c.is_initial(),
6426            MaxWidth(c) => c.is_initial(),
6427            MaxHeight(c) => c.is_initial(),
6428            Position(c) => c.is_initial(),
6429            Top(c) => c.is_initial(),
6430            Right(c) => c.is_initial(),
6431            Left(c) => c.is_initial(),
6432            Bottom(c) => c.is_initial(),
6433            ZIndex(c) => c.is_initial(),
6434            FlexWrap(c) => c.is_initial(),
6435            FlexDirection(c) => c.is_initial(),
6436            FlexGrow(c) => c.is_initial(),
6437            FlexShrink(c) => c.is_initial(),
6438            FlexBasis(c) => c.is_initial(),
6439            JustifyContent(c) => c.is_initial(),
6440            AlignItems(c) => c.is_initial(),
6441            AlignContent(c) => c.is_initial(),
6442            ColumnGap(c) => c.is_initial(),
6443            RowGap(c) => c.is_initial(),
6444            GridTemplateColumns(c) => c.is_initial(),
6445            GridTemplateRows(c) => c.is_initial(),
6446            GridAutoFlow(c) => c.is_initial(),
6447            JustifySelf(c) => c.is_initial(),
6448            JustifyItems(c) => c.is_initial(),
6449            Gap(c) => c.is_initial(),
6450            GridGap(c) => c.is_initial(),
6451            AlignSelf(c) => c.is_initial(),
6452            Font(c) => c.is_initial(),
6453            GridAutoColumns(c) => c.is_initial(),
6454            GridAutoRows(c) => c.is_initial(),
6455            GridColumn(c) => c.is_initial(),
6456            GridRow(c) => c.is_initial(),
6457            GridTemplateAreas(c) => c.is_initial(),
6458            WritingMode(c) => c.is_initial(),
6459            Clear(c) => c.is_initial(),
6460            BackgroundContent(c) => c.is_initial(),
6461            BackgroundPosition(c) => c.is_initial(),
6462            BackgroundSize(c) => c.is_initial(),
6463            BackgroundRepeat(c) => c.is_initial(),
6464            OverflowX(c) => c.is_initial(),
6465            OverflowY(c) => c.is_initial(),
6466            OverflowBlock(c) => c.is_initial(),
6467            OverflowInline(c) => c.is_initial(),
6468            PaddingTop(c) => c.is_initial(),
6469            PaddingLeft(c) => c.is_initial(),
6470            PaddingRight(c) => c.is_initial(),
6471            PaddingBottom(c) => c.is_initial(),
6472            PaddingInlineStart(c) => c.is_initial(),
6473            PaddingInlineEnd(c) => c.is_initial(),
6474            MarginTop(c) => c.is_initial(),
6475            MarginLeft(c) => c.is_initial(),
6476            MarginRight(c) => c.is_initial(),
6477            MarginBottom(c) => c.is_initial(),
6478            BorderTopLeftRadius(c) => c.is_initial(),
6479            BorderTopRightRadius(c) => c.is_initial(),
6480            BorderBottomLeftRadius(c) => c.is_initial(),
6481            BorderBottomRightRadius(c) => c.is_initial(),
6482            BorderTopColor(c) => c.is_initial(),
6483            BorderRightColor(c) => c.is_initial(),
6484            BorderLeftColor(c) => c.is_initial(),
6485            BorderBottomColor(c) => c.is_initial(),
6486            BorderTopStyle(c) => c.is_initial(),
6487            BorderRightStyle(c) => c.is_initial(),
6488            BorderLeftStyle(c) => c.is_initial(),
6489            BorderBottomStyle(c) => c.is_initial(),
6490            BorderTopWidth(c) => c.is_initial(),
6491            BorderRightWidth(c) => c.is_initial(),
6492            BorderLeftWidth(c) => c.is_initial(),
6493            BorderBottomWidth(c) => c.is_initial(),
6494            BoxShadowLeft(c) => c.is_initial(),
6495            BoxShadowRight(c) => c.is_initial(),
6496            BoxShadowTop(c) => c.is_initial(),
6497            BoxShadowBottom(c) => c.is_initial(),
6498            ScrollbarTrack(c) => c.is_initial(),
6499            ScrollbarThumb(c) => c.is_initial(),
6500            ScrollbarButton(c) => c.is_initial(),
6501            ScrollbarCorner(c) => c.is_initial(),
6502            ScrollbarResizer(c) => c.is_initial(),
6503            ScrollbarWidth(c) => c.is_initial(),
6504            ScrollbarColor(c) => c.is_initial(),
6505            ScrollbarVisibility(c) => c.is_initial(),
6506            ScrollbarFadeDelay(c) => c.is_initial(),
6507            ScrollbarFadeDuration(c) => c.is_initial(),
6508            Opacity(c) => c.is_initial(),
6509            Visibility(c) => c.is_initial(),
6510            Transform(c) => c.is_initial(),
6511            TransformOrigin(c) => c.is_initial(),
6512            PerspectiveOrigin(c) => c.is_initial(),
6513            BackfaceVisibility(c) => c.is_initial(),
6514            MixBlendMode(c) => c.is_initial(),
6515            Filter(c) => c.is_initial(),
6516            BackdropFilter(c) => c.is_initial(),
6517            TextShadow(c) => c.is_initial(),
6518            WhiteSpace(c) => c.is_initial(),
6519            Direction(c) => c.is_initial(),
6520            UserSelect(c) => c.is_initial(),
6521            TextDecoration(c) => c.is_initial(),
6522            Hyphens(c) => c.is_initial(),
6523            WordBreak(c) => c.is_initial(),
6524            OverflowWrap(c) => c.is_initial(),
6525            LineBreak(c) => c.is_initial(),
6526            ObjectFit(c) => c.is_initial(),
6527            ObjectPosition(c) => c.is_initial(),
6528            AspectRatio(c) => c.is_initial(),
6529            TextOrientation(c) => c.is_initial(),
6530            TextAlignLast(c) => c.is_initial(),
6531            BreakBefore(c) => c.is_initial(),
6532            BreakAfter(c) => c.is_initial(),
6533            BreakInside(c) => c.is_initial(),
6534            Orphans(c) => c.is_initial(),
6535            Widows(c) => c.is_initial(),
6536            BoxDecorationBreak(c) => c.is_initial(),
6537            ColumnCount(c) => c.is_initial(),
6538            ColumnWidth(c) => c.is_initial(),
6539            ColumnSpan(c) => c.is_initial(),
6540            ColumnFill(c) => c.is_initial(),
6541            ColumnRuleWidth(c) => c.is_initial(),
6542            ColumnRuleStyle(c) => c.is_initial(),
6543            ColumnRuleColor(c) => c.is_initial(),
6544            FlowInto(c) => c.is_initial(),
6545            FlowFrom(c) => c.is_initial(),
6546            ShapeOutside(c) => c.is_initial(),
6547            ShapeInside(c) => c.is_initial(),
6548            ClipPath(c) => c.is_initial(),
6549            ShapeMargin(c) => c.is_initial(),
6550            ShapeImageThreshold(c) => c.is_initial(),
6551            Content(c) => c.is_initial(),
6552            CounterReset(c) => c.is_initial(),
6553            CounterIncrement(c) => c.is_initial(),
6554            ListStyleType(c) => c.is_initial(),
6555            ListStylePosition(c) => c.is_initial(),
6556            StringSet(c) => c.is_initial(),
6557            TableLayout(c) => c.is_initial(),
6558            BorderCollapse(c) => c.is_initial(),
6559            BorderSpacing(c) => c.is_initial(),
6560            CaptionSide(c) => c.is_initial(),
6561            EmptyCells(c) => c.is_initial(),
6562            FontWeight(c) => c.is_initial(),
6563            FontStyle(c) => c.is_initial(),
6564            VerticalAlign(c) => c.is_initial(),
6565        }
6566    }
6567
6568    pub fn const_none(prop_type: CssPropertyType) -> Self {
6569        css_property_from_type!(prop_type, None)
6570    }
6571    pub fn const_auto(prop_type: CssPropertyType) -> Self {
6572        css_property_from_type!(prop_type, Auto)
6573    }
6574    pub fn const_initial(prop_type: CssPropertyType) -> Self {
6575        css_property_from_type!(prop_type, Initial)
6576    }
6577    pub fn const_inherit(prop_type: CssPropertyType) -> Self {
6578        css_property_from_type!(prop_type, Inherit)
6579    }
6580
6581    pub const fn const_text_color(input: StyleTextColor) -> Self {
6582        CssProperty::TextColor(StyleTextColorValue::Exact(input))
6583    }
6584    pub const fn const_font_size(input: StyleFontSize) -> Self {
6585        CssProperty::FontSize(StyleFontSizeValue::Exact(input))
6586    }
6587    pub const fn const_font_family(input: StyleFontFamilyVec) -> Self {
6588        CssProperty::FontFamily(StyleFontFamilyVecValue::Exact(input))
6589    }
6590    pub const fn const_text_align(input: StyleTextAlign) -> Self {
6591        CssProperty::TextAlign(StyleTextAlignValue::Exact(input))
6592    }
6593    pub const fn const_vertical_align(input: StyleVerticalAlign) -> Self {
6594        CssProperty::VerticalAlign(StyleVerticalAlignValue::Exact(input))
6595    }
6596    pub const fn const_letter_spacing(input: StyleLetterSpacing) -> Self {
6597        CssProperty::LetterSpacing(StyleLetterSpacingValue::Exact(input))
6598    }
6599    pub const fn const_text_indent(input: StyleTextIndent) -> Self {
6600        CssProperty::TextIndent(StyleTextIndentValue::Exact(input))
6601    }
6602    pub const fn const_line_height(input: StyleLineHeight) -> Self {
6603        CssProperty::LineHeight(StyleLineHeightValue::Exact(input))
6604    }
6605    pub const fn const_word_spacing(input: StyleWordSpacing) -> Self {
6606        CssProperty::WordSpacing(StyleWordSpacingValue::Exact(input))
6607    }
6608    pub const fn const_tab_size(input: StyleTabSize) -> Self {
6609        CssProperty::TabSize(StyleTabSizeValue::Exact(input))
6610    }
6611    pub const fn const_cursor(input: StyleCursor) -> Self {
6612        CssProperty::Cursor(StyleCursorValue::Exact(input))
6613    }
6614    pub const fn const_display(input: LayoutDisplay) -> Self {
6615        CssProperty::Display(LayoutDisplayValue::Exact(input))
6616    }
6617    pub const fn const_float(input: LayoutFloat) -> Self {
6618        CssProperty::Float(LayoutFloatValue::Exact(input))
6619    }
6620    pub const fn const_box_sizing(input: LayoutBoxSizing) -> Self {
6621        CssProperty::BoxSizing(LayoutBoxSizingValue::Exact(input))
6622    }
6623    pub const fn const_width(input: LayoutWidth) -> Self {
6624        CssProperty::Width(LayoutWidthValue::Exact(input))
6625    }
6626    pub const fn const_height(input: LayoutHeight) -> Self {
6627        CssProperty::Height(LayoutHeightValue::Exact(input))
6628    }
6629    pub const fn const_min_width(input: LayoutMinWidth) -> Self {
6630        CssProperty::MinWidth(LayoutMinWidthValue::Exact(input))
6631    }
6632    pub const fn const_min_height(input: LayoutMinHeight) -> Self {
6633        CssProperty::MinHeight(LayoutMinHeightValue::Exact(input))
6634    }
6635    pub const fn const_max_width(input: LayoutMaxWidth) -> Self {
6636        CssProperty::MaxWidth(LayoutMaxWidthValue::Exact(input))
6637    }
6638    pub const fn const_max_height(input: LayoutMaxHeight) -> Self {
6639        CssProperty::MaxHeight(LayoutMaxHeightValue::Exact(input))
6640    }
6641    pub const fn const_position(input: LayoutPosition) -> Self {
6642        CssProperty::Position(LayoutPositionValue::Exact(input))
6643    }
6644    pub const fn const_top(input: LayoutTop) -> Self {
6645        CssProperty::Top(LayoutTopValue::Exact(input))
6646    }
6647    pub const fn const_right(input: LayoutRight) -> Self {
6648        CssProperty::Right(LayoutRightValue::Exact(input))
6649    }
6650    pub const fn const_left(input: LayoutLeft) -> Self {
6651        CssProperty::Left(LayoutLeftValue::Exact(input))
6652    }
6653    pub const fn const_bottom(input: LayoutInsetBottom) -> Self {
6654        CssProperty::Bottom(LayoutInsetBottomValue::Exact(input))
6655    }
6656    pub const fn const_flex_wrap(input: LayoutFlexWrap) -> Self {
6657        CssProperty::FlexWrap(LayoutFlexWrapValue::Exact(input))
6658    }
6659    pub const fn const_flex_direction(input: LayoutFlexDirection) -> Self {
6660        CssProperty::FlexDirection(LayoutFlexDirectionValue::Exact(input))
6661    }
6662    pub const fn const_flex_grow(input: LayoutFlexGrow) -> Self {
6663        CssProperty::FlexGrow(LayoutFlexGrowValue::Exact(input))
6664    }
6665    pub const fn const_flex_shrink(input: LayoutFlexShrink) -> Self {
6666        CssProperty::FlexShrink(LayoutFlexShrinkValue::Exact(input))
6667    }
6668    pub const fn const_justify_content(input: LayoutJustifyContent) -> Self {
6669        CssProperty::JustifyContent(LayoutJustifyContentValue::Exact(input))
6670    }
6671    pub const fn const_align_items(input: LayoutAlignItems) -> Self {
6672        CssProperty::AlignItems(LayoutAlignItemsValue::Exact(input))
6673    }
6674    pub const fn const_align_content(input: LayoutAlignContent) -> Self {
6675        CssProperty::AlignContent(LayoutAlignContentValue::Exact(input))
6676    }
6677    pub const fn const_background_content(input: StyleBackgroundContentVec) -> Self {
6678        CssProperty::BackgroundContent(StyleBackgroundContentVecValue::Exact(input))
6679    }
6680    pub const fn const_background_position(input: StyleBackgroundPositionVec) -> Self {
6681        CssProperty::BackgroundPosition(StyleBackgroundPositionVecValue::Exact(input))
6682    }
6683    pub const fn const_background_size(input: StyleBackgroundSizeVec) -> Self {
6684        CssProperty::BackgroundSize(StyleBackgroundSizeVecValue::Exact(input))
6685    }
6686    pub const fn const_background_repeat(input: StyleBackgroundRepeatVec) -> Self {
6687        CssProperty::BackgroundRepeat(StyleBackgroundRepeatVecValue::Exact(input))
6688    }
6689    pub const fn const_overflow_x(input: LayoutOverflow) -> Self {
6690        CssProperty::OverflowX(LayoutOverflowValue::Exact(input))
6691    }
6692    pub const fn const_overflow_y(input: LayoutOverflow) -> Self {
6693        CssProperty::OverflowY(LayoutOverflowValue::Exact(input))
6694    }
6695    pub const fn const_overflow_block(input: LayoutOverflow) -> Self {
6696        CssProperty::OverflowBlock(LayoutOverflowValue::Exact(input))
6697    }
6698    pub const fn const_overflow_inline(input: LayoutOverflow) -> Self {
6699        CssProperty::OverflowInline(LayoutOverflowValue::Exact(input))
6700    }
6701    pub const fn const_padding_top(input: LayoutPaddingTop) -> Self {
6702        CssProperty::PaddingTop(LayoutPaddingTopValue::Exact(input))
6703    }
6704    pub const fn const_padding_left(input: LayoutPaddingLeft) -> Self {
6705        CssProperty::PaddingLeft(LayoutPaddingLeftValue::Exact(input))
6706    }
6707    pub const fn const_padding_right(input: LayoutPaddingRight) -> Self {
6708        CssProperty::PaddingRight(LayoutPaddingRightValue::Exact(input))
6709    }
6710    pub const fn const_padding_bottom(input: LayoutPaddingBottom) -> Self {
6711        CssProperty::PaddingBottom(LayoutPaddingBottomValue::Exact(input))
6712    }
6713    pub const fn const_margin_top(input: LayoutMarginTop) -> Self {
6714        CssProperty::MarginTop(LayoutMarginTopValue::Exact(input))
6715    }
6716    pub const fn const_margin_left(input: LayoutMarginLeft) -> Self {
6717        CssProperty::MarginLeft(LayoutMarginLeftValue::Exact(input))
6718    }
6719    pub const fn const_margin_right(input: LayoutMarginRight) -> Self {
6720        CssProperty::MarginRight(LayoutMarginRightValue::Exact(input))
6721    }
6722    pub const fn const_margin_bottom(input: LayoutMarginBottom) -> Self {
6723        CssProperty::MarginBottom(LayoutMarginBottomValue::Exact(input))
6724    }
6725    pub const fn const_border_top_left_radius(input: StyleBorderTopLeftRadius) -> Self {
6726        CssProperty::BorderTopLeftRadius(StyleBorderTopLeftRadiusValue::Exact(input))
6727    }
6728    pub const fn const_border_top_right_radius(input: StyleBorderTopRightRadius) -> Self {
6729        CssProperty::BorderTopRightRadius(StyleBorderTopRightRadiusValue::Exact(input))
6730    }
6731    pub const fn const_border_bottom_left_radius(input: StyleBorderBottomLeftRadius) -> Self {
6732        CssProperty::BorderBottomLeftRadius(StyleBorderBottomLeftRadiusValue::Exact(input))
6733    }
6734    pub const fn const_border_bottom_right_radius(input: StyleBorderBottomRightRadius) -> Self {
6735        CssProperty::BorderBottomRightRadius(StyleBorderBottomRightRadiusValue::Exact(input))
6736    }
6737    pub const fn const_border_top_color(input: StyleBorderTopColor) -> Self {
6738        CssProperty::BorderTopColor(StyleBorderTopColorValue::Exact(input))
6739    }
6740    pub const fn const_border_right_color(input: StyleBorderRightColor) -> Self {
6741        CssProperty::BorderRightColor(StyleBorderRightColorValue::Exact(input))
6742    }
6743    pub const fn const_border_left_color(input: StyleBorderLeftColor) -> Self {
6744        CssProperty::BorderLeftColor(StyleBorderLeftColorValue::Exact(input))
6745    }
6746    pub const fn const_border_bottom_color(input: StyleBorderBottomColor) -> Self {
6747        CssProperty::BorderBottomColor(StyleBorderBottomColorValue::Exact(input))
6748    }
6749    pub const fn const_border_top_style(input: StyleBorderTopStyle) -> Self {
6750        CssProperty::BorderTopStyle(StyleBorderTopStyleValue::Exact(input))
6751    }
6752    pub const fn const_border_right_style(input: StyleBorderRightStyle) -> Self {
6753        CssProperty::BorderRightStyle(StyleBorderRightStyleValue::Exact(input))
6754    }
6755    pub const fn const_border_left_style(input: StyleBorderLeftStyle) -> Self {
6756        CssProperty::BorderLeftStyle(StyleBorderLeftStyleValue::Exact(input))
6757    }
6758    pub const fn const_border_bottom_style(input: StyleBorderBottomStyle) -> Self {
6759        CssProperty::BorderBottomStyle(StyleBorderBottomStyleValue::Exact(input))
6760    }
6761    pub const fn const_border_top_width(input: LayoutBorderTopWidth) -> Self {
6762        CssProperty::BorderTopWidth(LayoutBorderTopWidthValue::Exact(input))
6763    }
6764    pub const fn const_border_right_width(input: LayoutBorderRightWidth) -> Self {
6765        CssProperty::BorderRightWidth(LayoutBorderRightWidthValue::Exact(input))
6766    }
6767    pub const fn const_border_left_width(input: LayoutBorderLeftWidth) -> Self {
6768        CssProperty::BorderLeftWidth(LayoutBorderLeftWidthValue::Exact(input))
6769    }
6770    pub const fn const_border_bottom_width(input: LayoutBorderBottomWidth) -> Self {
6771        CssProperty::BorderBottomWidth(LayoutBorderBottomWidthValue::Exact(input))
6772    }
6773    pub fn const_box_shadow_left(input: StyleBoxShadow) -> Self {
6774        CssProperty::BoxShadowLeft(StyleBoxShadowValue::Exact(BoxOrStatic::heap(input)))
6775    }
6776    pub fn const_box_shadow_right(input: StyleBoxShadow) -> Self {
6777        CssProperty::BoxShadowRight(StyleBoxShadowValue::Exact(BoxOrStatic::heap(input)))
6778    }
6779    pub fn const_box_shadow_top(input: StyleBoxShadow) -> Self {
6780        CssProperty::BoxShadowTop(StyleBoxShadowValue::Exact(BoxOrStatic::heap(input)))
6781    }
6782    pub fn const_box_shadow_bottom(input: StyleBoxShadow) -> Self {
6783        CssProperty::BoxShadowBottom(StyleBoxShadowValue::Exact(BoxOrStatic::heap(input)))
6784    }
6785    pub const fn const_opacity(input: StyleOpacity) -> Self {
6786        CssProperty::Opacity(StyleOpacityValue::Exact(input))
6787    }
6788    pub const fn const_transform(input: StyleTransformVec) -> Self {
6789        CssProperty::Transform(StyleTransformVecValue::Exact(input))
6790    }
6791    pub const fn const_transform_origin(input: StyleTransformOrigin) -> Self {
6792        CssProperty::TransformOrigin(StyleTransformOriginValue::Exact(input))
6793    }
6794    pub const fn const_perspective_origin(input: StylePerspectiveOrigin) -> Self {
6795        CssProperty::PerspectiveOrigin(StylePerspectiveOriginValue::Exact(input))
6796    }
6797    pub const fn const_backface_visibility(input: StyleBackfaceVisibility) -> Self {
6798        CssProperty::BackfaceVisibility(StyleBackfaceVisibilityValue::Exact(input))
6799    }
6800    pub const fn const_break_before(input: PageBreak) -> Self {
6801        CssProperty::BreakBefore(PageBreakValue::Exact(input))
6802    }
6803    pub const fn const_break_after(input: PageBreak) -> Self {
6804        CssProperty::BreakAfter(PageBreakValue::Exact(input))
6805    }
6806    pub const fn const_break_inside(input: BreakInside) -> Self {
6807        CssProperty::BreakInside(BreakInsideValue::Exact(input))
6808    }
6809    pub const fn const_orphans(input: Orphans) -> Self {
6810        CssProperty::Orphans(OrphansValue::Exact(input))
6811    }
6812    pub const fn const_widows(input: Widows) -> Self {
6813        CssProperty::Widows(WidowsValue::Exact(input))
6814    }
6815    pub const fn const_box_decoration_break(input: BoxDecorationBreak) -> Self {
6816        CssProperty::BoxDecorationBreak(BoxDecorationBreakValue::Exact(input))
6817    }
6818    pub const fn const_column_count(input: ColumnCount) -> Self {
6819        CssProperty::ColumnCount(ColumnCountValue::Exact(input))
6820    }
6821    pub const fn const_column_width(input: ColumnWidth) -> Self {
6822        CssProperty::ColumnWidth(ColumnWidthValue::Exact(input))
6823    }
6824    pub const fn const_column_span(input: ColumnSpan) -> Self {
6825        CssProperty::ColumnSpan(ColumnSpanValue::Exact(input))
6826    }
6827    pub const fn const_column_fill(input: ColumnFill) -> Self {
6828        CssProperty::ColumnFill(ColumnFillValue::Exact(input))
6829    }
6830    pub const fn const_column_rule_width(input: ColumnRuleWidth) -> Self {
6831        CssProperty::ColumnRuleWidth(ColumnRuleWidthValue::Exact(input))
6832    }
6833    pub const fn const_column_rule_style(input: ColumnRuleStyle) -> Self {
6834        CssProperty::ColumnRuleStyle(ColumnRuleStyleValue::Exact(input))
6835    }
6836    pub const fn const_column_rule_color(input: ColumnRuleColor) -> Self {
6837        CssProperty::ColumnRuleColor(ColumnRuleColorValue::Exact(input))
6838    }
6839    pub const fn const_flow_into(input: FlowInto) -> Self {
6840        CssProperty::FlowInto(FlowIntoValue::Exact(input))
6841    }
6842    pub const fn const_flow_from(input: FlowFrom) -> Self {
6843        CssProperty::FlowFrom(FlowFromValue::Exact(input))
6844    }
6845    pub fn const_shape_outside(input: ShapeOutside) -> Self {
6846        CssProperty::ShapeOutside(ShapeOutsideValue::Exact(input))
6847    }
6848    pub fn const_shape_inside(input: ShapeInside) -> Self {
6849        CssProperty::ShapeInside(ShapeInsideValue::Exact(input))
6850    }
6851    pub fn const_clip_path(input: ClipPath) -> Self {
6852        CssProperty::ClipPath(ClipPathValue::Exact(input))
6853    }
6854    pub const fn const_shape_margin(input: ShapeMargin) -> Self {
6855        CssProperty::ShapeMargin(ShapeMarginValue::Exact(input))
6856    }
6857    pub const fn const_shape_image_threshold(input: ShapeImageThreshold) -> Self {
6858        CssProperty::ShapeImageThreshold(ShapeImageThresholdValue::Exact(input))
6859    }
6860    pub const fn const_content(input: Content) -> Self {
6861        CssProperty::Content(ContentValue::Exact(input))
6862    }
6863    pub const fn const_counter_reset(input: CounterReset) -> Self {
6864        CssProperty::CounterReset(CounterResetValue::Exact(input))
6865    }
6866    pub const fn const_counter_increment(input: CounterIncrement) -> Self {
6867        CssProperty::CounterIncrement(CounterIncrementValue::Exact(input))
6868    }
6869    pub const fn const_list_style_type(input: StyleListStyleType) -> Self {
6870        CssProperty::ListStyleType(StyleListStyleTypeValue::Exact(input))
6871    }
6872    pub const fn const_list_style_position(input: StyleListStylePosition) -> Self {
6873        CssProperty::ListStylePosition(StyleListStylePositionValue::Exact(input))
6874    }
6875    pub const fn const_string_set(input: StringSet) -> Self {
6876        CssProperty::StringSet(StringSetValue::Exact(input))
6877    }
6878    pub const fn const_table_layout(input: LayoutTableLayout) -> Self {
6879        CssProperty::TableLayout(LayoutTableLayoutValue::Exact(input))
6880    }
6881    pub const fn const_border_collapse(input: StyleBorderCollapse) -> Self {
6882        CssProperty::BorderCollapse(StyleBorderCollapseValue::Exact(input))
6883    }
6884    pub const fn const_border_spacing(input: LayoutBorderSpacing) -> Self {
6885        CssProperty::BorderSpacing(LayoutBorderSpacingValue::Exact(input))
6886    }
6887    pub const fn const_caption_side(input: StyleCaptionSide) -> Self {
6888        CssProperty::CaptionSide(StyleCaptionSideValue::Exact(input))
6889    }
6890    pub const fn const_empty_cells(input: StyleEmptyCells) -> Self {
6891        CssProperty::EmptyCells(StyleEmptyCellsValue::Exact(input))
6892    }
6893}
6894
6895pub fn format_static_css_prop(prop: &CssProperty, tabs: usize) -> String {
6896    match prop {
6897        CssProperty::CaretColor(p) => format!(
6898            "CssProperty::CaretColor({})",
6899            print_css_property_value(p, tabs, "CaretColor")
6900        ),
6901        CssProperty::CaretWidth(p) => format!(
6902            "CssProperty::CaretWidth({})",
6903            print_css_property_value(p, tabs, "CaretWidth")
6904        ),
6905        CssProperty::CaretAnimationDuration(p) => format!(
6906            "CssProperty::CaretAnimationDuration({})",
6907            print_css_property_value(p, tabs, "CaretAnimationDuration")
6908        ),
6909        CssProperty::SelectionBackgroundColor(p) => format!(
6910            "CssProperty::SelectionBackgroundColor({})",
6911            print_css_property_value(p, tabs, "SelectionBackgroundColor")
6912        ),
6913        CssProperty::SelectionColor(p) => format!(
6914            "CssProperty::SelectionColor({})",
6915            print_css_property_value(p, tabs, "SelectionColor")
6916        ),
6917        CssProperty::SelectionRadius(p) => format!(
6918            "CssProperty::SelectionRadius({})",
6919            print_css_property_value(p, tabs, "SelectionRadius")
6920        ),
6921        CssProperty::TextJustify(p) => format!(
6922            "CssProperty::TextJustify({})",
6923            print_css_property_value(p, tabs, "LayoutTextJustify")
6924        ),
6925        CssProperty::TextColor(p) => format!(
6926            "CssProperty::TextColor({})",
6927            print_css_property_value(p, tabs, "StyleTextColor")
6928        ),
6929        CssProperty::FontSize(p) => format!(
6930            "CssProperty::FontSize({})",
6931            print_css_property_value(p, tabs, "StyleFontSize")
6932        ),
6933        CssProperty::FontFamily(p) => format!(
6934            "CssProperty::FontFamily({})",
6935            print_css_property_value(p, tabs, "StyleFontFamilyVec")
6936        ),
6937        CssProperty::TextAlign(p) => format!(
6938            "CssProperty::TextAlign({})",
6939            print_css_property_value(p, tabs, "StyleTextAlign")
6940        ),
6941        CssProperty::VerticalAlign(p) => format!(
6942            "CssProperty::VerticalAlign({})",
6943            print_css_property_value(p, tabs, "StyleVerticalAlign")
6944        ),
6945        CssProperty::LetterSpacing(p) => format!(
6946            "CssProperty::LetterSpacing({})",
6947            print_css_property_value(p, tabs, "StyleLetterSpacing")
6948        ),
6949        CssProperty::TextIndent(p) => format!(
6950            "CssProperty::TextIndent({})",
6951            print_css_property_value(p, tabs, "StyleTextIndent")
6952        ),
6953        CssProperty::InitialLetter(p) => format!(
6954            "CssProperty::InitialLetter({})",
6955            print_css_property_value(p, tabs, "StyleInitialLetter")
6956        ),
6957        CssProperty::LineClamp(p) => format!(
6958            "CssProperty::LineClamp({})",
6959            print_css_property_value(p, tabs, "StyleLineClamp")
6960        ),
6961        CssProperty::HangingPunctuation(p) => format!(
6962            "CssProperty::HangingPunctuation({})",
6963            print_css_property_value(p, tabs, "StyleHangingPunctuation")
6964        ),
6965        CssProperty::TextCombineUpright(p) => format!(
6966            "CssProperty::TextCombineUpright({})",
6967            print_css_property_value(p, tabs, "StyleTextCombineUpright")
6968        ),
6969        CssProperty::UnicodeBidi(p) => format!(
6970            "CssProperty::UnicodeBidi({})",
6971            print_css_property_value(p, tabs, "StyleUnicodeBidi")
6972        ),
6973        CssProperty::TextBoxTrim(p) => format!(
6974            "CssProperty::TextBoxTrim({})",
6975            print_css_property_value(p, tabs, "StyleTextBoxTrim")
6976        ),
6977        CssProperty::TextBoxEdge(p) => format!(
6978            "CssProperty::TextBoxEdge({})",
6979            print_css_property_value(p, tabs, "StyleTextBoxEdge")
6980        ),
6981        CssProperty::DominantBaseline(p) => format!(
6982            "CssProperty::DominantBaseline({})",
6983            print_css_property_value(p, tabs, "StyleDominantBaseline")
6984        ),
6985        CssProperty::AlignmentBaseline(p) => format!(
6986            "CssProperty::AlignmentBaseline({})",
6987            print_css_property_value(p, tabs, "StyleAlignmentBaseline")
6988        ),
6989        CssProperty::InitialLetterAlign(p) => format!(
6990            "CssProperty::InitialLetterAlign({})",
6991            print_css_property_value(p, tabs, "StyleInitialLetterAlign")
6992        ),
6993        CssProperty::InitialLetterWrap(p) => format!(
6994            "CssProperty::InitialLetterWrap({})",
6995            print_css_property_value(p, tabs, "StyleInitialLetterWrap")
6996        ),
6997        CssProperty::ScrollbarGutter(p) => format!(
6998            "CssProperty::ScrollbarGutter({})",
6999            print_css_property_value(p, tabs, "StyleScrollbarGutter")
7000        ),
7001        CssProperty::OverflowClipMargin(p) => format!(
7002            "CssProperty::OverflowClipMargin({})",
7003            print_css_property_value(p, tabs, "StyleOverflowClipMargin")
7004        ),
7005        CssProperty::Clip(p) => format!(
7006            "CssProperty::Clip({})",
7007            print_css_property_value(p, tabs, "StyleClipRect")
7008        ),
7009        CssProperty::ExclusionMargin(p) => format!(
7010            "CssProperty::ExclusionMargin({})",
7011            print_css_property_value(p, tabs, "StyleExclusionMargin")
7012        ),
7013        CssProperty::HyphenationLanguage(p) => format!(
7014            "CssProperty::HyphenationLanguage({})",
7015            print_css_property_value(p, tabs, "StyleHyphenationLanguage")
7016        ),
7017        CssProperty::LineHeight(p) => format!(
7018            "CssProperty::LineHeight({})",
7019            print_css_property_value(p, tabs, "StyleLineHeight")
7020        ),
7021        CssProperty::WordSpacing(p) => format!(
7022            "CssProperty::WordSpacing({})",
7023            print_css_property_value(p, tabs, "StyleWordSpacing")
7024        ),
7025        CssProperty::TabSize(p) => format!(
7026            "CssProperty::TabSize({})",
7027            print_css_property_value(p, tabs, "StyleTabSize")
7028        ),
7029        CssProperty::Cursor(p) => format!(
7030            "CssProperty::Cursor({})",
7031            print_css_property_value(p, tabs, "StyleCursor")
7032        ),
7033        CssProperty::Display(p) => format!(
7034            "CssProperty::Display({})",
7035            print_css_property_value(p, tabs, "LayoutDisplay")
7036        ),
7037        CssProperty::Float(p) => format!(
7038            "CssProperty::Float({})",
7039            print_css_property_value(p, tabs, "LayoutFloat")
7040        ),
7041        CssProperty::BoxSizing(p) => format!(
7042            "CssProperty::BoxSizing({})",
7043            print_css_property_value(p, tabs, "LayoutBoxSizing")
7044        ),
7045        CssProperty::Width(p) => format!(
7046            "CssProperty::Width({})",
7047            print_css_property_value(p, tabs, "LayoutWidth")
7048        ),
7049        CssProperty::Height(p) => format!(
7050            "CssProperty::Height({})",
7051            print_css_property_value(p, tabs, "LayoutHeight")
7052        ),
7053        CssProperty::MinWidth(p) => format!(
7054            "CssProperty::MinWidth({})",
7055            print_css_property_value(p, tabs, "LayoutMinWidth")
7056        ),
7057        CssProperty::MinHeight(p) => format!(
7058            "CssProperty::MinHeight({})",
7059            print_css_property_value(p, tabs, "LayoutMinHeight")
7060        ),
7061        CssProperty::MaxWidth(p) => format!(
7062            "CssProperty::MaxWidth({})",
7063            print_css_property_value(p, tabs, "LayoutMaxWidth")
7064        ),
7065        CssProperty::MaxHeight(p) => format!(
7066            "CssProperty::MaxHeight({})",
7067            print_css_property_value(p, tabs, "LayoutMaxHeight")
7068        ),
7069        CssProperty::Position(p) => format!(
7070            "CssProperty::Position({})",
7071            print_css_property_value(p, tabs, "LayoutPosition")
7072        ),
7073        CssProperty::Top(p) => format!(
7074            "CssProperty::Top({})",
7075            print_css_property_value(p, tabs, "LayoutTop")
7076        ),
7077        CssProperty::Right(p) => format!(
7078            "CssProperty::Right({})",
7079            print_css_property_value(p, tabs, "LayoutRight")
7080        ),
7081        CssProperty::Left(p) => format!(
7082            "CssProperty::Left({})",
7083            print_css_property_value(p, tabs, "LayoutLeft")
7084        ),
7085        CssProperty::Bottom(p) => format!(
7086            "CssProperty::Bottom({})",
7087            print_css_property_value(p, tabs, "LayoutInsetBottom")
7088        ),
7089        CssProperty::ZIndex(p) => format!(
7090            "CssProperty::ZIndex({})",
7091            print_css_property_value(p, tabs, "LayoutZIndex")
7092        ),
7093        CssProperty::FlexWrap(p) => format!(
7094            "CssProperty::FlexWrap({})",
7095            print_css_property_value(p, tabs, "LayoutFlexWrap")
7096        ),
7097        CssProperty::FlexDirection(p) => format!(
7098            "CssProperty::FlexDirection({})",
7099            print_css_property_value(p, tabs, "LayoutFlexDirection")
7100        ),
7101        CssProperty::FlexGrow(p) => format!(
7102            "CssProperty::FlexGrow({})",
7103            print_css_property_value(p, tabs, "LayoutFlexGrow")
7104        ),
7105        CssProperty::FlexShrink(p) => format!(
7106            "CssProperty::FlexShrink({})",
7107            print_css_property_value(p, tabs, "LayoutFlexShrink")
7108        ),
7109        CssProperty::JustifyContent(p) => format!(
7110            "CssProperty::JustifyContent({})",
7111            print_css_property_value(p, tabs, "LayoutJustifyContent")
7112        ),
7113        CssProperty::AlignItems(p) => format!(
7114            "CssProperty::AlignItems({})",
7115            print_css_property_value(p, tabs, "LayoutAlignItems")
7116        ),
7117        CssProperty::AlignContent(p) => format!(
7118            "CssProperty::AlignContent({})",
7119            print_css_property_value(p, tabs, "LayoutAlignContent")
7120        ),
7121        CssProperty::BackgroundContent(p) => format!(
7122            "CssProperty::BackgroundContent({})",
7123            print_css_property_value(p, tabs, "StyleBackgroundContentVec")
7124        ),
7125        CssProperty::BackgroundPosition(p) => format!(
7126            "CssProperty::BackgroundPosition({})",
7127            print_css_property_value(p, tabs, "StyleBackgroundPositionVec")
7128        ),
7129        CssProperty::BackgroundSize(p) => format!(
7130            "CssProperty::BackgroundSize({})",
7131            print_css_property_value(p, tabs, "StyleBackgroundSizeVec")
7132        ),
7133        CssProperty::BackgroundRepeat(p) => format!(
7134            "CssProperty::BackgroundRepeat({})",
7135            print_css_property_value(p, tabs, "StyleBackgroundRepeatVec")
7136        ),
7137        CssProperty::OverflowX(p) => format!(
7138            "CssProperty::OverflowX({})",
7139            print_css_property_value(p, tabs, "LayoutOverflow")
7140        ),
7141        CssProperty::OverflowY(p) => format!(
7142            "CssProperty::OverflowY({})",
7143            print_css_property_value(p, tabs, "LayoutOverflow")
7144        ),
7145        CssProperty::OverflowBlock(p) => format!(
7146            "CssProperty::OverflowBlock({})",
7147            print_css_property_value(p, tabs, "LayoutOverflow")
7148        ),
7149        CssProperty::OverflowInline(p) => format!(
7150            "CssProperty::OverflowInline({})",
7151            print_css_property_value(p, tabs, "LayoutOverflow")
7152        ),
7153        CssProperty::PaddingTop(p) => format!(
7154            "CssProperty::PaddingTop({})",
7155            print_css_property_value(p, tabs, "LayoutPaddingTop")
7156        ),
7157        CssProperty::PaddingLeft(p) => format!(
7158            "CssProperty::PaddingLeft({})",
7159            print_css_property_value(p, tabs, "LayoutPaddingLeft")
7160        ),
7161        CssProperty::PaddingRight(p) => format!(
7162            "CssProperty::PaddingRight({})",
7163            print_css_property_value(p, tabs, "LayoutPaddingRight")
7164        ),
7165        CssProperty::PaddingBottom(p) => format!(
7166            "CssProperty::PaddingBottom({})",
7167            print_css_property_value(p, tabs, "LayoutPaddingBottom")
7168        ),
7169        CssProperty::PaddingInlineStart(p) => format!(
7170            "CssProperty::PaddingInlineStart({})",
7171            print_css_property_value(p, tabs, "LayoutPaddingInlineStart")
7172        ),
7173        CssProperty::PaddingInlineEnd(p) => format!(
7174            "CssProperty::PaddingInlineEnd({})",
7175            print_css_property_value(p, tabs, "LayoutPaddingInlineEnd")
7176        ),
7177        CssProperty::MarginTop(p) => format!(
7178            "CssProperty::MarginTop({})",
7179            print_css_property_value(p, tabs, "LayoutMarginTop")
7180        ),
7181        CssProperty::MarginLeft(p) => format!(
7182            "CssProperty::MarginLeft({})",
7183            print_css_property_value(p, tabs, "LayoutMarginLeft")
7184        ),
7185        CssProperty::MarginRight(p) => format!(
7186            "CssProperty::MarginRight({})",
7187            print_css_property_value(p, tabs, "LayoutMarginRight")
7188        ),
7189        CssProperty::MarginBottom(p) => format!(
7190            "CssProperty::MarginBottom({})",
7191            print_css_property_value(p, tabs, "LayoutMarginBottom")
7192        ),
7193        CssProperty::BorderTopLeftRadius(p) => format!(
7194            "CssProperty::BorderTopLeftRadius({})",
7195            print_css_property_value(p, tabs, "StyleBorderTopLeftRadius")
7196        ),
7197        CssProperty::BorderTopRightRadius(p) => format!(
7198            "CssProperty::BorderTopRightRadius({})",
7199            print_css_property_value(p, tabs, "StyleBorderTopRightRadius")
7200        ),
7201        CssProperty::BorderBottomLeftRadius(p) => format!(
7202            "CssProperty::BorderBottomLeftRadius({})",
7203            print_css_property_value(p, tabs, "StyleBorderBottomLeftRadius")
7204        ),
7205        CssProperty::BorderBottomRightRadius(p) => format!(
7206            "CssProperty::BorderBottomRightRadius({})",
7207            print_css_property_value(p, tabs, "StyleBorderBottomRightRadius")
7208        ),
7209        CssProperty::BorderTopColor(p) => format!(
7210            "CssProperty::BorderTopColor({})",
7211            print_css_property_value(p, tabs, "StyleBorderTopColor")
7212        ),
7213        CssProperty::BorderRightColor(p) => format!(
7214            "CssProperty::BorderRightColor({})",
7215            print_css_property_value(p, tabs, "StyleBorderRightColor")
7216        ),
7217        CssProperty::BorderLeftColor(p) => format!(
7218            "CssProperty::BorderLeftColor({})",
7219            print_css_property_value(p, tabs, "StyleBorderLeftColor")
7220        ),
7221        CssProperty::BorderBottomColor(p) => format!(
7222            "CssProperty::BorderBottomColor({})",
7223            print_css_property_value(p, tabs, "StyleBorderBottomColor")
7224        ),
7225        CssProperty::BorderTopStyle(p) => format!(
7226            "CssProperty::BorderTopStyle({})",
7227            print_css_property_value(p, tabs, "StyleBorderTopStyle")
7228        ),
7229        CssProperty::BorderRightStyle(p) => format!(
7230            "CssProperty::BorderRightStyle({})",
7231            print_css_property_value(p, tabs, "StyleBorderRightStyle")
7232        ),
7233        CssProperty::BorderLeftStyle(p) => format!(
7234            "CssProperty::BorderLeftStyle({})",
7235            print_css_property_value(p, tabs, "StyleBorderLeftStyle")
7236        ),
7237        CssProperty::BorderBottomStyle(p) => format!(
7238            "CssProperty::BorderBottomStyle({})",
7239            print_css_property_value(p, tabs, "StyleBorderBottomStyle")
7240        ),
7241        CssProperty::BorderTopWidth(p) => format!(
7242            "CssProperty::BorderTopWidth({})",
7243            print_css_property_value(p, tabs, "LayoutBorderTopWidth")
7244        ),
7245        CssProperty::BorderRightWidth(p) => format!(
7246            "CssProperty::BorderRightWidth({})",
7247            print_css_property_value(p, tabs, "LayoutBorderRightWidth")
7248        ),
7249        CssProperty::BorderLeftWidth(p) => format!(
7250            "CssProperty::BorderLeftWidth({})",
7251            print_css_property_value(p, tabs, "LayoutBorderLeftWidth")
7252        ),
7253        CssProperty::BorderBottomWidth(p) => format!(
7254            "CssProperty::BorderBottomWidth({})",
7255            print_css_property_value(p, tabs, "LayoutBorderBottomWidth")
7256        ),
7257        CssProperty::BoxShadowLeft(p) => format!(
7258            "CssProperty::BoxShadowLeft({})",
7259            print_css_property_value(p, tabs, "StyleBoxShadow")
7260        ),
7261        CssProperty::BoxShadowRight(p) => format!(
7262            "CssProperty::BoxShadowRight({})",
7263            print_css_property_value(p, tabs, "StyleBoxShadow")
7264        ),
7265        CssProperty::BoxShadowTop(p) => format!(
7266            "CssProperty::BoxShadowTop({})",
7267            print_css_property_value(p, tabs, "StyleBoxShadow")
7268        ),
7269        CssProperty::BoxShadowBottom(p) => format!(
7270            "CssProperty::BoxShadowBottom({})",
7271            print_css_property_value(p, tabs, "StyleBoxShadow")
7272        ),
7273        CssProperty::ScrollbarWidth(p) => format!(
7274            "CssProperty::ScrollbarWidth({})",
7275            print_css_property_value(p, tabs, "LayoutScrollbarWidth")
7276        ),
7277        CssProperty::ScrollbarColor(p) => format!(
7278            "CssProperty::ScrollbarColor({})",
7279            print_css_property_value(p, tabs, "StyleScrollbarColor")
7280        ),
7281        CssProperty::ScrollbarVisibility(p) => format!(
7282            "CssProperty::ScrollbarVisibility({})",
7283            print_css_property_value(p, tabs, "ScrollbarVisibilityMode")
7284        ),
7285        CssProperty::ScrollbarFadeDelay(p) => format!(
7286            "CssProperty::ScrollbarFadeDelay({})",
7287            print_css_property_value(p, tabs, "ScrollbarFadeDelay")
7288        ),
7289        CssProperty::ScrollbarFadeDuration(p) => format!(
7290            "CssProperty::ScrollbarFadeDuration({})",
7291            print_css_property_value(p, tabs, "ScrollbarFadeDuration")
7292        ),
7293        CssProperty::ScrollbarTrack(p) => format!(
7294            "CssProperty::ScrollbarTrack({})",
7295            print_css_property_value(p, tabs, "StyleBackgroundContent")
7296        ),
7297        CssProperty::ScrollbarThumb(p) => format!(
7298            "CssProperty::ScrollbarThumb({})",
7299            print_css_property_value(p, tabs, "StyleBackgroundContent")
7300        ),
7301        CssProperty::ScrollbarButton(p) => format!(
7302            "CssProperty::ScrollbarButton({})",
7303            print_css_property_value(p, tabs, "StyleBackgroundContent")
7304        ),
7305        CssProperty::ScrollbarCorner(p) => format!(
7306            "CssProperty::ScrollbarCorner({})",
7307            print_css_property_value(p, tabs, "StyleBackgroundContent")
7308        ),
7309        CssProperty::ScrollbarResizer(p) => format!(
7310            "CssProperty::ScrollbarResizer({})",
7311            print_css_property_value(p, tabs, "StyleBackgroundContent")
7312        ),
7313        CssProperty::Opacity(p) => format!(
7314            "CssProperty::Opacity({})",
7315            print_css_property_value(p, tabs, "StyleOpacity")
7316        ),
7317        CssProperty::Visibility(p) => format!(
7318            "CssProperty::Visibility({})",
7319            print_css_property_value(p, tabs, "StyleVisibility")
7320        ),
7321        CssProperty::Transform(p) => format!(
7322            "CssProperty::Transform({})",
7323            print_css_property_value(p, tabs, "StyleTransformVec")
7324        ),
7325        CssProperty::TransformOrigin(p) => format!(
7326            "CssProperty::TransformOrigin({})",
7327            print_css_property_value(p, tabs, "StyleTransformOrigin")
7328        ),
7329        CssProperty::PerspectiveOrigin(p) => format!(
7330            "CssProperty::PerspectiveOrigin({})",
7331            print_css_property_value(p, tabs, "StylePerspectiveOrigin")
7332        ),
7333        CssProperty::BackfaceVisibility(p) => format!(
7334            "CssProperty::BackfaceVisibility({})",
7335            print_css_property_value(p, tabs, "StyleBackfaceVisibility")
7336        ),
7337        CssProperty::MixBlendMode(p) => format!(
7338            "CssProperty::MixBlendMode({})",
7339            print_css_property_value(p, tabs, "StyleMixBlendMode")
7340        ),
7341        CssProperty::Filter(p) => format!(
7342            "CssProperty::Filter({})",
7343            print_css_property_value(p, tabs, "StyleFilterVec")
7344        ),
7345        CssProperty::BackdropFilter(p) => format!(
7346            "CssProperty::Filter({})",
7347            print_css_property_value(p, tabs, "StyleFilterVec")
7348        ),
7349        CssProperty::TextShadow(p) => format!(
7350            "CssProperty::TextShadow({})",
7351            print_css_property_value(p, tabs, "StyleBoxShadow")
7352        ),
7353        CssProperty::Hyphens(p) => format!(
7354            "CssProperty::Hyphens({})",
7355            print_css_property_value(p, tabs, "StyleHyphens")
7356        ),
7357        CssProperty::WordBreak(p) => format!(
7358            "CssProperty::WordBreak({})",
7359            print_css_property_value(p, tabs, "StyleWordBreak")
7360        ),
7361        CssProperty::OverflowWrap(p) => format!(
7362            "CssProperty::OverflowWrap({})",
7363            print_css_property_value(p, tabs, "StyleOverflowWrap")
7364        ),
7365        CssProperty::LineBreak(p) => format!(
7366            "CssProperty::LineBreak({})",
7367            print_css_property_value(p, tabs, "StyleLineBreak")
7368        ),
7369        CssProperty::ObjectFit(p) => format!(
7370            "CssProperty::ObjectFit({})",
7371            print_css_property_value(p, tabs, "StyleObjectFit")
7372        ),
7373        CssProperty::ObjectPosition(p) => format!(
7374            "CssProperty::ObjectPosition({})",
7375            print_css_property_value(p, tabs, "StyleObjectPosition")
7376        ),
7377        CssProperty::AspectRatio(p) => format!(
7378            "CssProperty::AspectRatio({})",
7379            print_css_property_value(p, tabs, "StyleAspectRatio")
7380        ),
7381        CssProperty::TextOrientation(p) => format!(
7382            "CssProperty::TextOrientation({})",
7383            print_css_property_value(p, tabs, "StyleTextOrientation")
7384        ),
7385        CssProperty::TextAlignLast(p) => format!(
7386            "CssProperty::TextAlignLast({})",
7387            print_css_property_value(p, tabs, "StyleTextAlignLast")
7388        ),
7389        CssProperty::Direction(p) => format!(
7390            "CssProperty::Direction({})",
7391            print_css_property_value(p, tabs, "Direction")
7392        ),
7393        CssProperty::UserSelect(p) => format!(
7394            "CssProperty::UserSelect({})",
7395            print_css_property_value(p, tabs, "StyleUserSelect")
7396        ),
7397        CssProperty::TextDecoration(p) => format!(
7398            "CssProperty::TextDecoration({})",
7399            print_css_property_value(p, tabs, "StyleTextDecoration")
7400        ),
7401        CssProperty::WhiteSpace(p) => format!(
7402            "CssProperty::WhiteSpace({})",
7403            print_css_property_value(p, tabs, "WhiteSpace")
7404        ),
7405        CssProperty::FlexBasis(p) => format!(
7406            "CssProperty::FlexBasis({})",
7407            print_css_property_value(p, tabs, "LayoutFlexBasis")
7408        ),
7409        CssProperty::ColumnGap(p) => format!(
7410            "CssProperty::ColumnGap({})",
7411            print_css_property_value(p, tabs, "LayoutColumnGap")
7412        ),
7413        CssProperty::RowGap(p) => format!(
7414            "CssProperty::RowGap({})",
7415            print_css_property_value(p, tabs, "LayoutRowGap")
7416        ),
7417        CssProperty::GridTemplateColumns(p) => format!(
7418            "CssProperty::GridTemplateColumns({})",
7419            print_css_property_value(p, tabs, "LayoutGridTemplateColumns")
7420        ),
7421        CssProperty::GridTemplateRows(p) => format!(
7422            "CssProperty::GridTemplateRows({})",
7423            print_css_property_value(p, tabs, "LayoutGridTemplateRows")
7424        ),
7425        CssProperty::GridAutoFlow(p) => format!(
7426            "CssProperty::GridAutoFlow({})",
7427            print_css_property_value(p, tabs, "LayoutGridAutoFlow")
7428        ),
7429        CssProperty::JustifySelf(p) => format!(
7430            "CssProperty::JustifySelf({})",
7431            print_css_property_value(p, tabs, "LayoutJustifySelf")
7432        ),
7433        CssProperty::JustifyItems(p) => format!(
7434            "CssProperty::JustifyItems({})",
7435            print_css_property_value(p, tabs, "LayoutJustifyItems")
7436        ),
7437        CssProperty::Gap(p) => format!(
7438            "CssProperty::Gap({})",
7439            print_css_property_value(p, tabs, "LayoutGap")
7440        ),
7441        CssProperty::GridGap(p) => format!(
7442            "CssProperty::GridGap({})",
7443            print_css_property_value(p, tabs, "LayoutGap")
7444        ),
7445        CssProperty::AlignSelf(p) => format!(
7446            "CssProperty::AlignSelf({})",
7447            print_css_property_value(p, tabs, "LayoutAlignSelf")
7448        ),
7449        CssProperty::Font(p) => format!(
7450            "CssProperty::Font({})",
7451            print_css_property_value(p, tabs, "StyleFontFamilyVec")
7452        ),
7453        CssProperty::GridAutoRows(p) => format!(
7454            "CssProperty::GridAutoRows({})",
7455            print_css_property_value(p, tabs, "LayoutGridAutoRows")
7456        ),
7457        CssProperty::GridAutoColumns(p) => format!(
7458            "CssProperty::GridAutoColumns({})",
7459            print_css_property_value(p, tabs, "LayoutGridAutoColumns")
7460        ),
7461        CssProperty::GridRow(p) => format!(
7462            "CssProperty::GridRow({})",
7463            print_css_property_value(p, tabs, "LayoutGridRow")
7464        ),
7465        CssProperty::GridColumn(p) => format!(
7466            "CssProperty::GridColumn({})",
7467            print_css_property_value(p, tabs, "LayoutGridColumn")
7468        ),
7469        CssProperty::GridTemplateAreas(p) => format!(
7470            "CssProperty::GridTemplateAreas({})",
7471            print_css_property_value(p, tabs, "GridTemplateAreas")
7472        ),
7473        CssProperty::WritingMode(p) => format!(
7474            "CssProperty::WritingMode({})",
7475            print_css_property_value(p, tabs, "LayoutWritingMode")
7476        ),
7477        CssProperty::Clear(p) => format!(
7478            "CssProperty::Clear({})",
7479            print_css_property_value(p, tabs, "LayoutClear")
7480        ),
7481        CssProperty::BreakBefore(p) => format!(
7482            "CssProperty::BreakBefore({})",
7483            print_css_property_value(p, tabs, "PageBreak")
7484        ),
7485        CssProperty::BreakAfter(p) => format!(
7486            "CssProperty::BreakAfter({})",
7487            print_css_property_value(p, tabs, "PageBreak")
7488        ),
7489        CssProperty::BreakInside(p) => format!(
7490            "CssProperty::BreakInside({})",
7491            print_css_property_value(p, tabs, "BreakInside")
7492        ),
7493        CssProperty::Orphans(p) => format!(
7494            "CssProperty::Orphans({})",
7495            print_css_property_value(p, tabs, "Orphans")
7496        ),
7497        CssProperty::Widows(p) => format!(
7498            "CssProperty::Widows({})",
7499            print_css_property_value(p, tabs, "Widows")
7500        ),
7501        CssProperty::BoxDecorationBreak(p) => format!(
7502            "CssProperty::BoxDecorationBreak({})",
7503            print_css_property_value(p, tabs, "BoxDecorationBreak")
7504        ),
7505        CssProperty::ColumnCount(p) => format!(
7506            "CssProperty::ColumnCount({})",
7507            print_css_property_value(p, tabs, "ColumnCount")
7508        ),
7509        CssProperty::ColumnWidth(p) => format!(
7510            "CssProperty::ColumnWidth({})",
7511            print_css_property_value(p, tabs, "ColumnWidth")
7512        ),
7513        CssProperty::ColumnSpan(p) => format!(
7514            "CssProperty::ColumnSpan({})",
7515            print_css_property_value(p, tabs, "ColumnSpan")
7516        ),
7517        CssProperty::ColumnFill(p) => format!(
7518            "CssProperty::ColumnFill({})",
7519            print_css_property_value(p, tabs, "ColumnFill")
7520        ),
7521        CssProperty::ColumnRuleWidth(p) => format!(
7522            "CssProperty::ColumnRuleWidth({})",
7523            print_css_property_value(p, tabs, "ColumnRuleWidth")
7524        ),
7525        CssProperty::ColumnRuleStyle(p) => format!(
7526            "CssProperty::ColumnRuleStyle({})",
7527            print_css_property_value(p, tabs, "ColumnRuleStyle")
7528        ),
7529        CssProperty::ColumnRuleColor(p) => format!(
7530            "CssProperty::ColumnRuleColor({})",
7531            print_css_property_value(p, tabs, "ColumnRuleColor")
7532        ),
7533        CssProperty::FlowInto(p) => format!(
7534            "CssProperty::FlowInto({})",
7535            print_css_property_value(p, tabs, "FlowInto")
7536        ),
7537        CssProperty::FlowFrom(p) => format!(
7538            "CssProperty::FlowFrom({})",
7539            print_css_property_value(p, tabs, "FlowFrom")
7540        ),
7541        CssProperty::ShapeOutside(p) => format!(
7542            "CssProperty::ShapeOutside({})",
7543            print_css_property_value(p, tabs, "ShapeOutside")
7544        ),
7545        CssProperty::ShapeInside(p) => format!(
7546            "CssProperty::ShapeInside({})",
7547            print_css_property_value(p, tabs, "ShapeInside")
7548        ),
7549        CssProperty::ClipPath(p) => format!(
7550            "CssProperty::ClipPath({})",
7551            print_css_property_value(p, tabs, "ClipPath")
7552        ),
7553        CssProperty::ShapeMargin(p) => format!(
7554            "CssProperty::ShapeMargin({})",
7555            print_css_property_value(p, tabs, "ShapeMargin")
7556        ),
7557        CssProperty::ShapeImageThreshold(p) => format!(
7558            "CssProperty::ShapeImageThreshold({})",
7559            print_css_property_value(p, tabs, "ShapeImageThreshold")
7560        ),
7561        CssProperty::Content(p) => format!(
7562            "CssProperty::Content({})",
7563            print_css_property_value(p, tabs, "Content")
7564        ),
7565        CssProperty::CounterReset(p) => format!(
7566            "CssProperty::CounterReset({})",
7567            print_css_property_value(p, tabs, "CounterReset")
7568        ),
7569        CssProperty::CounterIncrement(p) => format!(
7570            "CssProperty::CounterIncrement({})",
7571            print_css_property_value(p, tabs, "CounterIncrement")
7572        ),
7573        CssProperty::ListStyleType(p) => format!(
7574            "CssProperty::ListStyleType({})",
7575            print_css_property_value(p, tabs, "StyleListStyleType")
7576        ),
7577        CssProperty::ListStylePosition(p) => format!(
7578            "CssProperty::ListStylePosition({})",
7579            print_css_property_value(p, tabs, "StyleListStylePosition")
7580        ),
7581        CssProperty::StringSet(p) => format!(
7582            "CssProperty::StringSet({})",
7583            print_css_property_value(p, tabs, "StringSet")
7584        ),
7585        CssProperty::TableLayout(p) => format!(
7586            "CssProperty::TableLayout({})",
7587            print_css_property_value(p, tabs, "LayoutTableLayout")
7588        ),
7589        CssProperty::BorderCollapse(p) => format!(
7590            "CssProperty::BorderCollapse({})",
7591            print_css_property_value(p, tabs, "StyleBorderCollapse")
7592        ),
7593        CssProperty::BorderSpacing(p) => format!(
7594            "CssProperty::BorderSpacing({})",
7595            print_css_property_value(p, tabs, "LayoutBorderSpacing")
7596        ),
7597        CssProperty::CaptionSide(p) => format!(
7598            "CssProperty::CaptionSide({})",
7599            print_css_property_value(p, tabs, "StyleCaptionSide")
7600        ),
7601        CssProperty::EmptyCells(p) => format!(
7602            "CssProperty::EmptyCells({})",
7603            print_css_property_value(p, tabs, "StyleEmptyCells")
7604        ),
7605        CssProperty::FontWeight(p) => format!(
7606            "CssProperty::FontWeight({})",
7607            print_css_property_value(p, tabs, "StyleFontWeight")
7608        ),
7609        CssProperty::FontStyle(p) => format!(
7610            "CssProperty::FontStyle({})",
7611            print_css_property_value(p, tabs, "StyleFontStyle")
7612        ),
7613    }
7614}
7615
7616fn print_css_property_value<T: FormatAsRustCode>(
7617    prop_val: &CssPropertyValue<T>,
7618    tabs: usize,
7619    property_value_type: &'static str,
7620) -> String {
7621    match prop_val {
7622        CssPropertyValue::Auto => format!("{}Value::Auto", property_value_type),
7623        CssPropertyValue::None => format!("{}Value::None", property_value_type),
7624        CssPropertyValue::Initial => format!("{}Value::Initial", property_value_type),
7625        CssPropertyValue::Inherit => format!("{}Value::Inherit", property_value_type),
7626        CssPropertyValue::Revert => format!("{}Value::Revert", property_value_type),
7627        CssPropertyValue::Unset => format!("{}Value::Unset", property_value_type),
7628        CssPropertyValue::Exact(t) => format!(
7629            "{}Value::Exact({})",
7630            property_value_type,
7631            t.format_as_rust_code(tabs)
7632        ),
7633    }
7634}