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(MediaFeaturePlain<'a>),
1316    Boolean(MediaFeatureBoolean<'a>),
1317    Range(MediaFeatureRange<'a>),
1318    RangeInterval(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(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    CompoundSelector(CompoundSelector<'a>),
1606    CompoundSelectorList(CompoundSelectorList<'a>),
1607    Ident(InterpolableIdent<'a>),
1608    LanguageRangeList(LanguageRangeList<'a>),
1609    Nth(Nth<'a>),
1610    Number(Number<'a>),
1611    RelativeSelectorList(RelativeSelectorList<'a>),
1612    SelectorList(SelectorList<'a>),
1613    LessExtendList(LessExtendList<'a>),
1614    TokenSeq(TokenSeq<'a>),
1615}
1616
1617#[derive(Debug)]
1618#[cfg_attr(feature = "serialize", derive(Serialize))]
1619#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1620pub struct PseudoElementSelector<'a> {
1621    pub span: Span,
1622    pub name: InterpolableIdent<'a>,
1623    pub arg: Option<PseudoElementSelectorArg<'a>>,
1624}
1625
1626#[derive(Debug)]
1627#[cfg_attr(feature = "serialize", derive(Serialize))]
1628#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1629pub struct PseudoElementSelectorArg<'a> {
1630    pub span: Span,
1631    pub kind: PseudoElementSelectorArgKind<'a>,
1632    pub l_paren: Span,
1633    pub r_paren: Span,
1634}
1635
1636#[derive(Debug)]
1637#[cfg_attr(feature = "serialize", derive(Serialize))]
1638#[cfg_attr(feature = "serialize", serde(untagged))]
1639pub enum PseudoElementSelectorArgKind<'a> {
1640    CompoundSelector(CompoundSelector<'a>),
1641    CompoundSelectorList(CompoundSelectorList<'a>),
1642    Ident(InterpolableIdent<'a>),
1643    IdentList(IdentList<'a>),
1644    TokenSeq(TokenSeq<'a>),
1645}
1646
1647/// A space-separated `<ident>+` list, e.g. the argument of `::part(tab active)`
1648/// (CSS Shadow Parts).
1649#[derive(Debug)]
1650#[cfg_attr(feature = "serialize", derive(Serialize))]
1651#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1652pub struct IdentList<'a> {
1653    pub span: Span,
1654    pub idents: Vec<'a, InterpolableIdent<'a>>,
1655}
1656
1657#[derive(Debug)]
1658#[cfg_attr(feature = "serialize", derive(Serialize))]
1659#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1660pub struct PseudoPage<'a> {
1661    pub span: Span,
1662    pub name: InterpolableIdent<'a>,
1663    /// The raw argument of a functional pseudo-page, e.g. `g` in
1664    /// `@page::slot(g)` (CSS Template Layout).
1665    pub arg: Option<TokenSeq<'a>>,
1666}
1667
1668#[derive(Debug)]
1669#[cfg_attr(feature = "serialize", derive(Serialize))]
1670#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1671pub struct QualifiedRule<'a> {
1672    pub span: Span,
1673    pub selector: SelectorList<'a>,
1674    pub block: SimpleBlock<'a>,
1675}
1676
1677#[derive(Debug)]
1678#[cfg_attr(feature = "serialize", derive(Serialize))]
1679#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1680pub struct QueryInParens<'a> {
1681    pub span: Span,
1682    pub kind: QueryInParensKind<'a>,
1683}
1684
1685#[derive(Debug)]
1686#[cfg_attr(feature = "serialize", derive(Serialize))]
1687#[cfg_attr(feature = "serialize", serde(untagged))]
1688pub enum QueryInParensKind<'a> {
1689    ContainerCondition(ContainerCondition<'a>),
1690    SizeFeature(Box<'a, MediaFeature<'a>>),
1691    StyleQuery(StyleQuery<'a>),
1692    ScrollState(Box<'a, MediaFeature<'a>>),
1693    GeneralEnclosed(TokenSeq<'a>),
1694}
1695
1696#[derive(Debug)]
1697#[cfg_attr(feature = "serialize", derive(Serialize))]
1698#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1699pub struct Ratio<'a> {
1700    pub span: Span,
1701    pub numerator: Number<'a>,
1702    pub solidus_span: Span,
1703    pub denominator: Number<'a>,
1704}
1705
1706#[derive(Debug)]
1707#[cfg_attr(feature = "serialize", derive(Serialize))]
1708#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1709pub struct RelativeSelector<'a> {
1710    pub span: Span,
1711    pub combinator: Option<Combinator>,
1712    pub complex_selector: ComplexSelector<'a>,
1713}
1714
1715#[derive(Debug)]
1716#[cfg_attr(feature = "serialize", derive(Serialize))]
1717#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1718pub struct RelativeSelectorList<'a> {
1719    pub span: Span,
1720    pub selectors: Vec<'a, RelativeSelector<'a>>,
1721    pub comma_spans: Vec<'a, Span>,
1722}
1723
1724#[derive(Debug)]
1725#[cfg_attr(feature = "serialize", derive(Serialize))]
1726#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1727pub struct SassArbitraryArgument<'a> {
1728    pub span: Span,
1729    pub value: Box<'a, ComponentValue<'a>>,
1730}
1731
1732#[derive(Debug)]
1733#[cfg_attr(feature = "serialize", derive(Serialize))]
1734#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1735pub struct SassArbitraryParameter<'a> {
1736    pub span: Span,
1737    pub name: SassVariable<'a>,
1738}
1739
1740#[derive(Debug)]
1741#[cfg_attr(feature = "serialize", derive(Serialize))]
1742#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1743pub struct SassAtRoot<'a> {
1744    pub span: Span,
1745    pub kind: SassAtRootKind<'a>,
1746}
1747
1748#[derive(Debug)]
1749#[cfg_attr(feature = "serialize", derive(Serialize))]
1750#[cfg_attr(feature = "serialize", serde(untagged))]
1751pub enum SassAtRootKind<'a> {
1752    Selector(SelectorList<'a>),
1753    Query(SassAtRootQuery<'a>),
1754}
1755
1756#[derive(Debug)]
1757#[cfg_attr(feature = "serialize", derive(Serialize))]
1758#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1759pub struct SassAtRootQuery<'a> {
1760    pub span: Span,
1761    pub modifier: SassAtRootQueryModifier,
1762    pub colon_span: Span,
1763    /// space-separated rule names
1764    pub rules: Vec<'a, SassAtRootQueryRule<'a>>,
1765}
1766
1767#[derive(Debug)]
1768#[cfg_attr(feature = "serialize", derive(Serialize))]
1769#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1770pub struct SassAtRootQueryModifier {
1771    pub span: Span,
1772    pub kind: SassAtRootQueryModifierKind,
1773}
1774
1775#[derive(Debug)]
1776#[cfg_attr(feature = "serialize", derive(Serialize))]
1777pub enum SassAtRootQueryModifierKind {
1778    With,
1779    Without,
1780}
1781
1782#[derive(Debug)]
1783#[cfg_attr(feature = "serialize", derive(Serialize))]
1784#[cfg_attr(feature = "serialize", serde(untagged))]
1785pub enum SassAtRootQueryRule<'a> {
1786    Ident(InterpolableIdent<'a>),
1787    Str(InterpolableStr<'a>),
1788}
1789
1790#[derive(Debug)]
1791#[cfg_attr(feature = "serialize", derive(Serialize))]
1792#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1793pub struct SassBinaryExpression<'a> {
1794    pub span: Span,
1795    pub left: Box<'a, ComponentValue<'a>>,
1796    pub op: SassBinaryOperator,
1797    pub right: Box<'a, ComponentValue<'a>>,
1798}
1799
1800#[derive(Debug)]
1801#[cfg_attr(feature = "serialize", derive(Serialize))]
1802#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1803pub struct SassBinaryOperator {
1804    pub span: Span,
1805    pub kind: SassBinaryOperatorKind,
1806}
1807
1808#[derive(Debug)]
1809#[cfg_attr(feature = "serialize", derive(Serialize))]
1810pub enum SassBinaryOperatorKind {
1811    Multiply,
1812    Division,
1813    Modulo,
1814    Plus,
1815    Minus,
1816    GreaterThan,
1817    GreaterThanOrEqual,
1818    LessThan,
1819    LessThanOrEqual,
1820    EqualsEquals,
1821    ExclamationEquals,
1822    And,
1823    Or,
1824}
1825
1826#[derive(Debug)]
1827#[cfg_attr(feature = "serialize", derive(Serialize))]
1828#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1829pub struct SassConditionalClause<'a> {
1830    pub span: Span,
1831    pub condition: ComponentValue<'a>,
1832    pub block: SimpleBlock<'a>,
1833}
1834
1835#[derive(Debug)]
1836#[cfg_attr(feature = "serialize", derive(Serialize))]
1837#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1838pub struct SassContent<'a> {
1839    pub span: Span,
1840    pub args: Vec<'a, ComponentValue<'a>>,
1841    pub comma_spans: Vec<'a, Span>,
1842}
1843
1844#[derive(Debug)]
1845#[cfg_attr(feature = "serialize", derive(Serialize))]
1846#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1847pub struct SassEach<'a> {
1848    pub span: Span,
1849    pub bindings: Vec<'a, SassVariable<'a>>,
1850    pub comma_spans: Vec<'a, Span>,
1851    pub in_span: Span,
1852    pub expr: ComponentValue<'a>,
1853}
1854
1855#[derive(Debug)]
1856#[cfg_attr(feature = "serialize", derive(Serialize))]
1857#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1858pub struct SassExtend<'a> {
1859    pub span: Span,
1860    pub selectors: CompoundSelectorList<'a>,
1861    pub optional: Option<SassFlag<'a>>,
1862}
1863
1864#[derive(Debug)]
1865#[cfg_attr(feature = "serialize", derive(Serialize))]
1866#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1867pub struct SassFlag<'a> {
1868    pub span: Span,
1869    pub keyword: Ident<'a>,
1870}
1871
1872#[derive(Debug)]
1873#[cfg_attr(feature = "serialize", derive(Serialize))]
1874#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1875pub struct SassFor<'a> {
1876    pub span: Span,
1877    pub binding: SassVariable<'a>,
1878    pub from_span: Span,
1879    pub start: ComponentValue<'a>,
1880    pub end: ComponentValue<'a>,
1881    pub boundary: SassForBoundary,
1882}
1883
1884#[derive(Debug)]
1885#[cfg_attr(feature = "serialize", derive(Serialize))]
1886#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1887pub struct SassForBoundary {
1888    pub span: Span,
1889    pub kind: SassForBoundaryKind,
1890}
1891
1892#[derive(Debug)]
1893#[cfg_attr(feature = "serialize", derive(Serialize))]
1894pub enum SassForBoundaryKind {
1895    Inclusive,
1896    Exclusive,
1897}
1898
1899#[derive(Debug)]
1900#[cfg_attr(feature = "serialize", derive(Serialize))]
1901#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1902pub struct SassForward<'a> {
1903    pub span: Span,
1904    pub path: InterpolableStr<'a>,
1905    pub prefix: Option<SassForwardPrefix<'a>>,
1906    pub visibility: Option<SassForwardVisibility<'a>>,
1907    pub config: Option<SassModuleConfig<'a>>,
1908}
1909
1910#[derive(Debug)]
1911#[cfg_attr(feature = "serialize", derive(Serialize))]
1912#[cfg_attr(feature = "serialize", serde(untagged))]
1913pub enum SassForwardMember<'a> {
1914    Ident(Ident<'a>),
1915    Variable(SassVariable<'a>),
1916}
1917
1918#[derive(Debug)]
1919#[cfg_attr(feature = "serialize", derive(Serialize))]
1920#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1921pub struct SassForwardPrefix<'a> {
1922    pub span: Span,
1923    pub as_span: Span,
1924    pub name: Ident<'a>,
1925}
1926
1927#[derive(Debug)]
1928#[cfg_attr(feature = "serialize", derive(Serialize))]
1929#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1930pub struct SassForwardVisibility<'a> {
1931    pub span: Span,
1932    pub modifier: SassForwardVisibilityModifier,
1933    pub members: Vec<'a, SassForwardMember<'a>>,
1934    pub comma_spans: Vec<'a, Span>,
1935}
1936
1937#[derive(Debug)]
1938#[cfg_attr(feature = "serialize", derive(Serialize))]
1939#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1940pub struct SassForwardVisibilityModifier {
1941    pub span: Span,
1942    pub kind: SassForwardVisibilityModifierKind,
1943}
1944
1945#[derive(Debug)]
1946#[cfg_attr(feature = "serialize", derive(Serialize))]
1947pub enum SassForwardVisibilityModifierKind {
1948    Hide,
1949    Show,
1950}
1951
1952#[derive(Debug)]
1953#[cfg_attr(feature = "serialize", derive(Serialize))]
1954#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1955pub struct SassFunction<'a> {
1956    pub span: Span,
1957    pub name: Ident<'a>,
1958    pub parameters: SassParameters<'a>,
1959}
1960
1961#[derive(Debug)]
1962#[cfg_attr(feature = "serialize", derive(Serialize))]
1963#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1964pub struct SassIfAtRule<'a> {
1965    pub span: Span,
1966    pub if_clause: SassConditionalClause<'a>,
1967    pub else_if_clauses: Vec<'a, SassConditionalClause<'a>>,
1968    pub else_clause: Option<SimpleBlock<'a>>,
1969    pub else_spans: Vec<'a, Span>,
1970}
1971
1972#[derive(Debug)]
1973#[cfg_attr(feature = "serialize", derive(Serialize))]
1974#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1975pub struct SassImportPrelude<'a> {
1976    pub span: Span,
1977    pub paths: Vec<'a, Str<'a>>,
1978    pub comma_spans: Vec<'a, Span>,
1979}
1980
1981#[derive(Debug)]
1982#[cfg_attr(feature = "serialize", derive(Serialize))]
1983#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1984pub struct SassInclude<'a> {
1985    pub span: Span,
1986    pub name: FunctionName<'a>,
1987    pub arguments: Option<SassIncludeArgs<'a>>,
1988    pub content_block_params: Option<SassIncludeContentBlockParams<'a>>,
1989}
1990
1991#[derive(Debug)]
1992#[cfg_attr(feature = "serialize", derive(Serialize))]
1993#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
1994pub struct SassIncludeArgs<'a> {
1995    pub span: Span,
1996    pub args: Vec<'a, ComponentValue<'a>>,
1997    pub comma_spans: Vec<'a, Span>,
1998}
1999
2000#[derive(Debug)]
2001#[cfg_attr(feature = "serialize", derive(Serialize))]
2002#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2003pub struct SassIncludeContentBlockParams<'a> {
2004    pub span: Span,
2005    pub using_span: Span,
2006    pub params: SassParameters<'a>,
2007}
2008
2009#[derive(Debug)]
2010#[cfg_attr(feature = "serialize", derive(Serialize))]
2011#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2012pub struct SassInterpolatedIdent<'a> {
2013    pub span: Span,
2014    pub elements: Vec<'a, SassInterpolatedIdentElement<'a>>,
2015}
2016
2017#[derive(Debug)]
2018#[cfg_attr(feature = "serialize", derive(Serialize))]
2019#[cfg_attr(feature = "serialize", serde(untagged))]
2020pub enum SassInterpolatedIdentElement<'a> {
2021    Expression(ComponentValue<'a>),
2022    Static(InterpolableIdentStaticPart<'a>),
2023}
2024
2025#[derive(Debug)]
2026#[cfg_attr(feature = "serialize", derive(Serialize))]
2027#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2028pub struct SassInterpolatedStr<'a> {
2029    pub span: Span,
2030    pub elements: Vec<'a, SassInterpolatedStrElement<'a>>,
2031}
2032
2033#[derive(Debug)]
2034#[cfg_attr(feature = "serialize", derive(Serialize))]
2035#[cfg_attr(feature = "serialize", serde(untagged))]
2036pub enum SassInterpolatedStrElement<'a> {
2037    Expression(ComponentValue<'a>),
2038    Static(InterpolableStrStaticPart<'a>),
2039}
2040
2041#[derive(Debug)]
2042#[cfg_attr(feature = "serialize", derive(Serialize))]
2043#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2044pub struct SassInterpolatedUrl<'a> {
2045    pub span: Span,
2046    pub elements: Vec<'a, SassInterpolatedUrlElement<'a>>,
2047}
2048
2049#[derive(Debug)]
2050#[cfg_attr(feature = "serialize", derive(Serialize))]
2051#[cfg_attr(feature = "serialize", serde(untagged))]
2052pub enum SassInterpolatedUrlElement<'a> {
2053    Expression(ComponentValue<'a>),
2054    Static(InterpolableUrlStaticPart<'a>),
2055}
2056
2057#[derive(Debug)]
2058#[cfg_attr(feature = "serialize", derive(Serialize))]
2059#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2060pub struct SassKeywordArgument<'a> {
2061    pub span: Span,
2062    pub name: SassVariable<'a>,
2063    pub colon_span: Span,
2064    pub value: Box<'a, ComponentValue<'a>>,
2065}
2066
2067#[derive(Debug)]
2068#[cfg_attr(feature = "serialize", derive(Serialize))]
2069#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2070pub struct SassList<'a> {
2071    pub span: Span,
2072    pub elements: Vec<'a, ComponentValue<'a>>,
2073    pub comma_spans: Option<Vec<'a, Span>>,
2074}
2075
2076#[derive(Debug)]
2077#[cfg_attr(feature = "serialize", derive(Serialize))]
2078#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2079pub struct SassMap<'a> {
2080    pub span: Span,
2081    pub items: Vec<'a, SassMapItem<'a>>,
2082    pub comma_spans: Vec<'a, Span>,
2083}
2084
2085#[derive(Debug)]
2086#[cfg_attr(feature = "serialize", derive(Serialize))]
2087#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2088pub struct SassMapItem<'a> {
2089    pub span: Span,
2090    pub key: ComponentValue<'a>,
2091    pub colon_span: Span,
2092    pub value: ComponentValue<'a>,
2093}
2094
2095#[derive(Debug)]
2096#[cfg_attr(feature = "serialize", derive(Serialize))]
2097#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2098pub struct SassMixin<'a> {
2099    pub span: Span,
2100    pub name: Ident<'a>,
2101    pub parameters: Option<SassParameters<'a>>,
2102}
2103
2104#[derive(Debug)]
2105#[cfg_attr(feature = "serialize", derive(Serialize))]
2106#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2107pub struct SassModuleConfig<'a> {
2108    pub span: Span,
2109    pub with_span: Span,
2110    pub lparen_span: Span,
2111    pub items: Vec<'a, SassModuleConfigItem<'a>>,
2112    pub comma_spans: Vec<'a, Span>,
2113}
2114
2115#[derive(Debug)]
2116#[cfg_attr(feature = "serialize", derive(Serialize))]
2117#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2118pub struct SassModuleConfigItem<'a> {
2119    pub span: Span,
2120    pub variable: SassVariable<'a>,
2121    pub colon_span: Span,
2122    pub value: ComponentValue<'a>,
2123    pub flags: Vec<'a, SassFlag<'a>>,
2124}
2125
2126#[derive(Debug)]
2127#[cfg_attr(feature = "serialize", derive(Serialize))]
2128#[cfg_attr(feature = "serialize", serde(untagged))]
2129pub enum SassModuleMemberName<'a> {
2130    Ident(Ident<'a>),
2131    Variable(SassVariable<'a>),
2132}
2133
2134#[derive(Debug)]
2135#[cfg_attr(feature = "serialize", derive(Serialize))]
2136#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2137pub struct SassNestingDeclaration<'a> {
2138    pub span: Span,
2139    pub block: SimpleBlock<'a>,
2140}
2141
2142#[derive(Debug)]
2143#[cfg_attr(feature = "serialize", derive(Serialize))]
2144#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2145pub struct SassParameter<'a> {
2146    pub span: Span,
2147    pub name: SassVariable<'a>,
2148    pub default_value: Option<SassParameterDefaultValue<'a>>,
2149}
2150
2151#[derive(Debug)]
2152#[cfg_attr(feature = "serialize", derive(Serialize))]
2153#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2154pub struct SassParameterDefaultValue<'a> {
2155    pub span: Span,
2156    pub colon_span: Span,
2157    pub value: ComponentValue<'a>,
2158}
2159
2160#[derive(Debug)]
2161#[cfg_attr(feature = "serialize", derive(Serialize))]
2162#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2163pub struct SassParameters<'a> {
2164    pub span: Span,
2165    pub params: Vec<'a, SassParameter<'a>>,
2166    pub arbitrary_param: Option<SassArbitraryParameter<'a>>,
2167    pub comma_spans: Vec<'a, Span>,
2168}
2169
2170#[derive(Debug)]
2171#[cfg_attr(feature = "serialize", derive(Serialize))]
2172#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2173pub struct SassParenthesizedExpression<'a> {
2174    pub span: Span,
2175    pub expr: Box<'a, ComponentValue<'a>>,
2176}
2177
2178#[derive(Debug)]
2179#[cfg_attr(feature = "serialize", derive(Serialize))]
2180#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2181pub struct SassPlaceholderSelector<'a> {
2182    pub span: Span,
2183    pub name: InterpolableIdent<'a>,
2184}
2185
2186#[derive(Debug)]
2187#[cfg_attr(feature = "serialize", derive(Serialize))]
2188#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2189pub struct SassQualifiedName<'a> {
2190    pub span: Span,
2191    pub module: Ident<'a>,
2192    pub member: SassModuleMemberName<'a>,
2193}
2194
2195#[derive(Debug)]
2196#[cfg_attr(feature = "serialize", derive(Serialize))]
2197#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2198pub struct SassUnaryExpression<'a> {
2199    pub span: Span,
2200    pub op: SassUnaryOperator,
2201    pub expr: Box<'a, ComponentValue<'a>>,
2202}
2203
2204#[derive(Debug)]
2205#[cfg_attr(feature = "serialize", derive(Serialize))]
2206#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2207pub struct SassUnaryOperator {
2208    pub span: Span,
2209    pub kind: SassUnaryOperatorKind,
2210}
2211
2212#[derive(Debug)]
2213#[cfg_attr(feature = "serialize", derive(Serialize))]
2214pub enum SassUnaryOperatorKind {
2215    Plus,
2216    Minus,
2217    Not,
2218}
2219
2220#[derive(Debug)]
2221#[cfg_attr(feature = "serialize", derive(Serialize))]
2222#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2223pub struct SassUnnamedNamespace {
2224    pub span: Span,
2225}
2226
2227#[derive(Debug)]
2228#[cfg_attr(feature = "serialize", derive(Serialize))]
2229#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2230pub struct SassUse<'a> {
2231    pub span: Span,
2232    pub path: InterpolableStr<'a>,
2233    pub namespace: Option<SassUseNamespace<'a>>,
2234    pub config: Option<SassModuleConfig<'a>>,
2235}
2236
2237#[derive(Debug)]
2238#[cfg_attr(feature = "serialize", derive(Serialize))]
2239#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2240pub struct SassUseNamespace<'a> {
2241    pub span: Span,
2242    pub as_span: Span,
2243    pub kind: SassUseNamespaceKind<'a>,
2244}
2245
2246#[derive(Debug)]
2247#[cfg_attr(feature = "serialize", derive(Serialize))]
2248#[cfg_attr(feature = "serialize", serde(untagged))]
2249pub enum SassUseNamespaceKind<'a> {
2250    Named(Ident<'a>),
2251    Unnamed(SassUnnamedNamespace),
2252}
2253
2254#[derive(Debug)]
2255#[cfg_attr(feature = "serialize", derive(Serialize))]
2256#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2257pub struct SassVariable<'a> {
2258    pub span: Span,
2259    pub name: Ident<'a>,
2260}
2261
2262#[derive(Debug)]
2263#[cfg_attr(feature = "serialize", derive(Serialize))]
2264#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2265pub struct SassVariableDeclaration<'a> {
2266    pub span: Span,
2267    pub namespace: Option<Ident<'a>>,
2268    pub name: SassVariable<'a>,
2269    pub colon_span: Span,
2270    pub value: ComponentValue<'a>,
2271    pub flags: Vec<'a, SassFlag<'a>>,
2272}
2273
2274#[derive(Debug)]
2275#[cfg_attr(feature = "serialize", derive(Serialize))]
2276#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2277pub struct ScopeEnd<'a> {
2278    pub span: Span,
2279    pub to_span: Span,
2280    pub lparen_span: Span,
2281    pub selector: Option<SelectorList<'a>>,
2282}
2283
2284#[derive(Debug)]
2285#[cfg_attr(feature = "serialize", derive(Serialize))]
2286#[cfg_attr(feature = "serialize", serde(untagged))]
2287pub enum ScopePrelude<'a> {
2288    StartOnly(ScopeStart<'a>),
2289    EndOnly(ScopeEnd<'a>),
2290    Both(ScopeStartWithEnd<'a>),
2291}
2292
2293#[derive(Debug)]
2294#[cfg_attr(feature = "serialize", derive(Serialize))]
2295#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2296pub struct ScopeStart<'a> {
2297    pub span: Span,
2298    pub selector: Option<SelectorList<'a>>,
2299}
2300
2301#[derive(Debug)]
2302#[cfg_attr(feature = "serialize", derive(Serialize))]
2303#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2304pub struct ScopeStartWithEnd<'a> {
2305    pub span: Span,
2306    pub start: ScopeStart<'a>,
2307    pub end: ScopeEnd<'a>,
2308}
2309
2310#[derive(Debug)]
2311#[cfg_attr(feature = "serialize", derive(Serialize))]
2312#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2313pub struct SelectorList<'a> {
2314    pub span: Span,
2315    pub selectors: Vec<'a, ComplexSelector<'a>>,
2316    pub comma_spans: Vec<'a, Span>,
2317}
2318
2319#[derive(Debug)]
2320#[cfg_attr(feature = "serialize", derive(Serialize))]
2321#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2322pub struct SimpleBlock<'a> {
2323    pub span: Span,
2324    pub statements: Vec<'a, Statement<'a>>,
2325}
2326
2327#[derive(Debug)]
2328#[cfg_attr(feature = "serialize", derive(Serialize))]
2329#[cfg_attr(feature = "serialize", serde(untagged))]
2330pub enum SimpleSelector<'a> {
2331    Class(ClassSelector<'a>),
2332    Id(IdSelector<'a>),
2333    Type(TypeSelector<'a>),
2334    Attribute(AttributeSelector<'a>),
2335    PseudoClass(PseudoClassSelector<'a>),
2336    PseudoElement(PseudoElementSelector<'a>),
2337    Nesting(NestingSelector<'a>),
2338    SassPlaceholder(SassPlaceholderSelector<'a>),
2339}
2340
2341#[derive(Debug)]
2342#[cfg_attr(feature = "serialize", derive(Serialize))]
2343#[cfg_attr(feature = "serialize", serde(untagged))]
2344pub enum Statement<'a> {
2345    AtRule(AtRule<'a>),
2346    Declaration(Declaration<'a>),
2347    KeyframeBlock(KeyframeBlock<'a>),
2348    LessConditionalQualifiedRule(LessConditionalQualifiedRule<'a>),
2349    LessExtendRule(LessExtendRule<'a>),
2350    LessFunctionCall(Function<'a>),
2351    LessMixinCall(LessMixinCall<'a>),
2352    LessMixinDefinition(Box<'a, LessMixinDefinition<'a>>),
2353    LessVariableCall(LessVariableCall<'a>),
2354    LessVariableDeclaration(Box<'a, LessVariableDeclaration<'a>>),
2355    Placeholder(Placeholder<'a>),
2356    PostcssSimpleVarDeclaration(Box<'a, PostcssSimpleVarDeclaration<'a>>),
2357    QualifiedRule(QualifiedRule<'a>),
2358    SassIfAtRule(Box<'a, SassIfAtRule<'a>>),
2359    SassVariableDeclaration(Box<'a, SassVariableDeclaration<'a>>),
2360    UnknownSassAtRule(Box<'a, UnknownSassAtRule<'a>>),
2361}
2362
2363#[derive(Debug)]
2364#[cfg_attr(feature = "serialize", derive(Serialize))]
2365#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2366pub struct Str<'a> {
2367    pub span: Span,
2368    pub value: &'a str,
2369    pub raw: &'a str,
2370}
2371
2372#[derive(Debug)]
2373#[cfg_attr(feature = "serialize", derive(Serialize))]
2374#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2375pub struct StyleCondition<'a> {
2376    pub span: Span,
2377    pub conditions: Vec<'a, StyleConditionKind<'a>>,
2378}
2379
2380#[derive(Debug)]
2381#[cfg_attr(feature = "serialize", derive(Serialize))]
2382#[cfg_attr(feature = "serialize", serde(untagged))]
2383pub enum StyleConditionKind<'a> {
2384    StyleInParens(StyleInParens<'a>),
2385    And(StyleConditionAnd<'a>),
2386    Or(StyleConditionOr<'a>),
2387    Not(StyleConditionNot<'a>),
2388}
2389
2390#[derive(Debug)]
2391#[cfg_attr(feature = "serialize", derive(Serialize))]
2392#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2393pub struct StyleConditionAnd<'a> {
2394    pub span: Span,
2395    pub keyword: Ident<'a>,
2396    pub style_in_parens: StyleInParens<'a>,
2397}
2398
2399#[derive(Debug)]
2400#[cfg_attr(feature = "serialize", derive(Serialize))]
2401#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2402pub struct StyleConditionNot<'a> {
2403    pub span: Span,
2404    pub keyword: Ident<'a>,
2405    pub style_in_parens: StyleInParens<'a>,
2406}
2407
2408#[derive(Debug)]
2409#[cfg_attr(feature = "serialize", derive(Serialize))]
2410#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2411pub struct StyleConditionOr<'a> {
2412    pub span: Span,
2413    pub keyword: Ident<'a>,
2414    pub style_in_parens: StyleInParens<'a>,
2415}
2416
2417#[derive(Debug)]
2418#[cfg_attr(feature = "serialize", derive(Serialize))]
2419#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2420pub struct StyleInParens<'a> {
2421    pub span: Span,
2422    pub kind: StyleInParensKind<'a>,
2423}
2424
2425#[derive(Debug)]
2426#[cfg_attr(feature = "serialize", derive(Serialize))]
2427#[cfg_attr(feature = "serialize", serde(untagged))]
2428pub enum StyleInParensKind<'a> {
2429    Condition(StyleCondition<'a>),
2430    Feature(Declaration<'a>),
2431}
2432
2433#[derive(Debug)]
2434#[cfg_attr(feature = "serialize", derive(Serialize))]
2435#[cfg_attr(feature = "serialize", serde(untagged))]
2436pub enum StyleQuery<'a> {
2437    Condition(StyleCondition<'a>),
2438    Feature(Declaration<'a>),
2439    /// A bare `<custom-property-name>` existence test: `style(--theme)`
2440    /// (css-conditional-5 `<style-feature>`).
2441    FeatureName(InterpolableIdent<'a>),
2442}
2443
2444#[derive(Debug)]
2445#[cfg_attr(feature = "serialize", derive(Serialize))]
2446#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2447pub struct Stylesheet<'a> {
2448    pub span: Span,
2449    pub statements: Vec<'a, Statement<'a>>,
2450}
2451
2452#[derive(Debug)]
2453#[cfg_attr(feature = "serialize", derive(Serialize))]
2454#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2455pub struct SupportsAnd<'a> {
2456    pub span: Span,
2457    pub keyword: Ident<'a>,
2458    pub condition: SupportsInParens<'a>,
2459}
2460
2461#[derive(Debug)]
2462#[cfg_attr(feature = "serialize", derive(Serialize))]
2463#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2464pub struct SupportsCondition<'a> {
2465    pub span: Span,
2466    pub conditions: Vec<'a, SupportsConditionKind<'a>>,
2467}
2468
2469#[derive(Debug)]
2470#[cfg_attr(feature = "serialize", derive(Serialize))]
2471#[cfg_attr(feature = "serialize", serde(untagged))]
2472pub enum SupportsConditionKind<'a> {
2473    Not(SupportsNot<'a>),
2474    And(SupportsAnd<'a>),
2475    Or(SupportsOr<'a>),
2476    SupportsInParens(SupportsInParens<'a>),
2477}
2478
2479#[derive(Debug)]
2480#[cfg_attr(feature = "serialize", derive(Serialize))]
2481#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2482pub struct SupportsDecl<'a> {
2483    pub span: Span,
2484    pub decl: Declaration<'a>,
2485}
2486
2487#[derive(Debug)]
2488#[cfg_attr(feature = "serialize", derive(Serialize))]
2489#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2490pub struct SupportsInParens<'a> {
2491    pub span: Span,
2492    pub kind: SupportsInParensKind<'a>,
2493}
2494
2495#[derive(Debug)]
2496#[cfg_attr(feature = "serialize", derive(Serialize))]
2497#[cfg_attr(feature = "serialize", serde(untagged))]
2498pub enum SupportsInParensKind<'a> {
2499    SupportsCondition(SupportsCondition<'a>),
2500    Feature(Box<'a, SupportsDecl<'a>>),
2501    Selector(SelectorList<'a>),
2502    Function(Function<'a>),
2503    GeneralEnclosed(TokenSeq<'a>),
2504    /// Sass only: a lone interpolation as a condition operand,
2505    /// e.g. `@supports #{"(a: b)"} { ... }`.
2506    Interpolation(InterpolableIdent<'a>),
2507}
2508
2509#[derive(Debug)]
2510#[cfg_attr(feature = "serialize", derive(Serialize))]
2511#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2512pub struct SupportsNot<'a> {
2513    pub span: Span,
2514    pub keyword: Ident<'a>,
2515    pub condition: SupportsInParens<'a>,
2516}
2517
2518#[derive(Debug)]
2519#[cfg_attr(feature = "serialize", derive(Serialize))]
2520#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2521pub struct SupportsOr<'a> {
2522    pub span: Span,
2523    pub keyword: Ident<'a>,
2524    pub condition: SupportsInParens<'a>,
2525}
2526
2527#[derive(Debug)]
2528#[cfg_attr(feature = "serialize", derive(Serialize))]
2529#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2530pub struct TagNameSelector<'a> {
2531    pub span: Span,
2532    pub name: WqName<'a>,
2533}
2534
2535#[derive(Debug)]
2536#[cfg_attr(feature = "serialize", derive(Serialize))]
2537#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2538pub struct TokenSeq<'a> {
2539    pub span: Span,
2540    pub tokens: Vec<'a, TokenWithSpan<'a>>,
2541}
2542
2543#[derive(Debug)]
2544#[cfg_attr(feature = "serialize", derive(Serialize))]
2545#[cfg_attr(feature = "serialize", serde(untagged))]
2546pub enum TypeSelector<'a> {
2547    TagName(TagNameSelector<'a>),
2548    Universal(UniversalSelector<'a>),
2549}
2550
2551#[derive(Debug)]
2552#[cfg_attr(feature = "serialize", derive(Serialize))]
2553#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2554pub struct UnicodeRange<'a> {
2555    pub span: Span,
2556    pub prefix: char,
2557    pub start: u32,
2558    pub start_raw: &'a str,
2559    pub end: u32,
2560    pub end_raw: Option<&'a str>,
2561}
2562
2563#[derive(Debug)]
2564#[cfg_attr(feature = "serialize", derive(Serialize))]
2565#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2566pub struct UniversalSelector<'a> {
2567    pub span: Span,
2568    pub prefix: Option<NsPrefix<'a>>,
2569}
2570
2571#[derive(Debug)]
2572#[cfg_attr(feature = "serialize", derive(Serialize))]
2573#[cfg_attr(feature = "serialize", serde(untagged))]
2574pub enum UnknownAtRulePrelude<'a> {
2575    ComponentValue(ComponentValue<'a>),
2576    TokenSeq(TokenSeq<'a>),
2577}
2578
2579#[derive(Debug)]
2580#[cfg_attr(feature = "serialize", derive(Serialize))]
2581#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2582pub struct UnknownSassAtRule<'a> {
2583    pub span: Span,
2584    pub name: InterpolableIdent<'a>,
2585    pub prelude: Option<UnknownAtRulePrelude<'a>>,
2586    pub block: Option<SimpleBlock<'a>>,
2587}
2588
2589#[derive(Debug)]
2590#[cfg_attr(feature = "serialize", derive(Serialize))]
2591#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2592pub struct UnquotedFontFamilyName<'a> {
2593    pub span: Span,
2594    pub idents: Vec<'a, InterpolableIdent<'a>>,
2595}
2596
2597#[derive(Debug)]
2598#[cfg_attr(feature = "serialize", derive(Serialize))]
2599#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2600pub struct Url<'a> {
2601    pub span: Span,
2602    pub name: Ident<'a>,
2603    pub value: Option<UrlValue<'a>>,
2604    pub modifiers: Vec<'a, UrlModifier<'a>>,
2605}
2606
2607#[derive(Debug)]
2608#[cfg_attr(feature = "serialize", derive(Serialize))]
2609#[cfg_attr(feature = "serialize", serde(untagged))]
2610pub enum UrlModifier<'a> {
2611    Ident(InterpolableIdent<'a>),
2612    Function(Function<'a>),
2613}
2614
2615/// `)` is excluded
2616#[derive(Debug)]
2617#[cfg_attr(feature = "serialize", derive(Serialize))]
2618#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2619pub struct UrlRaw<'a> {
2620    pub span: Span,
2621    pub value: &'a str,
2622    pub raw: &'a str,
2623}
2624
2625#[derive(Debug)]
2626#[cfg_attr(feature = "serialize", derive(Serialize))]
2627#[cfg_attr(feature = "serialize", serde(untagged))]
2628pub enum UrlValue<'a> {
2629    Raw(UrlRaw<'a>),
2630    SassInterpolated(SassInterpolatedUrl<'a>),
2631    Str(InterpolableStr<'a>),
2632    LessEscapedStr(LessEscapedStr<'a>),
2633}
2634
2635#[derive(Debug)]
2636#[cfg_attr(feature = "serialize", derive(Serialize))]
2637#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
2638pub struct WqName<'a> {
2639    pub span: Span,
2640    pub name: InterpolableIdent<'a>,
2641    pub prefix: Option<NsPrefix<'a>>,
2642}