Skip to main content

oxc_css_parser/
ast.rs

1//! All kinds of AST nodes are here.
2
3use crate::{pos::Span, tokenizer::TokenWithSpan};
4use oxc_allocator::{Box, Vec};
5#[cfg(feature = "serialize")]
6use serde::Serialize;
7
8#[derive(Debug)]
9#[cfg_attr(feature = "serialize", derive(Serialize))]
10#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
11pub struct AnPlusB {
12    pub span: Span,
13    pub a: i32,
14    pub b: i32,
15}
16
17#[derive(Debug)]
18#[cfg_attr(feature = "serialize", derive(Serialize))]
19#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
20pub struct AtRule<'a> {
21    pub span: Span,
22    pub name: Ident<'a>,
23    pub prelude: Option<AtRulePrelude<'a>>,
24    pub block: Option<SimpleBlock<'a>>,
25}
26
27#[derive(Debug)]
28#[cfg_attr(feature = "serialize", derive(Serialize))]
29#[cfg_attr(feature = "serialize", serde(untagged))]
30pub enum AtRulePrelude<'a> {
31    Charset(Str<'a>),
32    ColorProfile(ColorProfilePrelude<'a>),
33    Container(ContainerPrelude<'a>),
34    CounterStyle(InterpolableIdent<'a>),
35    CustomMedia(Box<'a, CustomMedia<'a>>),
36    CustomSelector(Box<'a, CustomSelectorPrelude<'a>>),
37    Document(DocumentPrelude<'a>),
38    FontFeatureValues(FontFamilyName<'a>),
39    FontPaletteValues(InterpolableIdent<'a>),
40    Import(Box<'a, ImportPrelude<'a>>),
41    Keyframes(KeyframesName<'a>),
42    Layer(LayerNames<'a>),
43    LessImport(Box<'a, LessImportPrelude<'a>>),
44    LessPlugin(Box<'a, LessPlugin<'a>>),
45    Media(MediaQueryList<'a>),
46    Namespace(Box<'a, NamespacePrelude<'a>>),
47    Nest(SelectorList<'a>),
48    Page(PageSelectorList<'a>),
49    PositionTry(InterpolableIdent<'a>),
50    Property(InterpolableIdent<'a>),
51    SassAtRoot(SassAtRoot<'a>),
52    SassContent(SassContent<'a>),
53    SassEach(Box<'a, SassEach<'a>>),
54    SassExpr(Box<'a, ComponentValue<'a>>),
55    SassExtend(Box<'a, SassExtend<'a>>),
56    SassFor(Box<'a, SassFor<'a>>),
57    SassForward(Box<'a, SassForward<'a>>),
58    SassFunction(Box<'a, SassFunction<'a>>),
59    SassImport(SassImportPrelude<'a>),
60    SassInclude(Box<'a, SassInclude<'a>>),
61    SassMixin(Box<'a, SassMixin<'a>>),
62    SassUse(Box<'a, SassUse<'a>>),
63    Scope(Box<'a, ScopePrelude<'a>>),
64    ScrollTimeline(InterpolableIdent<'a>),
65    Supports(SupportsCondition<'a>),
66    Unknown(Box<'a, UnknownAtRulePrelude<'a>>),
67}
68
69#[derive(Debug)]
70#[cfg_attr(feature = "serialize", derive(Serialize))]
71#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
72pub struct AttributeSelector<'a> {
73    pub span: Span,
74    pub name: WqName<'a>,
75    pub matcher: Option<AttributeSelectorMatcher>,
76    pub value: Option<AttributeSelectorValue<'a>>,
77    pub modifier: Option<AttributeSelectorModifier<'a>>,
78}
79
80#[derive(Debug)]
81#[cfg_attr(feature = "serialize", derive(Serialize))]
82#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
83pub struct AttributeSelectorMatcher {
84    pub span: Span,
85    pub kind: AttributeSelectorMatcherKind,
86}
87
88#[derive(Debug)]
89#[cfg_attr(feature = "serialize", derive(Serialize))]
90pub enum AttributeSelectorMatcherKind {
91    /// `=`
92    Exact,
93    /// `~=`
94    MatchWord,
95    /// `|=`
96    ExactOrPrefixThenHyphen,
97    /// `^=`
98    Prefix,
99    /// `$=`
100    Suffix,
101    /// `*=`
102    Substring,
103}
104
105#[derive(Debug)]
106#[cfg_attr(feature = "serialize", derive(Serialize))]
107#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
108pub struct AttributeSelectorModifier<'a> {
109    pub span: Span,
110    pub ident: InterpolableIdent<'a>,
111}
112
113#[derive(Debug)]
114#[cfg_attr(feature = "serialize", derive(Serialize))]
115#[cfg_attr(feature = "serialize", serde(untagged))]
116pub enum AttributeSelectorValue<'a> {
117    Ident(InterpolableIdent<'a>),
118    Str(InterpolableStr<'a>),
119    Number(Number<'a>),
120    Dimension(Dimension<'a>),
121    Percentage(Percentage<'a>),
122    LessEscapedStr(LessEscapedStr<'a>),
123    TokenSeq(TokenSeq<'a>),
124}
125
126#[derive(Debug)]
127#[cfg_attr(feature = "serialize", derive(Serialize))]
128#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
129pub struct BracketBlock<'a> {
130    pub span: Span,
131    pub value: Vec<'a, ComponentValue<'a>>,
132}
133
134#[derive(Debug)]
135#[cfg_attr(feature = "serialize", derive(Serialize))]
136#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
137pub struct Calc<'a> {
138    pub span: Span,
139    pub left: Box<'a, ComponentValue<'a>>,
140    pub op: CalcOperator,
141    pub right: Box<'a, ComponentValue<'a>>,
142}
143
144#[derive(Debug)]
145#[cfg_attr(feature = "serialize", derive(Serialize))]
146#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
147pub struct CalcOperator {
148    pub span: Span,
149    pub kind: CalcOperatorKind,
150}
151
152#[derive(Debug)]
153#[cfg_attr(feature = "serialize", derive(Serialize))]
154pub enum CalcOperatorKind {
155    Plus,
156    Minus,
157    Multiply,
158    Division,
159    /// Sass modulo (`%`) inside a math function's arguments (`max(1px, 7px % 4)`).
160    Modulo,
161}
162
163#[derive(Debug)]
164#[cfg_attr(feature = "serialize", derive(Serialize))]
165#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
166pub struct ClassSelector<'a> {
167    pub span: Span,
168    pub name: InterpolableIdent<'a>,
169}
170
171#[derive(Debug)]
172#[cfg_attr(feature = "serialize", derive(Serialize))]
173#[cfg_attr(feature = "serialize", serde(untagged))]
174pub enum ColorProfilePrelude<'a> {
175    DashedIdent(InterpolableIdent<'a>),
176    DeviceCmyk(Ident<'a>),
177}
178
179#[derive(Debug)]
180#[cfg_attr(feature = "serialize", derive(Serialize))]
181#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
182pub struct Combinator {
183    pub span: Span,
184    pub kind: CombinatorKind,
185}
186
187#[derive(Debug, PartialEq, Eq)]
188#[cfg_attr(feature = "serialize", derive(Serialize))]
189pub enum CombinatorKind {
190    /// ` `
191    Descendant,
192    /// `+`
193    NextSibling,
194    /// `>`
195    Child,
196    /// `~`
197    LaterSibling,
198    /// `||`
199    Column,
200    /// `/deep/` (deprecated shadow-piercing descendant)
201    Deep,
202    /// `^` (deprecated shadow child)
203    ShadowChild,
204    /// `^^` (deprecated shadow descendant)
205    ShadowDescendant,
206}
207
208#[derive(Debug)]
209#[cfg_attr(feature = "serialize", derive(Serialize))]
210#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
211pub struct ComplexSelector<'a> {
212    pub span: Span,
213    pub children: Vec<'a, ComplexSelectorChild<'a>>,
214}
215
216#[derive(Debug)]
217#[cfg_attr(feature = "serialize", derive(Serialize))]
218#[cfg_attr(feature = "serialize", serde(untagged))]
219pub enum ComplexSelectorChild<'a> {
220    CompoundSelector(CompoundSelector<'a>),
221    Combinator(Combinator),
222}
223
224#[derive(Debug)]
225#[cfg_attr(feature = "serialize", derive(Serialize))]
226#[cfg_attr(feature = "serialize", serde(untagged))]
227pub enum ComponentValue<'a> {
228    BracketBlock(BracketBlock<'a>),
229    Calc(Calc<'a>),
230    Delimiter(Delimiter),
231    Dimension(Dimension<'a>),
232    Function(Function<'a>),
233    HexColor(HexColor<'a>),
234    IdSelector(IdSelector<'a>),
235    ImportantAnnotation(ImportantAnnotation<'a>),
236    InterpolableIdent(InterpolableIdent<'a>),
237    InterpolableStr(InterpolableStr<'a>),
238    LayerName(LayerName<'a>),
239    LessAnonymousMixin(LessAnonymousMixin<'a>),
240    LessBinaryOperation(LessBinaryOperation<'a>),
241    LessCondition(Box<'a, LessCondition<'a>>),
242    LessDetachedRuleset(LessDetachedRuleset<'a>),
243    LessEscapedStr(LessEscapedStr<'a>),
244    LessJavaScriptSnippet(LessJavaScriptSnippet<'a>),
245    LessList(LessList<'a>),
246    LessMixinCall(Box<'a, LessMixinCall<'a>>),
247    LessNamespaceValue(Box<'a, LessNamespaceValue<'a>>),
248    LessVariableCall(LessVariableCall<'a>),
249    LessNegativeValue(LessNegativeValue<'a>),
250    LessParenthesizedOperation(LessParenthesizedOperation<'a>),
251    LessPercentKeyword(LessPercentKeyword),
252    LessPropertyVariable(LessPropertyVariable<'a>),
253    LessVariable(LessVariable<'a>),
254    LessVariableVariable(LessVariableVariable<'a>),
255    Number(Number<'a>),
256    Percentage(Percentage<'a>),
257    Placeholder(Placeholder<'a>),
258    PostcssSimpleVar(PostcssSimpleVar<'a>),
259    Ratio(Ratio<'a>),
260    SassArbitraryArgument(SassArbitraryArgument<'a>),
261    SassBinaryExpression(SassBinaryExpression<'a>),
262    SassKeywordArgument(SassKeywordArgument<'a>),
263    SassList(SassList<'a>),
264    SassMap(SassMap<'a>),
265    SassQualifiedName(Box<'a, SassQualifiedName<'a>>),
266    SassNestingDeclaration(SassNestingDeclaration<'a>),
267    SassParenthesizedExpression(SassParenthesizedExpression<'a>),
268    SassParentSelector(NestingSelector<'a>),
269    SassUnaryExpression(SassUnaryExpression<'a>),
270    SassVariable(SassVariable<'a>),
271    TokenWithSpan(TokenWithSpan<'a>),
272    UnicodeRange(UnicodeRange<'a>),
273    Url(Box<'a, Url<'a>>),
274}
275
276#[derive(Debug)]
277#[cfg_attr(feature = "serialize", derive(Serialize))]
278#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
279pub struct ComponentValues<'a> {
280    pub span: Span,
281    pub values: Vec<'a, ComponentValue<'a>>,
282}
283
284#[derive(Debug)]
285#[cfg_attr(feature = "serialize", derive(Serialize))]
286#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
287pub struct CompoundSelector<'a> {
288    pub span: Span,
289    pub children: Vec<'a, SimpleSelector<'a>>,
290}
291
292#[derive(Debug)]
293#[cfg_attr(feature = "serialize", derive(Serialize))]
294#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
295pub struct CompoundSelectorList<'a> {
296    pub span: Span,
297    pub selectors: Vec<'a, CompoundSelector<'a>>,
298    pub comma_spans: Vec<'a, Span>,
299}
300
301#[derive(Debug)]
302#[cfg_attr(feature = "serialize", derive(Serialize))]
303#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
304pub struct ContainerCondition<'a> {
305    pub span: Span,
306    pub conditions: Vec<'a, ContainerConditionKind<'a>>,
307}
308
309#[derive(Debug)]
310#[cfg_attr(feature = "serialize", derive(Serialize))]
311#[cfg_attr(feature = "serialize", serde(untagged))]
312pub enum ContainerConditionKind<'a> {
313    QueryInParens(QueryInParens<'a>),
314    And(ContainerConditionAnd<'a>),
315    Or(ContainerConditionOr<'a>),
316    Not(ContainerConditionNot<'a>),
317}
318
319#[derive(Debug)]
320#[cfg_attr(feature = "serialize", derive(Serialize))]
321#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
322pub struct ContainerConditionAnd<'a> {
323    pub span: Span,
324    pub keyword: Ident<'a>,
325    pub query_in_parens: QueryInParens<'a>,
326}
327
328#[derive(Debug)]
329#[cfg_attr(feature = "serialize", derive(Serialize))]
330#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
331pub struct ContainerConditionNot<'a> {
332    pub span: Span,
333    pub keyword: Ident<'a>,
334    pub query_in_parens: QueryInParens<'a>,
335}
336
337#[derive(Debug)]
338#[cfg_attr(feature = "serialize", derive(Serialize))]
339#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
340pub struct ContainerConditionOr<'a> {
341    pub span: Span,
342    pub keyword: Ident<'a>,
343    pub query_in_parens: QueryInParens<'a>,
344}
345
346#[derive(Debug)]
347#[cfg_attr(feature = "serialize", derive(Serialize))]
348#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
349pub struct ContainerPrelude<'a> {
350    pub span: Span,
351    pub name: Option<InterpolableIdent<'a>>,
352    pub condition: Option<ContainerCondition<'a>>,
353}
354
355#[derive(Debug)]
356#[cfg_attr(feature = "serialize", derive(Serialize))]
357#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
358pub struct CustomMedia<'a> {
359    pub span: Span,
360    pub name: InterpolableIdent<'a>,
361    pub value: CustomMediaValue<'a>,
362}
363
364#[derive(Debug)]
365#[cfg_attr(feature = "serialize", derive(Serialize))]
366#[cfg_attr(feature = "serialize", serde(untagged))]
367pub enum CustomMediaValue<'a> {
368    MediaQueryList(MediaQueryList<'a>),
369    True(Ident<'a>),
370    False(Ident<'a>),
371}
372
373#[derive(Debug)]
374#[cfg_attr(feature = "serialize", derive(Serialize))]
375#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
376pub struct CustomSelector<'a> {
377    pub span: Span,
378    pub prefix_arg: Option<CustomSelectorArg<'a>>,
379    pub name: Ident<'a>,
380    pub args: Option<CustomSelectorArgs<'a>>,
381}
382
383#[derive(Debug)]
384#[cfg_attr(feature = "serialize", derive(Serialize))]
385#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
386pub struct CustomSelectorArg<'a> {
387    pub span: Span,
388    pub name: Ident<'a>,
389}
390
391#[derive(Debug)]
392#[cfg_attr(feature = "serialize", derive(Serialize))]
393#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
394pub struct CustomSelectorArgs<'a> {
395    pub span: Span,
396    pub args: Vec<'a, CustomSelectorArg<'a>>,
397    pub comma_spans: Vec<'a, Span>,
398}
399
400#[derive(Debug)]
401#[cfg_attr(feature = "serialize", derive(Serialize))]
402#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
403pub struct CustomSelectorPrelude<'a> {
404    pub span: Span,
405    pub custom_selector: CustomSelector<'a>,
406    pub selector: SelectorList<'a>,
407}
408
409#[derive(Debug)]
410#[cfg_attr(feature = "serialize", derive(Serialize))]
411#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
412pub struct Declaration<'a> {
413    pub span: Span,
414    pub name: InterpolableIdent<'a>,
415    /// Legacy IE hack prefix glued to the property name, e.g. `'*'` in `*color: red`.
416    #[cfg_attr(feature = "serialize", serde(skip_serializing_if = "Option::is_none"))]
417    pub name_prefix: Option<char>,
418    pub name_suffix: Option<char>,
419    pub colon_span: Span,
420    pub value: Vec<'a, ComponentValue<'a>>,
421    pub important: Option<ImportantAnnotation<'a>>,
422    pub less_property_merge: Option<LessPropertyMerge>,
423}
424
425#[derive(Debug)]
426#[cfg_attr(feature = "serialize", derive(Serialize))]
427#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
428pub struct Delimiter {
429    pub span: Span,
430    pub kind: DelimiterKind,
431}
432
433#[derive(Debug)]
434#[cfg_attr(feature = "serialize", derive(Serialize))]
435pub enum DelimiterKind {
436    Comma,
437    Solidus,
438    Semicolon,
439}
440
441#[derive(Debug)]
442#[cfg_attr(feature = "serialize", derive(Serialize))]
443#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
444pub struct Dimension<'a> {
445    pub span: Span,
446    pub value: Number<'a>,
447    pub unit: Ident<'a>,
448    pub kind: DimensionKind,
449}
450
451#[derive(Debug)]
452#[cfg_attr(feature = "serialize", derive(Serialize))]
453pub enum DimensionKind {
454    Length,
455    Angle,
456    Duration,
457    Frequency,
458    Resolution,
459    Flex,
460    Unknown,
461}
462
463#[derive(Debug)]
464#[cfg_attr(feature = "serialize", derive(Serialize))]
465#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
466pub struct DocumentPrelude<'a> {
467    pub span: Span,
468    pub matchers: Vec<'a, DocumentPreludeMatcher<'a>>,
469    pub comma_spans: Vec<'a, Span>,
470}
471
472#[derive(Debug)]
473#[cfg_attr(feature = "serialize", derive(Serialize))]
474#[cfg_attr(feature = "serialize", serde(untagged))]
475pub enum DocumentPreludeMatcher<'a> {
476    Url(Url<'a>),
477    Function(Function<'a>),
478}
479
480#[derive(Debug)]
481#[cfg_attr(feature = "serialize", derive(Serialize))]
482#[cfg_attr(feature = "serialize", serde(untagged))]
483pub enum FontFamilyName<'a> {
484    Str(InterpolableStr<'a>),
485    Unquoted(UnquotedFontFamilyName<'a>),
486}
487
488#[derive(Debug)]
489#[cfg_attr(feature = "serialize", derive(Serialize))]
490#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
491pub struct Function<'a> {
492    pub span: Span,
493    pub name: FunctionName<'a>,
494    pub args: Vec<'a, ComponentValue<'a>>,
495}
496
497#[derive(Debug)]
498#[cfg_attr(feature = "serialize", derive(Serialize))]
499#[cfg_attr(feature = "serialize", serde(untagged))]
500pub enum FunctionName<'a> {
501    Ident(InterpolableIdent<'a>),
502    SassQualifiedName(Box<'a, SassQualifiedName<'a>>),
503    LessListFunction(LessListFunction),
504    LessFormatFunction(LessFormatFunction),
505}
506
507#[derive(Debug)]
508#[cfg_attr(feature = "serialize", derive(Serialize))]
509#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
510pub struct HexColor<'a> {
511    pub span: Span,
512    pub value: &'a str,
513    pub raw: &'a str,
514}
515
516#[derive(Debug)]
517#[cfg_attr(feature = "serialize", derive(Serialize))]
518#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
519pub struct Ident<'a> {
520    pub span: Span,
521    pub name: &'a str,
522    pub raw: &'a str,
523}
524
525#[derive(Debug)]
526#[cfg_attr(feature = "serialize", derive(Serialize))]
527#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
528pub struct ImportPrelude<'a> {
529    pub span: Span,
530    pub href: ImportPreludeHref<'a>,
531    pub layer: Option<ImportPreludeLayer<'a>>,
532    pub supports: Option<ImportPreludeSupports<'a>>,
533    pub media: Option<MediaQueryList<'a>>,
534    /// Import modifiers that don't fit the `layer()`/`supports()`/media-query
535    /// grammar, kept as raw component values — reference compilers accept an
536    /// arbitrary mix of idents, functions, and parens here, and a comma may
537    /// even chain further imports (`@import "a" b c(d), "e" supports(f: g);`).
538    /// When present, `layer`/`supports`/`media` are `None` and the whole
539    /// post-URL tail lives here.
540    pub modifiers: Option<ComponentValues<'a>>,
541}
542
543#[derive(Debug)]
544#[cfg_attr(feature = "serialize", derive(Serialize))]
545#[cfg_attr(feature = "serialize", serde(untagged))]
546pub enum ImportPreludeHref<'a> {
547    Str(InterpolableStr<'a>),
548    Url(Url<'a>),
549    /// Sass only: `url(...)` whose content is not a parsable URL but is
550    /// valid SassScript, e.g. `@import url($dir+"/path");`.
551    Function(Function<'a>),
552}
553
554#[derive(Debug)]
555#[cfg_attr(feature = "serialize", derive(Serialize))]
556#[cfg_attr(feature = "serialize", serde(untagged))]
557pub enum ImportPreludeLayer<'a> {
558    Empty(Ident<'a>),
559    WithName(Function<'a>),
560}
561
562#[derive(Debug)]
563#[cfg_attr(feature = "serialize", derive(Serialize))]
564#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
565pub struct ImportPreludeSupports<'a> {
566    pub span: Span,
567    pub kind: ImportPreludeSupportsKind<'a>,
568}
569
570#[derive(Debug)]
571#[cfg_attr(feature = "serialize", derive(Serialize))]
572#[cfg_attr(feature = "serialize", serde(untagged))]
573pub enum ImportPreludeSupportsKind<'a> {
574    SupportsCondition(SupportsCondition<'a>),
575    Declaration(Declaration<'a>),
576}
577
578#[derive(Debug)]
579#[cfg_attr(feature = "serialize", derive(Serialize))]
580#[cfg_attr(feature = "serialize", serde(untagged))]
581pub enum InterpolableIdent<'a> {
582    Literal(Ident<'a>),
583    SassInterpolated(SassInterpolatedIdent<'a>),
584    LessInterpolated(LessInterpolatedIdent<'a>),
585    Placeholder(Placeholder<'a>),
586}
587
588/// An atomic backtick-delimited template placeholder node (see
589/// [`ParserOptions::template_placeholder`](crate::config::ParserOptions)),
590/// carrying the parsed decimal index. Appears in value, selector, and
591/// statement positions where a downstream formatter substitutes interpolations.
592#[derive(Debug)]
593#[cfg_attr(feature = "serialize", derive(Serialize))]
594#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
595pub struct Placeholder<'a> {
596    pub span: Span,
597    pub index: u32,
598    /// An ident-continuation run glued directly after the placeholder
599    /// (`` `PLACEHOLDER-0`px `` -> index 0, suffix `"px"`), empty when none.
600    /// Mirrors `#{$x}px` being a single identifier rather than two tokens.
601    pub suffix: &'a str,
602}
603
604#[derive(Debug)]
605#[cfg_attr(feature = "serialize", derive(Serialize))]
606#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
607pub struct InterpolableIdentStaticPart<'a> {
608    pub span: Span,
609    pub value: &'a str,
610    pub raw: &'a str,
611}
612
613#[derive(Debug)]
614#[cfg_attr(feature = "serialize", derive(Serialize))]
615#[cfg_attr(feature = "serialize", serde(untagged))]
616pub enum InterpolableStr<'a> {
617    Literal(Str<'a>),
618    SassInterpolated(SassInterpolatedStr<'a>),
619    LessInterpolated(LessInterpolatedStr<'a>),
620}
621
622#[derive(Debug)]
623#[cfg_attr(feature = "serialize", derive(Serialize))]
624#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
625pub struct InterpolableStrStaticPart<'a> {
626    pub span: Span,
627    pub value: &'a str,
628    pub raw: &'a str,
629}
630
631#[derive(Debug)]
632#[cfg_attr(feature = "serialize", derive(Serialize))]
633#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
634pub struct InterpolableUrlStaticPart<'a> {
635    pub span: Span,
636    pub value: &'a str,
637    pub raw: &'a str,
638}
639
640#[derive(Debug)]
641#[cfg_attr(feature = "serialize", derive(Serialize))]
642#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
643pub struct IdSelector<'a> {
644    pub span: Span,
645    pub name: InterpolableIdent<'a>,
646}
647
648#[derive(Debug)]
649#[cfg_attr(feature = "serialize", derive(Serialize))]
650#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
651pub struct ImportantAnnotation<'a> {
652    pub span: Span,
653    pub ident: Ident<'a>,
654}
655
656#[derive(Debug)]
657#[cfg_attr(feature = "serialize", derive(Serialize))]
658#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
659pub struct KeyframeBlock<'a> {
660    pub span: Span,
661    pub selectors: Vec<'a, KeyframeSelector<'a>>,
662    pub comma_spans: Vec<'a, Span>,
663    pub block: SimpleBlock<'a>,
664}
665
666#[derive(Debug)]
667#[cfg_attr(feature = "serialize", derive(Serialize))]
668#[cfg_attr(feature = "serialize", serde(untagged))]
669pub enum KeyframeSelector<'a> {
670    Ident(InterpolableIdent<'a>),
671    Percentage(Percentage<'a>),
672    TimelineRange(KeyframeTimelineRange<'a>),
673}
674
675/// A scroll-driven animations keyframe selector: `<timeline-range-name>
676/// <percentage>` (`entry 0%`, `exit-crossing 100%`).
677#[derive(Debug)]
678#[cfg_attr(feature = "serialize", derive(Serialize))]
679#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
680pub struct KeyframeTimelineRange<'a> {
681    pub span: Span,
682    pub name: InterpolableIdent<'a>,
683    pub percentage: Percentage<'a>,
684}
685
686#[derive(Debug)]
687#[cfg_attr(feature = "serialize", derive(Serialize))]
688#[cfg_attr(feature = "serialize", serde(untagged))]
689pub enum KeyframesName<'a> {
690    Ident(InterpolableIdent<'a>),
691    Str(InterpolableStr<'a>),
692    LessVariable(LessVariable<'a>),
693    LessEscapedStr(LessEscapedStr<'a>),
694}
695
696#[derive(Debug)]
697#[cfg_attr(feature = "serialize", derive(Serialize))]
698#[cfg_attr(feature = "serialize", serde(untagged))]
699pub enum LanguageRange<'a> {
700    Str(InterpolableStr<'a>),
701    Ident(InterpolableIdent<'a>),
702}
703
704#[derive(Debug)]
705#[cfg_attr(feature = "serialize", derive(Serialize))]
706#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
707pub struct LanguageRangeList<'a> {
708    pub span: Span,
709    pub ranges: Vec<'a, LanguageRange<'a>>,
710    pub comma_spans: Vec<'a, Span>,
711}
712
713#[derive(Debug)]
714#[cfg_attr(feature = "serialize", derive(Serialize))]
715#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
716pub struct LayerName<'a> {
717    pub span: Span,
718    pub idents: Vec<'a, InterpolableIdent<'a>>,
719}
720
721#[derive(Debug)]
722#[cfg_attr(feature = "serialize", derive(Serialize))]
723#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
724pub struct LayerNames<'a> {
725    pub span: Span,
726    pub names: Vec<'a, LayerName<'a>>,
727    pub comma_spans: Vec<'a, Span>,
728}
729
730#[derive(Debug)]
731#[cfg_attr(feature = "serialize", derive(Serialize))]
732#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
733pub struct LessBinaryCondition<'a> {
734    pub span: Span,
735    pub left: Box<'a, LessCondition<'a>>,
736    pub op: LessBinaryConditionOperator,
737    pub right: Box<'a, LessCondition<'a>>,
738}
739
740#[derive(Debug)]
741#[cfg_attr(feature = "serialize", derive(Serialize))]
742#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
743pub struct LessBinaryConditionOperator {
744    pub span: Span,
745    pub kind: LessBinaryConditionOperatorKind,
746}
747
748#[derive(Debug)]
749#[cfg_attr(feature = "serialize", derive(Serialize))]
750pub enum LessBinaryConditionOperatorKind {
751    GreaterThan,
752    GreaterThanOrEqual,
753    LessThan,
754    LessThanOrEqual,
755    Equal,
756    EqualOrGreaterThan,
757    EqualOrLessThan,
758    And,
759    Or,
760}
761
762#[derive(Debug)]
763#[cfg_attr(feature = "serialize", derive(Serialize))]
764#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
765pub struct LessAnonymousMixin<'a> {
766    pub span: Span,
767    pub params: LessMixinParameters<'a>,
768    pub block: SimpleBlock<'a>,
769}
770
771#[derive(Debug)]
772#[cfg_attr(feature = "serialize", derive(Serialize))]
773#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
774pub struct LessBinaryOperation<'a> {
775    pub span: Span,
776    pub left: Box<'a, ComponentValue<'a>>,
777    pub op: LessOperationOperator,
778    pub right: Box<'a, ComponentValue<'a>>,
779}
780
781#[derive(Debug)]
782#[cfg_attr(feature = "serialize", derive(Serialize))]
783#[cfg_attr(feature = "serialize", serde(untagged))]
784pub enum LessCondition<'a> {
785    Binary(LessBinaryCondition<'a>),
786    Negated(LessNegatedCondition<'a>),
787    Parenthesized(LessParenthesizedCondition<'a>),
788    Value(ComponentValue<'a>),
789}
790
791#[derive(Debug)]
792#[cfg_attr(feature = "serialize", derive(Serialize))]
793#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
794pub struct LessConditionalQualifiedRule<'a> {
795    pub span: Span,
796    pub selector: SelectorList<'a>,
797    pub guard: LessConditions<'a>,
798    pub block: SimpleBlock<'a>,
799}
800
801#[derive(Debug)]
802#[cfg_attr(feature = "serialize", derive(Serialize))]
803#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
804pub struct LessConditions<'a> {
805    pub span: Span,
806    pub conditions: Vec<'a, LessCondition<'a>>,
807    pub when_span: Span,
808    pub comma_spans: Vec<'a, Span>,
809}
810
811#[derive(Debug)]
812#[cfg_attr(feature = "serialize", derive(Serialize))]
813#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
814pub struct LessDetachedRuleset<'a> {
815    pub span: Span,
816    pub block: SimpleBlock<'a>,
817}
818
819#[derive(Debug)]
820#[cfg_attr(feature = "serialize", derive(Serialize))]
821#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
822pub struct LessEscapedStr<'a> {
823    pub span: Span,
824    pub str: Str<'a>,
825}
826
827#[derive(Debug)]
828#[cfg_attr(feature = "serialize", derive(Serialize))]
829#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
830pub struct LessExtend<'a> {
831    pub span: Span,
832    pub selector: ComplexSelector<'a>,
833    pub all: Option<Ident<'a>>,
834}
835
836#[derive(Debug)]
837#[cfg_attr(feature = "serialize", derive(Serialize))]
838#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
839pub struct LessExtendList<'a> {
840    pub span: Span,
841    pub elements: Vec<'a, LessExtend<'a>>,
842    pub comma_spans: Vec<'a, Span>,
843}
844
845#[derive(Debug)]
846#[cfg_attr(feature = "serialize", derive(Serialize))]
847#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
848pub struct LessExtendRule<'a> {
849    pub span: Span,
850    pub nesting_selector: NestingSelector<'a>,
851    pub name_of_extend: Ident<'a>,
852    pub extend: LessExtendList<'a>,
853}
854
855#[derive(Debug)]
856#[cfg_attr(feature = "serialize", derive(Serialize))]
857#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
858pub struct LessFormatFunction {
859    pub span: Span,
860}
861
862#[derive(Debug)]
863#[cfg_attr(feature = "serialize", derive(Serialize))]
864#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
865pub struct LessImportOptions<'a> {
866    pub span: Span,
867    pub names: Vec<'a, Ident<'a>>,
868    pub comma_spans: Vec<'a, Span>,
869}
870
871#[derive(Debug)]
872#[cfg_attr(feature = "serialize", derive(Serialize))]
873#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
874pub struct LessImportPrelude<'a> {
875    pub span: Span,
876    pub href: ImportPreludeHref<'a>,
877    pub options: LessImportOptions<'a>,
878    pub media: Option<MediaQueryList<'a>>,
879}
880
881#[derive(Debug)]
882#[cfg_attr(feature = "serialize", derive(Serialize))]
883#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
884pub struct LessInterpolatedIdent<'a> {
885    pub span: Span,
886    pub elements: Vec<'a, LessInterpolatedIdentElement<'a>>,
887}
888
889#[derive(Debug)]
890#[cfg_attr(feature = "serialize", derive(Serialize))]
891#[cfg_attr(feature = "serialize", serde(untagged))]
892pub enum LessInterpolatedIdentElement<'a> {
893    Variable(LessVariableInterpolation<'a>),
894    Property(LessPropertyInterpolation<'a>),
895    Static(InterpolableIdentStaticPart<'a>),
896}
897
898#[derive(Debug)]
899#[cfg_attr(feature = "serialize", derive(Serialize))]
900#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
901pub struct LessInterpolatedStr<'a> {
902    pub span: Span,
903    pub elements: Vec<'a, LessInterpolatedStrElement<'a>>,
904}
905
906#[derive(Debug)]
907#[cfg_attr(feature = "serialize", derive(Serialize))]
908#[cfg_attr(feature = "serialize", serde(untagged))]
909pub enum LessInterpolatedStrElement<'a> {
910    Variable(LessVariableInterpolation<'a>),
911    Property(LessPropertyInterpolation<'a>),
912    Static(InterpolableStrStaticPart<'a>),
913}
914
915#[derive(Debug)]
916#[cfg_attr(feature = "serialize", derive(Serialize))]
917#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
918pub struct LessJavaScriptSnippet<'a> {
919    pub span: Span,
920    pub code: &'a str,
921    pub raw: &'a str,
922    pub escaped: bool,
923}
924
925#[derive(Debug)]
926#[cfg_attr(feature = "serialize", derive(Serialize))]
927#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
928pub struct LessList<'a> {
929    pub span: Span,
930    pub elements: Vec<'a, ComponentValue<'a>>,
931    pub comma_spans: Option<Vec<'a, Span>>,
932}
933
934#[derive(Debug)]
935#[cfg_attr(feature = "serialize", derive(Serialize))]
936#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
937pub struct LessListFunction {
938    pub span: Span,
939}
940
941#[derive(Debug)]
942#[cfg_attr(feature = "serialize", derive(Serialize))]
943#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
944pub struct LessLookup<'a> {
945    pub span: Span,
946    pub name: Option<LessLookupName<'a>>,
947}
948
949#[derive(Debug)]
950#[cfg_attr(feature = "serialize", derive(Serialize))]
951#[cfg_attr(feature = "serialize", serde(untagged))]
952pub enum LessLookupName<'a> {
953    LessVariable(LessVariable<'a>),
954    LessVariableVariable(LessVariableVariable<'a>),
955    LessPropertyVariable(LessPropertyVariable<'a>),
956    LessPropertyInterpolation(LessPropertyInterpolation<'a>),
957    Ident(Ident<'a>),
958}
959
960#[derive(Debug)]
961#[cfg_attr(feature = "serialize", derive(Serialize))]
962#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
963pub struct LessLookups<'a> {
964    pub span: Span,
965    pub lookups: Vec<'a, LessLookup<'a>>,
966}
967
968#[derive(Debug)]
969#[cfg_attr(feature = "serialize", derive(Serialize))]
970#[cfg_attr(feature = "serialize", serde(untagged))]
971pub enum LessMixinArgument<'a> {
972    Named(LessMixinNamedArgument<'a>),
973    Value(ComponentValue<'a>),
974    Variadic(LessMixinVariadicArgument<'a>),
975}
976
977#[derive(Debug)]
978#[cfg_attr(feature = "serialize", derive(Serialize))]
979#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
980pub struct LessMixinArguments<'a> {
981    pub span: Span,
982    pub args: Vec<'a, LessMixinArgument<'a>>,
983    pub is_comma_separated: bool,
984    pub separator_spans: Vec<'a, Span>,
985}
986
987#[derive(Debug)]
988#[cfg_attr(feature = "serialize", derive(Serialize))]
989#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
990pub struct LessMixinCall<'a> {
991    pub span: Span,
992    pub callee: LessMixinCallee<'a>,
993    pub args: Option<LessMixinArguments<'a>>,
994    pub important: Option<ImportantAnnotation<'a>>,
995}
996
997#[derive(Debug)]
998#[cfg_attr(feature = "serialize", derive(Serialize))]
999#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1000pub struct LessMixinCallee<'a> {
1001    pub span: Span,
1002    pub children: Vec<'a, LessMixinCalleeChild<'a>>,
1003}
1004
1005#[derive(Debug)]
1006#[cfg_attr(feature = "serialize", derive(Serialize))]
1007#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1008pub struct LessMixinCalleeChild<'a> {
1009    pub span: Span,
1010    pub name: LessMixinName<'a>,
1011    pub combinator: Option<Combinator>,
1012}
1013
1014#[derive(Debug)]
1015#[cfg_attr(feature = "serialize", derive(Serialize))]
1016#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1017pub struct LessMixinDefinition<'a> {
1018    pub span: Span,
1019    pub name: LessMixinName<'a>,
1020    pub params: LessMixinParameters<'a>,
1021    pub guard: Option<LessConditions<'a>>,
1022    pub block: SimpleBlock<'a>,
1023}
1024
1025#[derive(Debug)]
1026#[cfg_attr(feature = "serialize", derive(Serialize))]
1027#[cfg_attr(feature = "serialize", serde(untagged))]
1028pub enum LessMixinName<'a> {
1029    ClassSelector(ClassSelector<'a>),
1030    IdSelector(IdSelector<'a>),
1031}
1032
1033#[derive(Debug)]
1034#[cfg_attr(feature = "serialize", derive(Serialize))]
1035#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1036pub struct LessMixinNamedArgument<'a> {
1037    pub span: Span,
1038    pub name: LessMixinParameterName<'a>,
1039    pub colon_span: Span,
1040    pub value: ComponentValue<'a>,
1041}
1042
1043#[derive(Debug)]
1044#[cfg_attr(feature = "serialize", derive(Serialize))]
1045#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1046pub struct LessMixinNamedParameter<'a> {
1047    pub span: Span,
1048    pub name: LessMixinParameterName<'a>,
1049    pub value: Option<LessMixinNamedParameterDefaultValue<'a>>,
1050}
1051
1052#[derive(Debug)]
1053#[cfg_attr(feature = "serialize", derive(Serialize))]
1054#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1055pub struct LessMixinNamedParameterDefaultValue<'a> {
1056    pub span: Span,
1057    pub colon_span: Span,
1058    pub value: ComponentValue<'a>,
1059}
1060
1061#[derive(Debug)]
1062#[cfg_attr(feature = "serialize", derive(Serialize))]
1063#[cfg_attr(feature = "serialize", serde(untagged))]
1064pub enum LessMixinParameter<'a> {
1065    Named(LessMixinNamedParameter<'a>),
1066    Unnamed(LessMixinUnnamedParameter<'a>),
1067    Variadic(LessMixinVariadicParameter<'a>),
1068}
1069
1070#[derive(Debug)]
1071#[cfg_attr(feature = "serialize", derive(Serialize))]
1072#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1073pub struct LessMixinParameters<'a> {
1074    pub span: Span,
1075    pub params: Vec<'a, LessMixinParameter<'a>>,
1076    pub is_comma_separated: bool,
1077    pub separator_spans: Vec<'a, Span>,
1078}
1079
1080#[derive(Debug)]
1081#[cfg_attr(feature = "serialize", derive(Serialize))]
1082#[cfg_attr(feature = "serialize", serde(untagged))]
1083pub enum LessMixinParameterName<'a> {
1084    Variable(LessVariable<'a>),
1085    PropertyVariable(LessPropertyVariable<'a>),
1086}
1087
1088#[derive(Debug)]
1089#[cfg_attr(feature = "serialize", derive(Serialize))]
1090#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1091pub struct LessMixinUnnamedParameter<'a> {
1092    pub span: Span,
1093    pub value: ComponentValue<'a>,
1094}
1095
1096#[derive(Debug)]
1097#[cfg_attr(feature = "serialize", derive(Serialize))]
1098#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1099pub struct LessMixinVariadicArgument<'a> {
1100    pub span: Span,
1101    pub name: LessMixinParameterName<'a>,
1102}
1103
1104#[derive(Debug)]
1105#[cfg_attr(feature = "serialize", derive(Serialize))]
1106#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1107pub struct LessMixinVariadicParameter<'a> {
1108    pub span: Span,
1109    pub name: Option<LessMixinParameterName<'a>>,
1110}
1111
1112#[derive(Debug)]
1113#[cfg_attr(feature = "serialize", derive(Serialize))]
1114#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1115pub struct LessNamespaceValue<'a> {
1116    pub span: Span,
1117    pub callee: LessNamespaceValueCallee<'a>,
1118    pub lookups: LessLookups<'a>,
1119}
1120
1121#[derive(Debug)]
1122#[cfg_attr(feature = "serialize", derive(Serialize))]
1123#[cfg_attr(feature = "serialize", serde(untagged))]
1124pub enum LessNamespaceValueCallee<'a> {
1125    LessMixinCall(LessMixinCall<'a>),
1126    LessVariable(LessVariable<'a>),
1127}
1128
1129#[derive(Debug)]
1130#[cfg_attr(feature = "serialize", derive(Serialize))]
1131#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1132pub struct LessNegatedCondition<'a> {
1133    pub span: Span,
1134    pub condition: Box<'a, LessCondition<'a>>,
1135}
1136
1137#[derive(Debug)]
1138#[cfg_attr(feature = "serialize", derive(Serialize))]
1139#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1140pub struct LessNegativeValue<'a> {
1141    pub span: Span,
1142    pub value: Box<'a, ComponentValue<'a>>,
1143}
1144
1145#[derive(Debug)]
1146#[cfg_attr(feature = "serialize", derive(Serialize))]
1147#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1148pub struct LessOperationOperator {
1149    pub span: Span,
1150    pub kind: LessOperationOperatorKind,
1151}
1152
1153#[derive(Debug)]
1154#[cfg_attr(feature = "serialize", derive(Serialize))]
1155pub enum LessOperationOperatorKind {
1156    Multiply,
1157    Division,
1158    Plus,
1159    Minus,
1160}
1161
1162#[derive(Debug)]
1163#[cfg_attr(feature = "serialize", derive(Serialize))]
1164#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1165pub struct LessParenthesizedCondition<'a> {
1166    pub span: Span,
1167    pub condition: Box<'a, LessCondition<'a>>,
1168}
1169
1170#[derive(Debug)]
1171#[cfg_attr(feature = "serialize", derive(Serialize))]
1172#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1173pub struct LessParenthesizedOperation<'a> {
1174    pub span: Span,
1175    pub operation: Box<'a, ComponentValue<'a>>,
1176}
1177
1178#[derive(Debug)]
1179#[cfg_attr(feature = "serialize", derive(Serialize))]
1180#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1181pub struct LessPercentKeyword {
1182    pub span: Span,
1183}
1184
1185#[derive(Debug)]
1186#[cfg_attr(feature = "serialize", derive(Serialize))]
1187#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1188pub struct LessPlugin<'a> {
1189    pub span: Span,
1190    pub path: LessPluginPath<'a>,
1191    pub args: Option<TokenSeq<'a>>,
1192}
1193
1194#[derive(Debug)]
1195#[cfg_attr(feature = "serialize", derive(Serialize))]
1196#[cfg_attr(feature = "serialize", serde(untagged))]
1197pub enum LessPluginPath<'a> {
1198    Str(Str<'a>),
1199    Url(Url<'a>),
1200}
1201
1202#[derive(Debug)]
1203#[cfg_attr(feature = "serialize", derive(Serialize))]
1204#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1205pub struct LessPropertyInterpolation<'a> {
1206    pub span: Span,
1207    pub name: Ident<'a>,
1208}
1209
1210#[derive(Debug)]
1211#[cfg_attr(feature = "serialize", derive(Serialize))]
1212#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1213pub struct LessPropertyMerge {
1214    pub span: Span,
1215    pub kind: LessPropertyMergeKind,
1216}
1217
1218#[derive(Debug)]
1219#[cfg_attr(feature = "serialize", derive(Serialize))]
1220pub enum LessPropertyMergeKind {
1221    Comma,
1222    Space,
1223}
1224
1225#[derive(Debug)]
1226#[cfg_attr(feature = "serialize", derive(Serialize))]
1227#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1228pub struct LessPropertyVariable<'a> {
1229    pub span: Span,
1230    pub name: Ident<'a>,
1231}
1232
1233#[derive(Debug)]
1234#[cfg_attr(feature = "serialize", derive(Serialize))]
1235#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1236pub struct LessVariable<'a> {
1237    pub span: Span,
1238    pub name: Ident<'a>,
1239}
1240
1241#[derive(Debug)]
1242#[cfg_attr(feature = "serialize", derive(Serialize))]
1243#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1244pub struct LessVariableCall<'a> {
1245    pub span: Span,
1246    pub variable: LessVariable<'a>,
1247}
1248
1249#[derive(Debug)]
1250#[cfg_attr(feature = "serialize", derive(Serialize))]
1251#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1252pub struct LessVariableDeclaration<'a> {
1253    pub span: Span,
1254    pub name: LessVariable<'a>,
1255    pub colon_span: Span,
1256    pub value: ComponentValue<'a>,
1257}
1258
1259#[derive(Debug)]
1260#[cfg_attr(feature = "serialize", derive(Serialize))]
1261#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1262pub struct LessVariableInterpolation<'a> {
1263    pub span: Span,
1264    pub name: Ident<'a>,
1265}
1266
1267#[derive(Debug)]
1268#[cfg_attr(feature = "serialize", derive(Serialize))]
1269#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1270pub struct LessVariableVariable<'a> {
1271    pub span: Span,
1272    pub variable: LessVariable<'a>,
1273}
1274
1275#[derive(Debug)]
1276#[cfg_attr(feature = "serialize", derive(Serialize))]
1277#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1278pub struct MediaAnd<'a> {
1279    pub span: Span,
1280    pub keyword: Ident<'a>,
1281    pub media_in_parens: MediaInParens<'a>,
1282}
1283
1284#[derive(Debug)]
1285#[cfg_attr(feature = "serialize", derive(Serialize))]
1286#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1287pub struct MediaCondition<'a> {
1288    pub span: Span,
1289    pub conditions: Vec<'a, MediaConditionKind<'a>>,
1290}
1291
1292#[derive(Debug)]
1293#[cfg_attr(feature = "serialize", derive(Serialize))]
1294#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1295pub struct MediaConditionAfterMediaType<'a> {
1296    pub span: Span,
1297    pub and: Ident<'a>,
1298    pub condition: MediaCondition<'a>,
1299}
1300
1301#[derive(Debug)]
1302#[cfg_attr(feature = "serialize", derive(Serialize))]
1303#[cfg_attr(feature = "serialize", serde(untagged))]
1304pub enum MediaConditionKind<'a> {
1305    MediaInParens(MediaInParens<'a>),
1306    And(MediaAnd<'a>),
1307    Or(MediaOr<'a>),
1308    Not(MediaNot<'a>),
1309}
1310
1311#[derive(Debug)]
1312#[cfg_attr(feature = "serialize", derive(Serialize))]
1313#[cfg_attr(feature = "serialize", serde(untagged))]
1314pub enum MediaFeature<'a> {
1315    Plain(Box<'a, MediaFeaturePlain<'a>>),
1316    Boolean(MediaFeatureBoolean<'a>),
1317    Range(Box<'a, MediaFeatureRange<'a>>),
1318    RangeInterval(Box<'a, MediaFeatureRangeInterval<'a>>),
1319}
1320
1321#[derive(Debug)]
1322#[cfg_attr(feature = "serialize", derive(Serialize))]
1323#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1324pub struct MediaFeatureComparison {
1325    pub span: Span,
1326    pub kind: MediaFeatureComparisonKind,
1327}
1328
1329#[derive(Debug)]
1330#[cfg_attr(feature = "serialize", derive(Serialize))]
1331pub enum MediaFeatureComparisonKind {
1332    LessThan,
1333    LessThanOrEqual,
1334    GreaterThan,
1335    GreaterThanOrEqual,
1336    Equal,
1337}
1338
1339#[derive(Debug)]
1340#[cfg_attr(feature = "serialize", derive(Serialize))]
1341#[cfg_attr(feature = "serialize", serde(untagged))]
1342pub enum MediaFeatureName<'a> {
1343    Ident(InterpolableIdent<'a>),
1344    PostcssSimpleVar(PostcssSimpleVar<'a>),
1345    SassVariable(SassVariable<'a>),
1346}
1347
1348#[derive(Debug)]
1349#[cfg_attr(feature = "serialize", derive(Serialize))]
1350#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1351pub struct MediaFeatureBoolean<'a> {
1352    pub span: Span,
1353    pub name: MediaFeatureName<'a>,
1354}
1355
1356#[derive(Debug)]
1357#[cfg_attr(feature = "serialize", derive(Serialize))]
1358#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1359pub struct MediaFeaturePlain<'a> {
1360    pub span: Span,
1361    pub name: MediaFeatureName<'a>,
1362    pub colon_span: Span,
1363    pub value: ComponentValue<'a>,
1364}
1365
1366#[derive(Debug)]
1367#[cfg_attr(feature = "serialize", derive(Serialize))]
1368#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1369pub struct MediaFeatureRange<'a> {
1370    pub span: Span,
1371    pub left: ComponentValue<'a>,
1372    pub comparison: MediaFeatureComparison,
1373    pub right: ComponentValue<'a>,
1374}
1375
1376#[derive(Debug)]
1377#[cfg_attr(feature = "serialize", derive(Serialize))]
1378#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1379pub struct MediaFeatureRangeInterval<'a> {
1380    pub span: Span,
1381    pub left: ComponentValue<'a>,
1382    pub left_comparison: MediaFeatureComparison,
1383    pub name: MediaFeatureName<'a>,
1384    pub right_comparison: MediaFeatureComparison,
1385    pub right: ComponentValue<'a>,
1386}
1387
1388#[derive(Debug)]
1389#[cfg_attr(feature = "serialize", derive(Serialize))]
1390#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1391pub struct MediaInParens<'a> {
1392    pub span: Span,
1393    pub kind: MediaInParensKind<'a>,
1394}
1395
1396#[derive(Debug)]
1397#[cfg_attr(feature = "serialize", derive(Serialize))]
1398#[cfg_attr(feature = "serialize", serde(untagged))]
1399pub enum MediaInParensKind<'a> {
1400    MediaCondition(MediaCondition<'a>),
1401    MediaFeature(Box<'a, MediaFeature<'a>>),
1402    GeneralEnclosed(TokenSeq<'a>),
1403    SassInterpolation(SassInterpolatedIdent<'a>),
1404}
1405
1406#[derive(Debug)]
1407#[cfg_attr(feature = "serialize", derive(Serialize))]
1408#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1409pub struct MediaNot<'a> {
1410    pub span: Span,
1411    pub keyword: Ident<'a>,
1412    pub media_in_parens: MediaInParens<'a>,
1413}
1414
1415#[derive(Debug)]
1416#[cfg_attr(feature = "serialize", derive(Serialize))]
1417#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1418pub struct MediaOr<'a> {
1419    pub span: Span,
1420    pub keyword: Ident<'a>,
1421    pub media_in_parens: MediaInParens<'a>,
1422}
1423
1424#[derive(Debug)]
1425#[cfg_attr(feature = "serialize", derive(Serialize))]
1426#[cfg_attr(feature = "serialize", serde(untagged))]
1427pub enum MediaQuery<'a> {
1428    ConditionOnly(MediaCondition<'a>),
1429    WithType(Box<'a, MediaQueryWithType<'a>>),
1430    Function(Function<'a>),
1431    LessVariable(LessVariable<'a>),
1432    LessNamespaceValue(Box<'a, LessNamespaceValue<'a>>),
1433}
1434
1435#[derive(Debug)]
1436#[cfg_attr(feature = "serialize", derive(Serialize))]
1437#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1438pub struct MediaQueryList<'a> {
1439    pub span: Span,
1440    pub queries: Vec<'a, MediaQuery<'a>>,
1441    pub comma_spans: Vec<'a, Span>,
1442}
1443
1444#[derive(Debug)]
1445#[cfg_attr(feature = "serialize", derive(Serialize))]
1446#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1447pub struct MediaQueryWithType<'a> {
1448    pub span: Span,
1449    pub modifier: Option<Ident<'a>>,
1450    pub media_type: InterpolableIdent<'a>,
1451    pub condition: Option<MediaConditionAfterMediaType<'a>>,
1452}
1453
1454#[derive(Debug)]
1455#[cfg_attr(feature = "serialize", derive(Serialize))]
1456#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1457pub struct NamespacePrelude<'a> {
1458    pub span: Span,
1459    pub prefix: Option<InterpolableIdent<'a>>,
1460    pub uri: NamespacePreludeUri<'a>,
1461}
1462
1463#[derive(Debug)]
1464#[cfg_attr(feature = "serialize", derive(Serialize))]
1465#[cfg_attr(feature = "serialize", serde(untagged))]
1466pub enum NamespacePreludeUri<'a> {
1467    Str(InterpolableStr<'a>),
1468    Url(Url<'a>),
1469}
1470
1471#[derive(Debug)]
1472#[cfg_attr(feature = "serialize", derive(Serialize))]
1473#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1474pub struct NestingSelector<'a> {
1475    pub span: Span,
1476    pub suffix: Option<InterpolableIdent<'a>>,
1477}
1478
1479#[derive(Debug)]
1480#[cfg_attr(feature = "serialize", derive(Serialize))]
1481#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1482pub struct NsPrefix<'a> {
1483    pub span: Span,
1484    pub kind: Option<NsPrefixKind<'a>>,
1485}
1486
1487#[derive(Debug)]
1488#[cfg_attr(feature = "serialize", derive(Serialize))]
1489#[cfg_attr(feature = "serialize", serde(untagged))]
1490pub enum NsPrefixKind<'a> {
1491    Ident(InterpolableIdent<'a>),
1492    Universal(NsPrefixUniversal),
1493}
1494
1495#[derive(Debug)]
1496#[cfg_attr(feature = "serialize", derive(Serialize))]
1497#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1498pub struct NsPrefixUniversal {
1499    pub span: Span,
1500}
1501
1502#[derive(Debug)]
1503#[cfg_attr(feature = "serialize", derive(Serialize))]
1504#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1505pub struct Nth<'a> {
1506    pub span: Span,
1507    pub index: NthIndex<'a>,
1508    pub matcher: Option<NthMatcher<'a>>,
1509}
1510
1511#[derive(Debug)]
1512#[cfg_attr(feature = "serialize", derive(Serialize))]
1513#[cfg_attr(feature = "serialize", serde(untagged))]
1514pub enum NthIndex<'a> {
1515    Odd(Ident<'a>),
1516    Even(Ident<'a>),
1517    Integer(Number<'a>),
1518    AnPlusB(AnPlusB),
1519}
1520
1521#[derive(Debug)]
1522#[cfg_attr(feature = "serialize", derive(Serialize))]
1523#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1524pub struct NthMatcher<'a> {
1525    pub span: Span,
1526    pub selector: Option<SelectorList<'a>>,
1527}
1528
1529#[derive(Debug)]
1530#[cfg_attr(feature = "serialize", derive(Serialize))]
1531#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1532pub struct Number<'a> {
1533    pub span: Span,
1534    pub value: f32,
1535    pub raw: &'a str,
1536}
1537
1538#[derive(Debug)]
1539#[cfg_attr(feature = "serialize", derive(Serialize))]
1540#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1541pub struct PageSelector<'a> {
1542    pub span: Span,
1543    pub name: Option<InterpolableIdent<'a>>,
1544    pub pseudo: Vec<'a, PseudoPage<'a>>,
1545}
1546
1547#[derive(Debug)]
1548#[cfg_attr(feature = "serialize", derive(Serialize))]
1549#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1550pub struct PageSelectorList<'a> {
1551    pub span: Span,
1552    pub selectors: Vec<'a, PageSelector<'a>>,
1553    pub comma_spans: Vec<'a, Span>,
1554}
1555
1556#[derive(Debug)]
1557#[cfg_attr(feature = "serialize", derive(Serialize))]
1558#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1559pub struct Percentage<'a> {
1560    pub span: Span,
1561    pub value: Number<'a>,
1562}
1563
1564#[derive(Debug)]
1565#[cfg_attr(feature = "serialize", derive(Serialize))]
1566#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1567pub struct PostcssSimpleVar<'a> {
1568    pub span: Span,
1569    pub name: Ident<'a>,
1570}
1571
1572#[derive(Debug)]
1573#[cfg_attr(feature = "serialize", derive(Serialize))]
1574#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1575pub struct PostcssSimpleVarDeclaration<'a> {
1576    pub span: Span,
1577    pub name: PostcssSimpleVar<'a>,
1578    pub colon_span: Span,
1579    pub value: Vec<'a, ComponentValue<'a>>,
1580}
1581
1582#[derive(Debug)]
1583#[cfg_attr(feature = "serialize", derive(Serialize))]
1584#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1585pub struct PseudoClassSelector<'a> {
1586    pub span: Span,
1587    pub name: InterpolableIdent<'a>,
1588    pub arg: Option<PseudoClassSelectorArg<'a>>,
1589}
1590
1591#[derive(Debug)]
1592#[cfg_attr(feature = "serialize", derive(Serialize))]
1593#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1594pub struct PseudoClassSelectorArg<'a> {
1595    pub span: Span,
1596    pub kind: PseudoClassSelectorArgKind<'a>,
1597    pub l_paren: Span,
1598    pub r_paren: Span,
1599}
1600
1601#[derive(Debug)]
1602#[cfg_attr(feature = "serialize", derive(Serialize))]
1603#[cfg_attr(feature = "serialize", serde(untagged))]
1604pub enum PseudoClassSelectorArgKind<'a> {
1605    CompoundSelectorList(CompoundSelectorList<'a>),
1606    Ident(InterpolableIdent<'a>),
1607    LanguageRangeList(LanguageRangeList<'a>),
1608    Nth(Nth<'a>),
1609    Number(Number<'a>),
1610    RelativeSelectorList(RelativeSelectorList<'a>),
1611    SelectorList(SelectorList<'a>),
1612    LessExtendList(LessExtendList<'a>),
1613    TokenSeq(TokenSeq<'a>),
1614}
1615
1616#[derive(Debug)]
1617#[cfg_attr(feature = "serialize", derive(Serialize))]
1618#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1619pub struct PseudoElementSelector<'a> {
1620    pub span: Span,
1621    pub name: InterpolableIdent<'a>,
1622    pub arg: Option<PseudoElementSelectorArg<'a>>,
1623}
1624
1625#[derive(Debug)]
1626#[cfg_attr(feature = "serialize", derive(Serialize))]
1627#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1628pub struct PseudoElementSelectorArg<'a> {
1629    pub span: Span,
1630    pub kind: PseudoElementSelectorArgKind<'a>,
1631    pub l_paren: Span,
1632    pub r_paren: Span,
1633}
1634
1635#[derive(Debug)]
1636#[cfg_attr(feature = "serialize", derive(Serialize))]
1637#[cfg_attr(feature = "serialize", serde(untagged))]
1638pub enum PseudoElementSelectorArgKind<'a> {
1639    CompoundSelector(CompoundSelector<'a>),
1640    CompoundSelectorList(CompoundSelectorList<'a>),
1641    Ident(InterpolableIdent<'a>),
1642    IdentList(IdentList<'a>),
1643    TokenSeq(TokenSeq<'a>),
1644}
1645
1646/// A space-separated `<ident>+` list, e.g. the argument of `::part(tab active)`
1647/// (CSS Shadow Parts).
1648#[derive(Debug)]
1649#[cfg_attr(feature = "serialize", derive(Serialize))]
1650#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1651pub struct IdentList<'a> {
1652    pub span: Span,
1653    pub idents: Vec<'a, InterpolableIdent<'a>>,
1654}
1655
1656#[derive(Debug)]
1657#[cfg_attr(feature = "serialize", derive(Serialize))]
1658#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1659pub struct PseudoPage<'a> {
1660    pub span: Span,
1661    pub name: InterpolableIdent<'a>,
1662    /// The raw argument of a functional pseudo-page, e.g. `g` in
1663    /// `@page::slot(g)` (CSS Template Layout).
1664    pub arg: Option<TokenSeq<'a>>,
1665}
1666
1667#[derive(Debug)]
1668#[cfg_attr(feature = "serialize", derive(Serialize))]
1669#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1670pub struct QualifiedRule<'a> {
1671    pub span: Span,
1672    pub selector: SelectorList<'a>,
1673    pub block: SimpleBlock<'a>,
1674}
1675
1676#[derive(Debug)]
1677#[cfg_attr(feature = "serialize", derive(Serialize))]
1678#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1679pub struct QueryInParens<'a> {
1680    pub span: Span,
1681    pub kind: QueryInParensKind<'a>,
1682}
1683
1684#[derive(Debug)]
1685#[cfg_attr(feature = "serialize", derive(Serialize))]
1686#[cfg_attr(feature = "serialize", serde(untagged))]
1687pub enum QueryInParensKind<'a> {
1688    ContainerCondition(ContainerCondition<'a>),
1689    SizeFeature(Box<'a, MediaFeature<'a>>),
1690    StyleQuery(StyleQuery<'a>),
1691    ScrollState(Box<'a, MediaFeature<'a>>),
1692    GeneralEnclosed(TokenSeq<'a>),
1693}
1694
1695#[derive(Debug)]
1696#[cfg_attr(feature = "serialize", derive(Serialize))]
1697#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1698pub struct Ratio<'a> {
1699    pub span: Span,
1700    pub numerator: Number<'a>,
1701    pub solidus_span: Span,
1702    pub denominator: Number<'a>,
1703}
1704
1705#[derive(Debug)]
1706#[cfg_attr(feature = "serialize", derive(Serialize))]
1707#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1708pub struct RelativeSelector<'a> {
1709    pub span: Span,
1710    pub combinator: Option<Combinator>,
1711    pub complex_selector: ComplexSelector<'a>,
1712}
1713
1714#[derive(Debug)]
1715#[cfg_attr(feature = "serialize", derive(Serialize))]
1716#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1717pub struct RelativeSelectorList<'a> {
1718    pub span: Span,
1719    pub selectors: Vec<'a, RelativeSelector<'a>>,
1720    pub comma_spans: Vec<'a, Span>,
1721}
1722
1723#[derive(Debug)]
1724#[cfg_attr(feature = "serialize", derive(Serialize))]
1725#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1726pub struct SassArbitraryArgument<'a> {
1727    pub span: Span,
1728    pub value: Box<'a, ComponentValue<'a>>,
1729}
1730
1731#[derive(Debug)]
1732#[cfg_attr(feature = "serialize", derive(Serialize))]
1733#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1734pub struct SassArbitraryParameter<'a> {
1735    pub span: Span,
1736    pub name: SassVariable<'a>,
1737}
1738
1739#[derive(Debug)]
1740#[cfg_attr(feature = "serialize", derive(Serialize))]
1741#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1742pub struct SassAtRoot<'a> {
1743    pub span: Span,
1744    pub kind: SassAtRootKind<'a>,
1745}
1746
1747#[derive(Debug)]
1748#[cfg_attr(feature = "serialize", derive(Serialize))]
1749#[cfg_attr(feature = "serialize", serde(untagged))]
1750pub enum SassAtRootKind<'a> {
1751    Selector(SelectorList<'a>),
1752    Query(SassAtRootQuery<'a>),
1753}
1754
1755#[derive(Debug)]
1756#[cfg_attr(feature = "serialize", derive(Serialize))]
1757#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1758pub struct SassAtRootQuery<'a> {
1759    pub span: Span,
1760    pub modifier: SassAtRootQueryModifier,
1761    pub colon_span: Span,
1762    /// space-separated rule names
1763    pub rules: Vec<'a, SassAtRootQueryRule<'a>>,
1764}
1765
1766#[derive(Debug)]
1767#[cfg_attr(feature = "serialize", derive(Serialize))]
1768#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1769pub struct SassAtRootQueryModifier {
1770    pub span: Span,
1771    pub kind: SassAtRootQueryModifierKind,
1772}
1773
1774#[derive(Debug)]
1775#[cfg_attr(feature = "serialize", derive(Serialize))]
1776pub enum SassAtRootQueryModifierKind {
1777    With,
1778    Without,
1779}
1780
1781#[derive(Debug)]
1782#[cfg_attr(feature = "serialize", derive(Serialize))]
1783#[cfg_attr(feature = "serialize", serde(untagged))]
1784pub enum SassAtRootQueryRule<'a> {
1785    Ident(InterpolableIdent<'a>),
1786    Str(InterpolableStr<'a>),
1787}
1788
1789#[derive(Debug)]
1790#[cfg_attr(feature = "serialize", derive(Serialize))]
1791#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1792pub struct SassBinaryExpression<'a> {
1793    pub span: Span,
1794    pub left: Box<'a, ComponentValue<'a>>,
1795    pub op: SassBinaryOperator,
1796    pub right: Box<'a, ComponentValue<'a>>,
1797}
1798
1799#[derive(Debug)]
1800#[cfg_attr(feature = "serialize", derive(Serialize))]
1801#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1802pub struct SassBinaryOperator {
1803    pub span: Span,
1804    pub kind: SassBinaryOperatorKind,
1805}
1806
1807#[derive(Debug)]
1808#[cfg_attr(feature = "serialize", derive(Serialize))]
1809pub enum SassBinaryOperatorKind {
1810    Multiply,
1811    Division,
1812    Modulo,
1813    Plus,
1814    Minus,
1815    GreaterThan,
1816    GreaterThanOrEqual,
1817    LessThan,
1818    LessThanOrEqual,
1819    EqualsEquals,
1820    ExclamationEquals,
1821    And,
1822    Or,
1823}
1824
1825#[derive(Debug)]
1826#[cfg_attr(feature = "serialize", derive(Serialize))]
1827#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1828pub struct SassConditionalClause<'a> {
1829    pub span: Span,
1830    pub condition: ComponentValue<'a>,
1831    pub block: SimpleBlock<'a>,
1832}
1833
1834#[derive(Debug)]
1835#[cfg_attr(feature = "serialize", derive(Serialize))]
1836#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1837pub struct SassContent<'a> {
1838    pub span: Span,
1839    pub args: Vec<'a, ComponentValue<'a>>,
1840    pub comma_spans: Vec<'a, Span>,
1841}
1842
1843#[derive(Debug)]
1844#[cfg_attr(feature = "serialize", derive(Serialize))]
1845#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1846pub struct SassEach<'a> {
1847    pub span: Span,
1848    pub bindings: Vec<'a, SassVariable<'a>>,
1849    pub comma_spans: Vec<'a, Span>,
1850    pub in_span: Span,
1851    pub expr: ComponentValue<'a>,
1852}
1853
1854#[derive(Debug)]
1855#[cfg_attr(feature = "serialize", derive(Serialize))]
1856#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1857pub struct SassExtend<'a> {
1858    pub span: Span,
1859    pub selectors: CompoundSelectorList<'a>,
1860    pub optional: Option<SassFlag<'a>>,
1861}
1862
1863#[derive(Debug)]
1864#[cfg_attr(feature = "serialize", derive(Serialize))]
1865#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1866pub struct SassFlag<'a> {
1867    pub span: Span,
1868    pub keyword: Ident<'a>,
1869}
1870
1871#[derive(Debug)]
1872#[cfg_attr(feature = "serialize", derive(Serialize))]
1873#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1874pub struct SassFor<'a> {
1875    pub span: Span,
1876    pub binding: SassVariable<'a>,
1877    pub from_span: Span,
1878    pub start: ComponentValue<'a>,
1879    pub end: ComponentValue<'a>,
1880    pub boundary: SassForBoundary,
1881}
1882
1883#[derive(Debug)]
1884#[cfg_attr(feature = "serialize", derive(Serialize))]
1885#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1886pub struct SassForBoundary {
1887    pub span: Span,
1888    pub kind: SassForBoundaryKind,
1889}
1890
1891#[derive(Debug)]
1892#[cfg_attr(feature = "serialize", derive(Serialize))]
1893pub enum SassForBoundaryKind {
1894    Inclusive,
1895    Exclusive,
1896}
1897
1898#[derive(Debug)]
1899#[cfg_attr(feature = "serialize", derive(Serialize))]
1900#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1901pub struct SassForward<'a> {
1902    pub span: Span,
1903    pub path: InterpolableStr<'a>,
1904    pub prefix: Option<SassForwardPrefix<'a>>,
1905    pub visibility: Option<SassForwardVisibility<'a>>,
1906    pub config: Option<SassModuleConfig<'a>>,
1907}
1908
1909#[derive(Debug)]
1910#[cfg_attr(feature = "serialize", derive(Serialize))]
1911#[cfg_attr(feature = "serialize", serde(untagged))]
1912pub enum SassForwardMember<'a> {
1913    Ident(Ident<'a>),
1914    Variable(SassVariable<'a>),
1915}
1916
1917#[derive(Debug)]
1918#[cfg_attr(feature = "serialize", derive(Serialize))]
1919#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1920pub struct SassForwardPrefix<'a> {
1921    pub span: Span,
1922    pub as_span: Span,
1923    pub name: Ident<'a>,
1924}
1925
1926#[derive(Debug)]
1927#[cfg_attr(feature = "serialize", derive(Serialize))]
1928#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1929pub struct SassForwardVisibility<'a> {
1930    pub span: Span,
1931    pub modifier: SassForwardVisibilityModifier,
1932    pub members: Vec<'a, SassForwardMember<'a>>,
1933    pub comma_spans: Vec<'a, Span>,
1934}
1935
1936#[derive(Debug)]
1937#[cfg_attr(feature = "serialize", derive(Serialize))]
1938#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1939pub struct SassForwardVisibilityModifier {
1940    pub span: Span,
1941    pub kind: SassForwardVisibilityModifierKind,
1942}
1943
1944#[derive(Debug)]
1945#[cfg_attr(feature = "serialize", derive(Serialize))]
1946pub enum SassForwardVisibilityModifierKind {
1947    Hide,
1948    Show,
1949}
1950
1951#[derive(Debug)]
1952#[cfg_attr(feature = "serialize", derive(Serialize))]
1953#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1954pub struct SassFunction<'a> {
1955    pub span: Span,
1956    pub name: Ident<'a>,
1957    pub parameters: SassParameters<'a>,
1958}
1959
1960#[derive(Debug)]
1961#[cfg_attr(feature = "serialize", derive(Serialize))]
1962#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1963pub struct SassIfAtRule<'a> {
1964    pub span: Span,
1965    pub if_clause: SassConditionalClause<'a>,
1966    pub else_if_clauses: Vec<'a, SassConditionalClause<'a>>,
1967    pub else_clause: Option<SimpleBlock<'a>>,
1968    pub else_spans: Vec<'a, Span>,
1969}
1970
1971#[derive(Debug)]
1972#[cfg_attr(feature = "serialize", derive(Serialize))]
1973#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1974pub struct SassImportPrelude<'a> {
1975    pub span: Span,
1976    pub paths: Vec<'a, Str<'a>>,
1977    pub comma_spans: Vec<'a, Span>,
1978}
1979
1980#[derive(Debug)]
1981#[cfg_attr(feature = "serialize", derive(Serialize))]
1982#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1983pub struct SassInclude<'a> {
1984    pub span: Span,
1985    pub name: FunctionName<'a>,
1986    pub arguments: Option<SassIncludeArgs<'a>>,
1987    pub content_block_params: Option<SassIncludeContentBlockParams<'a>>,
1988}
1989
1990#[derive(Debug)]
1991#[cfg_attr(feature = "serialize", derive(Serialize))]
1992#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1993pub struct SassIncludeArgs<'a> {
1994    pub span: Span,
1995    pub args: Vec<'a, ComponentValue<'a>>,
1996    pub comma_spans: Vec<'a, Span>,
1997}
1998
1999#[derive(Debug)]
2000#[cfg_attr(feature = "serialize", derive(Serialize))]
2001#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2002pub struct SassIncludeContentBlockParams<'a> {
2003    pub span: Span,
2004    pub using_span: Span,
2005    pub params: SassParameters<'a>,
2006}
2007
2008#[derive(Debug)]
2009#[cfg_attr(feature = "serialize", derive(Serialize))]
2010#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2011pub struct SassInterpolatedIdent<'a> {
2012    pub span: Span,
2013    pub elements: Vec<'a, SassInterpolatedIdentElement<'a>>,
2014}
2015
2016#[derive(Debug)]
2017#[cfg_attr(feature = "serialize", derive(Serialize))]
2018#[cfg_attr(feature = "serialize", serde(untagged))]
2019pub enum SassInterpolatedIdentElement<'a> {
2020    Expression(ComponentValue<'a>),
2021    Static(InterpolableIdentStaticPart<'a>),
2022}
2023
2024#[derive(Debug)]
2025#[cfg_attr(feature = "serialize", derive(Serialize))]
2026#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2027pub struct SassInterpolatedStr<'a> {
2028    pub span: Span,
2029    pub elements: Vec<'a, SassInterpolatedStrElement<'a>>,
2030}
2031
2032#[derive(Debug)]
2033#[cfg_attr(feature = "serialize", derive(Serialize))]
2034#[cfg_attr(feature = "serialize", serde(untagged))]
2035pub enum SassInterpolatedStrElement<'a> {
2036    Expression(ComponentValue<'a>),
2037    Static(InterpolableStrStaticPart<'a>),
2038}
2039
2040#[derive(Debug)]
2041#[cfg_attr(feature = "serialize", derive(Serialize))]
2042#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2043pub struct SassInterpolatedUrl<'a> {
2044    pub span: Span,
2045    pub elements: Vec<'a, SassInterpolatedUrlElement<'a>>,
2046}
2047
2048#[derive(Debug)]
2049#[cfg_attr(feature = "serialize", derive(Serialize))]
2050#[cfg_attr(feature = "serialize", serde(untagged))]
2051pub enum SassInterpolatedUrlElement<'a> {
2052    Expression(ComponentValue<'a>),
2053    Static(InterpolableUrlStaticPart<'a>),
2054}
2055
2056#[derive(Debug)]
2057#[cfg_attr(feature = "serialize", derive(Serialize))]
2058#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2059pub struct SassKeywordArgument<'a> {
2060    pub span: Span,
2061    pub name: SassVariable<'a>,
2062    pub colon_span: Span,
2063    pub value: Box<'a, ComponentValue<'a>>,
2064}
2065
2066#[derive(Debug)]
2067#[cfg_attr(feature = "serialize", derive(Serialize))]
2068#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2069pub struct SassList<'a> {
2070    pub span: Span,
2071    pub elements: Vec<'a, ComponentValue<'a>>,
2072    pub comma_spans: Option<Vec<'a, Span>>,
2073}
2074
2075#[derive(Debug)]
2076#[cfg_attr(feature = "serialize", derive(Serialize))]
2077#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2078pub struct SassMap<'a> {
2079    pub span: Span,
2080    pub items: Vec<'a, SassMapItem<'a>>,
2081    pub comma_spans: Vec<'a, Span>,
2082}
2083
2084#[derive(Debug)]
2085#[cfg_attr(feature = "serialize", derive(Serialize))]
2086#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2087pub struct SassMapItem<'a> {
2088    pub span: Span,
2089    pub key: ComponentValue<'a>,
2090    pub colon_span: Span,
2091    pub value: ComponentValue<'a>,
2092}
2093
2094#[derive(Debug)]
2095#[cfg_attr(feature = "serialize", derive(Serialize))]
2096#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2097pub struct SassMixin<'a> {
2098    pub span: Span,
2099    pub name: Ident<'a>,
2100    pub parameters: Option<SassParameters<'a>>,
2101}
2102
2103#[derive(Debug)]
2104#[cfg_attr(feature = "serialize", derive(Serialize))]
2105#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2106pub struct SassModuleConfig<'a> {
2107    pub span: Span,
2108    pub with_span: Span,
2109    pub lparen_span: Span,
2110    pub items: Vec<'a, SassModuleConfigItem<'a>>,
2111    pub comma_spans: Vec<'a, Span>,
2112}
2113
2114#[derive(Debug)]
2115#[cfg_attr(feature = "serialize", derive(Serialize))]
2116#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2117pub struct SassModuleConfigItem<'a> {
2118    pub span: Span,
2119    pub variable: SassVariable<'a>,
2120    pub colon_span: Span,
2121    pub value: ComponentValue<'a>,
2122    pub flags: Vec<'a, SassFlag<'a>>,
2123}
2124
2125#[derive(Debug)]
2126#[cfg_attr(feature = "serialize", derive(Serialize))]
2127#[cfg_attr(feature = "serialize", serde(untagged))]
2128pub enum SassModuleMemberName<'a> {
2129    Ident(Ident<'a>),
2130    Variable(SassVariable<'a>),
2131}
2132
2133#[derive(Debug)]
2134#[cfg_attr(feature = "serialize", derive(Serialize))]
2135#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2136pub struct SassNestingDeclaration<'a> {
2137    pub span: Span,
2138    pub block: SimpleBlock<'a>,
2139}
2140
2141#[derive(Debug)]
2142#[cfg_attr(feature = "serialize", derive(Serialize))]
2143#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2144pub struct SassParameter<'a> {
2145    pub span: Span,
2146    pub name: SassVariable<'a>,
2147    pub default_value: Option<SassParameterDefaultValue<'a>>,
2148}
2149
2150#[derive(Debug)]
2151#[cfg_attr(feature = "serialize", derive(Serialize))]
2152#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2153pub struct SassParameterDefaultValue<'a> {
2154    pub span: Span,
2155    pub colon_span: Span,
2156    pub value: ComponentValue<'a>,
2157}
2158
2159#[derive(Debug)]
2160#[cfg_attr(feature = "serialize", derive(Serialize))]
2161#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2162pub struct SassParameters<'a> {
2163    pub span: Span,
2164    pub params: Vec<'a, SassParameter<'a>>,
2165    pub arbitrary_param: Option<SassArbitraryParameter<'a>>,
2166    pub comma_spans: Vec<'a, Span>,
2167}
2168
2169#[derive(Debug)]
2170#[cfg_attr(feature = "serialize", derive(Serialize))]
2171#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2172pub struct SassParenthesizedExpression<'a> {
2173    pub span: Span,
2174    pub expr: Box<'a, ComponentValue<'a>>,
2175}
2176
2177#[derive(Debug)]
2178#[cfg_attr(feature = "serialize", derive(Serialize))]
2179#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2180pub struct SassPlaceholderSelector<'a> {
2181    pub span: Span,
2182    pub name: InterpolableIdent<'a>,
2183}
2184
2185#[derive(Debug)]
2186#[cfg_attr(feature = "serialize", derive(Serialize))]
2187#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2188pub struct SassQualifiedName<'a> {
2189    pub span: Span,
2190    pub module: Ident<'a>,
2191    pub member: SassModuleMemberName<'a>,
2192}
2193
2194#[derive(Debug)]
2195#[cfg_attr(feature = "serialize", derive(Serialize))]
2196#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2197pub struct SassUnaryExpression<'a> {
2198    pub span: Span,
2199    pub op: SassUnaryOperator,
2200    pub expr: Box<'a, ComponentValue<'a>>,
2201}
2202
2203#[derive(Debug)]
2204#[cfg_attr(feature = "serialize", derive(Serialize))]
2205#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2206pub struct SassUnaryOperator {
2207    pub span: Span,
2208    pub kind: SassUnaryOperatorKind,
2209}
2210
2211#[derive(Debug)]
2212#[cfg_attr(feature = "serialize", derive(Serialize))]
2213pub enum SassUnaryOperatorKind {
2214    Plus,
2215    Minus,
2216    Not,
2217}
2218
2219#[derive(Debug)]
2220#[cfg_attr(feature = "serialize", derive(Serialize))]
2221#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2222pub struct SassUnnamedNamespace {
2223    pub span: Span,
2224}
2225
2226#[derive(Debug)]
2227#[cfg_attr(feature = "serialize", derive(Serialize))]
2228#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2229pub struct SassUse<'a> {
2230    pub span: Span,
2231    pub path: InterpolableStr<'a>,
2232    pub namespace: Option<SassUseNamespace<'a>>,
2233    pub config: Option<SassModuleConfig<'a>>,
2234}
2235
2236#[derive(Debug)]
2237#[cfg_attr(feature = "serialize", derive(Serialize))]
2238#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2239pub struct SassUseNamespace<'a> {
2240    pub span: Span,
2241    pub as_span: Span,
2242    pub kind: SassUseNamespaceKind<'a>,
2243}
2244
2245#[derive(Debug)]
2246#[cfg_attr(feature = "serialize", derive(Serialize))]
2247#[cfg_attr(feature = "serialize", serde(untagged))]
2248pub enum SassUseNamespaceKind<'a> {
2249    Named(Ident<'a>),
2250    Unnamed(SassUnnamedNamespace),
2251}
2252
2253#[derive(Debug)]
2254#[cfg_attr(feature = "serialize", derive(Serialize))]
2255#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2256pub struct SassVariable<'a> {
2257    pub span: Span,
2258    pub name: Ident<'a>,
2259}
2260
2261#[derive(Debug)]
2262#[cfg_attr(feature = "serialize", derive(Serialize))]
2263#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2264pub struct SassVariableDeclaration<'a> {
2265    pub span: Span,
2266    pub namespace: Option<Ident<'a>>,
2267    pub name: SassVariable<'a>,
2268    pub colon_span: Span,
2269    pub value: ComponentValue<'a>,
2270    pub flags: Vec<'a, SassFlag<'a>>,
2271}
2272
2273#[derive(Debug)]
2274#[cfg_attr(feature = "serialize", derive(Serialize))]
2275#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2276pub struct ScopeEnd<'a> {
2277    pub span: Span,
2278    pub to_span: Span,
2279    pub lparen_span: Span,
2280    pub selector: Option<SelectorList<'a>>,
2281}
2282
2283#[derive(Debug)]
2284#[cfg_attr(feature = "serialize", derive(Serialize))]
2285#[cfg_attr(feature = "serialize", serde(untagged))]
2286pub enum ScopePrelude<'a> {
2287    StartOnly(ScopeStart<'a>),
2288    EndOnly(ScopeEnd<'a>),
2289    Both(ScopeStartWithEnd<'a>),
2290}
2291
2292#[derive(Debug)]
2293#[cfg_attr(feature = "serialize", derive(Serialize))]
2294#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2295pub struct ScopeStart<'a> {
2296    pub span: Span,
2297    pub selector: Option<SelectorList<'a>>,
2298}
2299
2300#[derive(Debug)]
2301#[cfg_attr(feature = "serialize", derive(Serialize))]
2302#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2303pub struct ScopeStartWithEnd<'a> {
2304    pub span: Span,
2305    pub start: ScopeStart<'a>,
2306    pub end: ScopeEnd<'a>,
2307}
2308
2309#[derive(Debug)]
2310#[cfg_attr(feature = "serialize", derive(Serialize))]
2311#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2312pub struct SelectorList<'a> {
2313    pub span: Span,
2314    pub selectors: Vec<'a, ComplexSelector<'a>>,
2315    pub comma_spans: Vec<'a, Span>,
2316}
2317
2318#[derive(Debug)]
2319#[cfg_attr(feature = "serialize", derive(Serialize))]
2320#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2321pub struct SimpleBlock<'a> {
2322    pub span: Span,
2323    pub statements: Vec<'a, Statement<'a>>,
2324}
2325
2326#[derive(Debug)]
2327#[cfg_attr(feature = "serialize", derive(Serialize))]
2328#[cfg_attr(feature = "serialize", serde(untagged))]
2329pub enum SimpleSelector<'a> {
2330    Class(ClassSelector<'a>),
2331    Id(IdSelector<'a>),
2332    Type(TypeSelector<'a>),
2333    Attribute(Box<'a, AttributeSelector<'a>>),
2334    PseudoClass(Box<'a, PseudoClassSelector<'a>>),
2335    PseudoElement(Box<'a, PseudoElementSelector<'a>>),
2336    Nesting(NestingSelector<'a>),
2337    SassPlaceholder(SassPlaceholderSelector<'a>),
2338}
2339
2340#[derive(Debug)]
2341#[cfg_attr(feature = "serialize", derive(Serialize))]
2342#[cfg_attr(feature = "serialize", serde(untagged))]
2343pub enum Statement<'a> {
2344    AtRule(AtRule<'a>),
2345    Declaration(Declaration<'a>),
2346    KeyframeBlock(KeyframeBlock<'a>),
2347    LessConditionalQualifiedRule(LessConditionalQualifiedRule<'a>),
2348    LessExtendRule(LessExtendRule<'a>),
2349    LessFunctionCall(Function<'a>),
2350    LessMixinCall(LessMixinCall<'a>),
2351    LessMixinDefinition(Box<'a, LessMixinDefinition<'a>>),
2352    LessVariableCall(LessVariableCall<'a>),
2353    LessVariableDeclaration(Box<'a, LessVariableDeclaration<'a>>),
2354    Placeholder(Placeholder<'a>),
2355    PostcssSimpleVarDeclaration(Box<'a, PostcssSimpleVarDeclaration<'a>>),
2356    QualifiedRule(QualifiedRule<'a>),
2357    SassIfAtRule(Box<'a, SassIfAtRule<'a>>),
2358    SassVariableDeclaration(Box<'a, SassVariableDeclaration<'a>>),
2359    UnknownSassAtRule(Box<'a, UnknownSassAtRule<'a>>),
2360}
2361
2362#[derive(Debug)]
2363#[cfg_attr(feature = "serialize", derive(Serialize))]
2364#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2365pub struct Str<'a> {
2366    pub span: Span,
2367    pub value: &'a str,
2368    pub raw: &'a str,
2369}
2370
2371#[derive(Debug)]
2372#[cfg_attr(feature = "serialize", derive(Serialize))]
2373#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2374pub struct StyleCondition<'a> {
2375    pub span: Span,
2376    pub conditions: Vec<'a, StyleConditionKind<'a>>,
2377}
2378
2379#[derive(Debug)]
2380#[cfg_attr(feature = "serialize", derive(Serialize))]
2381#[cfg_attr(feature = "serialize", serde(untagged))]
2382pub enum StyleConditionKind<'a> {
2383    StyleInParens(StyleInParens<'a>),
2384    And(StyleConditionAnd<'a>),
2385    Or(StyleConditionOr<'a>),
2386    Not(StyleConditionNot<'a>),
2387}
2388
2389#[derive(Debug)]
2390#[cfg_attr(feature = "serialize", derive(Serialize))]
2391#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2392pub struct StyleConditionAnd<'a> {
2393    pub span: Span,
2394    pub keyword: Ident<'a>,
2395    pub style_in_parens: StyleInParens<'a>,
2396}
2397
2398#[derive(Debug)]
2399#[cfg_attr(feature = "serialize", derive(Serialize))]
2400#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2401pub struct StyleConditionNot<'a> {
2402    pub span: Span,
2403    pub keyword: Ident<'a>,
2404    pub style_in_parens: StyleInParens<'a>,
2405}
2406
2407#[derive(Debug)]
2408#[cfg_attr(feature = "serialize", derive(Serialize))]
2409#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2410pub struct StyleConditionOr<'a> {
2411    pub span: Span,
2412    pub keyword: Ident<'a>,
2413    pub style_in_parens: StyleInParens<'a>,
2414}
2415
2416#[derive(Debug)]
2417#[cfg_attr(feature = "serialize", derive(Serialize))]
2418#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2419pub struct StyleInParens<'a> {
2420    pub span: Span,
2421    pub kind: StyleInParensKind<'a>,
2422}
2423
2424#[derive(Debug)]
2425#[cfg_attr(feature = "serialize", derive(Serialize))]
2426#[cfg_attr(feature = "serialize", serde(untagged))]
2427pub enum StyleInParensKind<'a> {
2428    Condition(StyleCondition<'a>),
2429    Feature(Declaration<'a>),
2430}
2431
2432#[derive(Debug)]
2433#[cfg_attr(feature = "serialize", derive(Serialize))]
2434#[cfg_attr(feature = "serialize", serde(untagged))]
2435pub enum StyleQuery<'a> {
2436    Condition(StyleCondition<'a>),
2437    Feature(Declaration<'a>),
2438    /// A bare `<custom-property-name>` existence test: `style(--theme)`
2439    /// (css-conditional-5 `<style-feature>`).
2440    FeatureName(InterpolableIdent<'a>),
2441}
2442
2443#[derive(Debug)]
2444#[cfg_attr(feature = "serialize", derive(Serialize))]
2445#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2446pub struct Stylesheet<'a> {
2447    pub span: Span,
2448    pub statements: Vec<'a, Statement<'a>>,
2449}
2450
2451#[derive(Debug)]
2452#[cfg_attr(feature = "serialize", derive(Serialize))]
2453#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2454pub struct SupportsAnd<'a> {
2455    pub span: Span,
2456    pub keyword: Ident<'a>,
2457    pub condition: SupportsInParens<'a>,
2458}
2459
2460#[derive(Debug)]
2461#[cfg_attr(feature = "serialize", derive(Serialize))]
2462#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2463pub struct SupportsCondition<'a> {
2464    pub span: Span,
2465    pub conditions: Vec<'a, SupportsConditionKind<'a>>,
2466}
2467
2468#[derive(Debug)]
2469#[cfg_attr(feature = "serialize", derive(Serialize))]
2470#[cfg_attr(feature = "serialize", serde(untagged))]
2471pub enum SupportsConditionKind<'a> {
2472    Not(SupportsNot<'a>),
2473    And(SupportsAnd<'a>),
2474    Or(SupportsOr<'a>),
2475    SupportsInParens(SupportsInParens<'a>),
2476}
2477
2478#[derive(Debug)]
2479#[cfg_attr(feature = "serialize", derive(Serialize))]
2480#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2481pub struct SupportsDecl<'a> {
2482    pub span: Span,
2483    pub decl: Declaration<'a>,
2484}
2485
2486#[derive(Debug)]
2487#[cfg_attr(feature = "serialize", derive(Serialize))]
2488#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2489pub struct SupportsInParens<'a> {
2490    pub span: Span,
2491    pub kind: SupportsInParensKind<'a>,
2492}
2493
2494#[derive(Debug)]
2495#[cfg_attr(feature = "serialize", derive(Serialize))]
2496#[cfg_attr(feature = "serialize", serde(untagged))]
2497pub enum SupportsInParensKind<'a> {
2498    SupportsCondition(SupportsCondition<'a>),
2499    Feature(Box<'a, SupportsDecl<'a>>),
2500    Selector(SelectorList<'a>),
2501    Function(Function<'a>),
2502    GeneralEnclosed(TokenSeq<'a>),
2503    /// Sass only: a lone interpolation as a condition operand,
2504    /// e.g. `@supports #{"(a: b)"} { ... }`.
2505    Interpolation(InterpolableIdent<'a>),
2506}
2507
2508#[derive(Debug)]
2509#[cfg_attr(feature = "serialize", derive(Serialize))]
2510#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2511pub struct SupportsNot<'a> {
2512    pub span: Span,
2513    pub keyword: Ident<'a>,
2514    pub condition: SupportsInParens<'a>,
2515}
2516
2517#[derive(Debug)]
2518#[cfg_attr(feature = "serialize", derive(Serialize))]
2519#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2520pub struct SupportsOr<'a> {
2521    pub span: Span,
2522    pub keyword: Ident<'a>,
2523    pub condition: SupportsInParens<'a>,
2524}
2525
2526#[derive(Debug)]
2527#[cfg_attr(feature = "serialize", derive(Serialize))]
2528#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2529pub struct TagNameSelector<'a> {
2530    pub span: Span,
2531    pub name: WqName<'a>,
2532}
2533
2534#[derive(Debug)]
2535#[cfg_attr(feature = "serialize", derive(Serialize))]
2536#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2537pub struct TokenSeq<'a> {
2538    pub span: Span,
2539    pub tokens: Vec<'a, TokenWithSpan<'a>>,
2540}
2541
2542#[derive(Debug)]
2543#[cfg_attr(feature = "serialize", derive(Serialize))]
2544#[cfg_attr(feature = "serialize", serde(untagged))]
2545pub enum TypeSelector<'a> {
2546    TagName(TagNameSelector<'a>),
2547    Universal(UniversalSelector<'a>),
2548}
2549
2550#[derive(Debug)]
2551#[cfg_attr(feature = "serialize", derive(Serialize))]
2552#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2553pub struct UnicodeRange<'a> {
2554    pub span: Span,
2555    pub prefix: char,
2556    pub start: u32,
2557    pub start_raw: &'a str,
2558    pub end: u32,
2559    pub end_raw: Option<&'a str>,
2560}
2561
2562#[derive(Debug)]
2563#[cfg_attr(feature = "serialize", derive(Serialize))]
2564#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2565pub struct UniversalSelector<'a> {
2566    pub span: Span,
2567    pub prefix: Option<NsPrefix<'a>>,
2568}
2569
2570#[derive(Debug)]
2571#[cfg_attr(feature = "serialize", derive(Serialize))]
2572#[cfg_attr(feature = "serialize", serde(untagged))]
2573pub enum UnknownAtRulePrelude<'a> {
2574    ComponentValue(ComponentValue<'a>),
2575    TokenSeq(TokenSeq<'a>),
2576}
2577
2578#[derive(Debug)]
2579#[cfg_attr(feature = "serialize", derive(Serialize))]
2580#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2581pub struct UnknownSassAtRule<'a> {
2582    pub span: Span,
2583    pub name: InterpolableIdent<'a>,
2584    pub prelude: Option<UnknownAtRulePrelude<'a>>,
2585    pub block: Option<SimpleBlock<'a>>,
2586}
2587
2588#[derive(Debug)]
2589#[cfg_attr(feature = "serialize", derive(Serialize))]
2590#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2591pub struct UnquotedFontFamilyName<'a> {
2592    pub span: Span,
2593    pub idents: Vec<'a, InterpolableIdent<'a>>,
2594}
2595
2596#[derive(Debug)]
2597#[cfg_attr(feature = "serialize", derive(Serialize))]
2598#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2599pub struct Url<'a> {
2600    pub span: Span,
2601    pub name: Ident<'a>,
2602    pub value: Option<UrlValue<'a>>,
2603    pub modifiers: Vec<'a, UrlModifier<'a>>,
2604}
2605
2606#[derive(Debug)]
2607#[cfg_attr(feature = "serialize", derive(Serialize))]
2608#[cfg_attr(feature = "serialize", serde(untagged))]
2609pub enum UrlModifier<'a> {
2610    Ident(InterpolableIdent<'a>),
2611    Function(Function<'a>),
2612}
2613
2614/// `)` is excluded
2615#[derive(Debug)]
2616#[cfg_attr(feature = "serialize", derive(Serialize))]
2617#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2618pub struct UrlRaw<'a> {
2619    pub span: Span,
2620    pub value: &'a str,
2621    pub raw: &'a str,
2622}
2623
2624#[derive(Debug)]
2625#[cfg_attr(feature = "serialize", derive(Serialize))]
2626#[cfg_attr(feature = "serialize", serde(untagged))]
2627pub enum UrlValue<'a> {
2628    Raw(UrlRaw<'a>),
2629    SassInterpolated(SassInterpolatedUrl<'a>),
2630    Str(InterpolableStr<'a>),
2631    LessEscapedStr(LessEscapedStr<'a>),
2632}
2633
2634#[derive(Debug)]
2635#[cfg_attr(feature = "serialize", derive(Serialize))]
2636#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2637pub struct WqName<'a> {
2638    pub span: Span,
2639    pub name: InterpolableIdent<'a>,
2640    pub prefix: Option<NsPrefix<'a>>,
2641}
2642
2643#[cfg(target_pointer_width = "64")]
2644const _: () = {
2645    assert!(size_of::<SimpleSelector<'static>>() == 160);
2646    assert!(size_of::<MediaFeature<'static>>() == 88);
2647    assert!(size_of::<MediaQuery<'static>>() == 96);
2648};