1use crate::{CompoundSelector, CssAtomSet, CssDiagnostic};
2use css_parse::{Cursor, Diagnostic, Parse, Parser, Result as ParserResult, T, pseudo_class, pseudo_element};
3use csskit_derives::{SemanticEq, ToCursors, ToSpan};
4
5pseudo_element!(
6 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
8 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
9 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
10#[derive(csskit_derives::NodeWithMetadata)]
11 pub enum WebkitPseudoElement {
12 CalendarDatePickerIndicator: CssAtomSet::_WebkitCalendarPickerIndicator,
13 CapsLockIndicator: CssAtomSet::_WebkitCapsLockIndicator,
14 ColorSwatch: CssAtomSet::_WebkitColorSwatch,
15 ColorSwatchWrapper: CssAtomSet::_WebkitColorSwatchWrapper,
16 ContactsAutoFillButton: CssAtomSet::_WebkitContactsAutoFillButton,
17 CredentialsAutoFillButton: CssAtomSet::_WebkitCredentialsAutoFillButton,
18 CreditCardAutoFillButton: CssAtomSet::_WebkitCreditCardAutoFillButton,
19 DateAndTimeValue: CssAtomSet::_WebkitDateAndTimeValue,
20 DatetimeEdit: CssAtomSet::_WebkitDatetimeEdit,
21 DatetimeEditDayField: CssAtomSet::_WebkitDatetimeEditDayField,
22 DatetimeEditFieldsWrapper: CssAtomSet::_WebkitDatetimeEditFieldsWrapper,
23 DatetimeEditHourField: CssAtomSet::_WebkitDatetimeEditHourField,
24 DatetimeEditMeridiemField: CssAtomSet::_WebkitDatetimeEditMeridiemField,
25 DatetimeEditMillisecondField: CssAtomSet::_WebkitDatetimeEditMillisecondField,
26 DatetimeEditMinute: CssAtomSet::_WebkitDatetimeEditMinute,
27 DatetimeEditMinuteField: CssAtomSet::_WebkitDatetimeEditMinuteField,
28 DatetimeEditMonthField: CssAtomSet::_WebkitDatetimeEditMonthField,
29 DatetimeEditSecondField: CssAtomSet::_WebkitDatetimeEditSecondField,
30 DatetimeEditText: CssAtomSet::_WebkitDatetimeEditText,
31 DatetimeEditYearField: CssAtomSet::_WebkitDatetimeEditYearField,
32 DetailsMarker: CssAtomSet::_WebkitDetailsMarker,
33 FileUploadButton: CssAtomSet::_WebkitFileUploadButton, GenericCueRoot: CssAtomSet::_WebkitGenericCueRoot,
35 InputPlaceholder: CssAtomSet::_WebkitInputPlaceholder, InnerSpinButton: CssAtomSet::_WebkitInnerSpinButton,
37 ListButton: CssAtomSet::_WebkitListButton,
38 MediaTextTrackContainer: CssAtomSet::_WebkitMediaTextTrackContainer,
39 MediaTextTrackDisplay: CssAtomSet::_WebkitMediaTextTrackDisplay,
40 MediaTextTrackDisplayBackdrop: CssAtomSet::_WebkitMediaTextTrackDisplayBackdrop,
41 MediaTextTrackRegion: CssAtomSet::_WebkitMediaTextTrackRegion,
42 MediaTextTrackRegionContainer: CssAtomSet::_WebkitMediaTextTrackRegionContainer,
43 MeterBar: CssAtomSet::_WebkitMeterBar,
44 MeterEvenLessGoodValue: CssAtomSet::_WebkitMeterEvenLessGoodValue,
45 MeterInnerElement: CssAtomSet::_WebkitMeterInnerElement,
46 MeterOptimumValue: CssAtomSet::_WebkitMeterOptimumValue,
47 MeterSuboptimumValue: CssAtomSet::_WebkitMeterSuboptimumValue,
48 OuterSpinButton: CssAtomSet::_WebkitOuterSpinButton, ProgressBar: CssAtomSet::_WebkitProgressBar,
50 ProgressInnerElement: CssAtomSet::_WebkitProgressInnerElement,
51 ProgressValue: CssAtomSet::_WebkitProgressValue,
52 Resizer: CssAtomSet::_WebkitResizer,
53 Scrollbar: CssAtomSet::_WebkitScrollbar,
54 ScrollbarButton: CssAtomSet::_WebkitScrollbarButton,
55 ScrollbarCorner: CssAtomSet::_WebkitScrollbarCorner,
56 ScrollbarThumb: CssAtomSet::_WebkitScrollbarThumb,
57 ScrollbarTrack: CssAtomSet::_WebkitScrollbarTrack,
58 ScrollbarTrackPiece: CssAtomSet::_WebkitScrollbarTrackPiece,
59 SearchCancelButton: CssAtomSet::_WebkitSearchCancelButton,
60 SearchDecoration: CssAtomSet::_WebkitSearchDecoration,
61 SearchResultsButton: CssAtomSet::_WebkitSearchResultsButton,
62 SliderContainer: CssAtomSet::_WebkitSliderContainer,
63 SliderRunnableTrack: CssAtomSet::_WebkitSliderRunnableTrack,
64 SliderThumb: CssAtomSet::_WebkitSliderThumb,
65 PasswordAutoFillButton: CssAtomSet::_WebkitPasswordAutoFillButton,
66 TextfieldDecorationContainer: CssAtomSet::_WebkitTextfieldDecorationContainer,
67 ValidationBubble: CssAtomSet::_WebkitValidationBubble,
68 ValidationBubbleArrow: CssAtomSet::_WebkitValidationBubbleArrow,
69 ValidationBubbleArrowClipper: CssAtomSet::_WebkitValidationBubbleArrowClipper,
70 ValidationBubbleBody: CssAtomSet::_WebkitValidationBubbleBody,
71 ValidationBubbleHeading: CssAtomSet::_WebkitValidationBubbleHeading,
72 ValidationBubbleIcon: CssAtomSet::_WebkitValidationBubbleIcon,
73 ValidationBubbleMessage: CssAtomSet::_WebkitValidationBubbleMessage,
74 ValidationBubbleTextBlock: CssAtomSet::_WebkitValidationBubbleTextBlock,
75 }
76);
77
78#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
80#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
81#[derive(csskit_derives::NodeWithMetadata)]
82pub enum WebkitFunctionalPseudoElement<'a> {
83 Distributed(WebkitDistrubutedFunctionalPseudoElement<'a>),
84}
85
86impl<'a> Parse<'a> for WebkitFunctionalPseudoElement<'a> {
87 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
88 where
89 I: Iterator<Item = Cursor> + Clone,
90 {
91 let colons = p.parse::<T![::]>()?;
92 let function = p.parse::<T![Function]>()?;
93 let c: Cursor = function.into();
94 if p.equals_atom(c, &CssAtomSet::_WebkitDistributed) {
95 let value = p.parse::<CompoundSelector>()?;
96 let close = p.parse_if_peek::<T![')']>()?;
97 Ok(Self::Distributed(WebkitDistrubutedFunctionalPseudoElement { colons, function, value, close }))
98 } else {
99 Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
100 }
101 }
102}
103
104#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
105#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
106#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
107#[derive(csskit_derives::NodeWithMetadata)]
108pub struct WebkitDistrubutedFunctionalPseudoElement<'a> {
109 #[cfg_attr(feature = "visitable", visit(skip))]
110 pub colons: T![::],
111 #[cfg_attr(feature = "visitable", visit(skip))]
112 pub function: T![Function],
113 pub value: CompoundSelector<'a>,
114 #[cfg_attr(feature = "visitable", visit(skip))]
115 pub close: Option<T![')']>,
116}
117
118#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable))]
119#[derive(ToCursors, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
120#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
121pub enum WebkitFunctionalPseudoClass<'a> {
122 Any(WebkitAnyFunctionalPseudoClass<'a>),
123}
124
125impl<'a> Parse<'a> for WebkitFunctionalPseudoClass<'a> {
126 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
127 where
128 I: Iterator<Item = Cursor> + Clone,
129 {
130 let colon = p.parse::<T![:]>()?;
131 let function = p.parse::<T![Function]>()?;
132 let c: Cursor = function.into();
133 if p.equals_atom(c, &CssAtomSet::_WebkitAny) {
134 let value = p.parse::<CompoundSelector>()?;
135 let close = p.parse_if_peek::<T![')']>()?;
136 Ok(Self::Any(WebkitAnyFunctionalPseudoClass { colon, function, value, close }))
137 } else {
138 Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
139 }
140 }
141}
142
143#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
144#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
145#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
146#[derive(csskit_derives::NodeWithMetadata)]
147pub struct WebkitAnyFunctionalPseudoClass<'a> {
148 pub colon: T![:],
149 pub function: T![Function],
150 pub value: CompoundSelector<'a>,
151 pub close: Option<T![')']>,
152}
153
154pseudo_class!(
155 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
157 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
158 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
159#[derive(csskit_derives::NodeWithMetadata)]
160 pub enum WebkitPseudoClass {
161 AnimatingFullScreenTransition: CssAtomSet::_WebkitAnimatingFullScreenTransition,
162 AnyLink: CssAtomSet::_WebkitAnyLink, Autofill: CssAtomSet::_WebkitAutofill, AutofillAndObscured: CssAtomSet::_WebkitAutofillAndObscured,
165 AutofillStrongPassword: CssAtomSet::_WebkitAutofillStrongPassword,
166 AutofillStrongPasswordViewable: CssAtomSet::_WebkitAutofillStrongPasswordViewable,
167 Drag: CssAtomSet::_WebkitDrag,
168 FullPageMedia: CssAtomSet::_WebkitFullPageMedia,
169 FullScreen: CssAtomSet::_WebkitFullScreen,
170 FullScreenAncestor: CssAtomSet::_WebkitFullScreenAncestor,
171 FullScreenControlsHidden: CssAtomSet::_WebkitFullScreenControlsHidden,
172 FullScreenDocument: CssAtomSet::_WebkitFullScreenDocument,
173 }
174);