1use crate::{CompoundSelector, diagnostics};
2use css_parse::{Cursor, Parse, Parser, Result as ParserResult, T, pseudo_class, pseudo_element};
3use csskit_derives::{ToCursors, Visitable};
4
5pseudo_element!(
6 #[derive(Visitable)]
8 #[visit(self)]
9 pub enum WebkitPseudoElement {
10 CalendarDatePickerIndicator: "-webkit-calendar-picker-indicator",
11 CapsLockIndicator: "-webkit-caps-lock-indicator",
12 ColorSwatch: "-webkit-color-swatch",
13 ColorSwatchWrapper: "-webkit-color-swatch-wrapper",
14 ContactsAutoFillButton: "-webkit-contacts-auto-fill-button",
15 CredentialsAutoFillButton: "-webkit-credentials-auto-fill-button",
16 CreditCardAutoFillButton: "-webkit-credit-card-auto-fill-button",
17 DateAndTimeValue: "-webkit-date-and-time-value",
18 DatetimeEdit: "-webkit-datetime-edit",
19 DatetimeEditDayField: "-webkit-datetime-edit-day-field",
20 DatetimeEditFieldsWrapper: "-webkit-datetime-edit-fields-wrapper",
21 DatetimeEditHourField: "-webkit-datetime-edit-hour-field",
22 DatetimeEditMeridiemField: "-webkit-datetime-edit-meridiem-field",
23 DatetimeEditMillisecondField: "-webkit-datetime-edit-millisecond-field",
24 DatetimeEditMinute: "-webkit-datetime-edit-minute",
25 DatetimeEditMinuteField: "-webkit-datetime-edit-minute-field",
26 DatetimeEditMonthField: "-webkit-datetime-edit-month-field",
27 DatetimeEditSecondField: "-webkit-datetime-edit-second-field",
28 DatetimeEditText: "-webkit-datetime-edit-text",
29 DatetimeEditYearField: "-webkit-datetime-edit-year-field",
30 DetailsMarker: "-webkit-details-marker",
31 FileUploadButton: "-webkit-file-upload-button", GenericCueRoot: "-webkit-generic-cue-root",
33 InputPlaceholder: "-webkit-input-placeholder", InnerSpinButton: "-webkit-inner-spin-button",
35 ListButton: "-webkit-list-button",
36 MediaTextTrackContainer: "-webkit-media-text-track-container",
37 MediaTextTrackDisplay: "-webkit-media-text-track-display",
38 MediaTextTrackDisplayBackdrop: "-webkit-media-text-track-display-backdrop",
39 MediaTextTrackRegion: "-webkit-media-text-track-region",
40 MediaTextTrackRegionContainer: "-webkit-media-text-track-region-container",
41 MeterBar: "-webkit-meter-bar",
42 MeterEvenLessGoodValue: "-webkit-meter-even-less-good-value",
43 MeterInnerElement: "-webkit-meter-inner-element",
44 MeterOptimumValue: "-webkit-meter-optimum-value",
45 MeterSuboptimumValue: "-webkit-meter-suboptimum-value",
46 OuterSpinButton: "-webkit-outer-spin-button", ProgressBar: "-webkit-progress-bar",
48 ProgressInnerElement: "-webkit-progress-inner-element",
49 ProgressValue: "-webkit-progress-value",
50 Resizer: "-webkit-resizer",
51 Scrollbar: "-webkit-scrollbar",
52 ScrollbarButton: "-webkit-scrollbar-button",
53 ScrollbarCorner: "-webkit-scrollbar-corner",
54 ScrollbarThumb: "-webkit-scrollbar-thumb",
55 ScrollbarTrack: "-webkit-scrollbar-track",
56 ScrollbarTrackPiece: "-webkit-scrollbar-track-piece",
57 SearchCancelButton: "-webkit-search-cancel-button",
58 SearchDecoration: "-webkit-search-decoration",
59 SearchResultsButton: "-webkit-search-results-button",
60 SliderContainer: "-webkit-slider-container",
61 SliderRunnableTrack: "-webkit-slider-runnable-track",
62 SliderThumb: "-webkit-slider-thumb",
63 PasswordAutoFillButton: "-webkit-password-auto-fill-button",
64 TextfieldDecorationContainer: "-webkit-textfield-decoration-container",
65 ValidationBubble: "-webkit-validation-bubble",
66 ValidationBubbleArrow: "-webkit-validation-bubble-arrow",
67 ValidationBubbleArrowClipper: "-webkit-validation-bubble-arrow-clipper",
68 ValidationBubbleBody: "-webkit-validation-bubble-body",
69 ValidationBubbleHeading: "-webkit-validation-bubble-heading",
70 ValidationBubbleIcon: "-webkit-validation-bubble-icon",
71 ValidationBubbleMessage: "-webkit-validation-bubble-message",
72 ValidationBubbleTextBlock: "-webkit-validation-bubble-text-block",
73 }
74);
75
76#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
77#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
78#[visit]
79pub enum WebkitFunctionalPseudoElement<'a> {
80 Distributed(WebkitDistrubutedFunctionalPseudoElement<'a>),
81}
82
83impl<'a> Parse<'a> for WebkitFunctionalPseudoElement<'a> {
84 fn parse(p: &mut Parser<'a>) -> ParserResult<Self> {
85 let colons = p.parse::<T![::]>()?;
86 let function = p.parse::<T![Function]>()?;
87 let c: Cursor = function.into();
88 if p.eq_ignore_ascii_case(c, "-webkit-distributed") {
89 let value = p.parse::<CompoundSelector>()?;
90 let close = p.parse_if_peek::<T![')']>()?;
91 Ok(Self::Distributed(WebkitDistrubutedFunctionalPseudoElement { colons, function, value, close }))
92 } else {
93 Err(diagnostics::UnexpectedFunction(p.parse_str(c).into(), c))?
94 }
95 }
96}
97
98#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
99#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
100#[visit]
101pub struct WebkitDistrubutedFunctionalPseudoElement<'a> {
102 #[visit(skip)]
103 pub colons: T![::],
104 #[visit(skip)]
105 pub function: T![Function],
106 pub value: CompoundSelector<'a>,
107 #[visit(skip)]
108 pub close: Option<T![')']>,
109}
110
111#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
113#[visit]
114pub enum WebkitFunctionalPseudoClass<'a> {
115 Any(WebkitAnyFunctionalPseudoClass<'a>),
116}
117
118impl<'a> Parse<'a> for WebkitFunctionalPseudoClass<'a> {
119 fn parse(p: &mut Parser<'a>) -> ParserResult<Self> {
120 let colon = p.parse::<T![:]>()?;
121 let function = p.parse::<T![Function]>()?;
122 let c: Cursor = function.into();
123 if p.eq_ignore_ascii_case(c, "-webkit-any") {
124 let value = p.parse::<CompoundSelector>()?;
125 let close = p.parse_if_peek::<T![')']>()?;
126 Ok(Self::Any(WebkitAnyFunctionalPseudoClass { colon, function, value, close }))
127 } else {
128 Err(diagnostics::UnexpectedFunction(p.parse_str(c).into(), c))?
129 }
130 }
131}
132
133#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
134#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
135#[visit(self)]
136pub struct WebkitAnyFunctionalPseudoClass<'a> {
137 pub colon: T![:],
138 pub function: T![Function],
139 pub value: CompoundSelector<'a>,
140 pub close: Option<T![')']>,
141}
142
143pseudo_class!(
144 #[derive(Visitable)]
146 #[visit(self)]
147 pub enum WebkitPseudoClass {
148 AnimatingFullScreenTransition: "-webkit-animating-full-screen-transition",
149 AnyLink: "-webkit-any-link", Autofill: "-webkit-autofill", AutofillAndObscured: "-webkit-autofill-and-obscured",
152 AutofillStrongPassword: "-webkit-autofill-strong-password",
153 AutofillStrongPasswordViewable: "-webkit-autofill-strong-password-viewable",
154 Drag: "-webkit-drag",
155 FullPageMedia: "-webkit-full-page-media",
156 FullScreen: "-webkit-full-screen",
157 FullScreenAncestor: "-webkit-full-screen-ancestor",
158 FullScreenControlsHidden: "-webkit-full-screen-controls-hidden",
159 FullScreenDocument: "-webkit-full-screen-document",
160 }
161);