import $ from './spellu-engine';
/**
 *  CSS
 *      3.0 - https://www.w3.org/TR/css-syntax-3/
 *      2.2 - 2016/4/12 https://www.w3.org/TR/CSS22/
 *      1.0 - 2008/4/11 https://www.w3.org/TR/CSS1/
 */
declare namespace grammar$css {
    const enum Syntax {
        StyleSheet = "css.StyleSheet",
        Statement = "css.Statement",
        Import = "css.Import",
        AtRule = "css.AtRule",
        Ruleset = "css.Ruleset",
        Selector = "css.Selector",
        Declaration = "css.Declaration",
        Identifier = "css.Identifier",
        Tag = "css.Tag",
        Id = "css.Id",
        Class = "css.Class",
        Attribute = "css.Attribute",
        Pseudo = "css.Pseudo",
        Combinator = "css.Combinator",
        ValueList = "css.ValueList",
        Value = "css.Value",
        Function = "css.Function"
    }
    const enum Syntax {
        OpenCommentToken = "css.token.open-comment",
        CloseCommentToken = "css.token.close-comment",
        CommentToken = "css.token.comment",
        AsteriskToken = "css.token.*",
        IdToken = "css.token.id",
        ClassToken = "css.token.class",
        IdentToken = "css.token.ident",
        NumberToken = "css.token.number",
        DimensionToken = "css.token.dimension",
        PercentageToken = "css.token.percentage",
        HashToken = "css.token.hash",
        StringToken = "css.token.string",
        ImportantToken = "css.token.important",
        CommaToken = "css.token.,",
        SlashToken = "css.token.slash",
        ColonToken = "css.token.:",
        SemiColonToken = "css.token.;",
        SingleQuoteToken = "css.token.'",
        DoublequoteToken = "css.token.\"",
        PlusToken = "css.token.+",
        GreaterToken = "css.token.>",
        TildaToken = "css.token.~",
        AtmarkToken = "css.token.@",
        EqualToken = "css.token.=",
        HatEqualToken = "css.token.^=",
        DollerEqualToken = "css.token.$=",
        AsteriskEqualToken = "css.token.*=",
        TildaEqualToken = "css.token.~=",
        VerticalBarEqualToken = "css.token.|=",
        OpenParenToken = "css.token.(",
        CloseParenToken = "css.token.)",
        OpenBraceToken = "css.token.{",
        CloseBraceToken = "css.token.}",
        OpenBracketToken = "css.token.[",
        CloseBracketToken = "css.token.]",
        LooseSlashToken = "css.token.loose-slash"
    }
    enum ElementCombinator {
        Descendant = " ",
        Child = ">",
        NextSibling = "+",
        SubsequentSibling = "~"
    }
    enum MatchOperator {
        WholeMatch = "=",
        PrefixMatch = "^=",
        SuffixMatch = "$=",
        SubstringMatch = "*=",
        Includes = "~=",
        DashMatch = "|="
    }
    type Node = Token | StyleSheet | Statement | Selector | SelectorItem | Declaration | Identifier | Expression | Value;
    interface Token extends $.Token {
    }
    interface StyleSheet extends $.Node {
        syntax: Syntax.StyleSheet;
        statements: Statement[];
    }
    type Statement = Statement.Import | Statement.Ruleset;
    namespace Statement {
        interface Import extends $.Node {
            syntax: Syntax.Import;
        }
        interface Ruleset extends $.Node {
            syntax: Syntax.Ruleset;
            selectors: Selector[];
            declarations: Declaration[];
        }
    }
    interface Selector extends $.Node {
        syntax: Syntax.Selector;
        items: SelectorItem[];
    }
    type SelectorItem = SelectorItem.Tag | SelectorItem.Id | SelectorItem.Class | SelectorItem.Attribute | SelectorItem.Pseudo | SelectorItem.Combinator;
    namespace SelectorItem {
        interface Tag extends $.Node {
            syntax: Syntax.Tag;
            name: string;
        }
        interface Id extends $.Node {
            syntax: Syntax.Id;
            name: string;
        }
        interface Class extends $.Node {
            syntax: Syntax.Class;
            name: string;
        }
        interface Attribute extends $.Node {
            syntax: Syntax.Attribute;
            name: Token;
            operator?: MatchOperator;
            value?: Value;
        }
        interface Pseudo extends $.Node {
            syntax: Syntax.Pseudo;
            name: Token;
            parameter?: SelectorItem;
        }
        interface Combinator extends $.Node {
            syntax: Syntax.Combinator;
            combinator: ElementCombinator;
        }
    }
    interface Declaration extends $.Node {
        syntax: Syntax.Declaration;
        property: Identifier;
        value: Expression;
        important?: boolean;
    }
    interface Identifier extends $.Node {
        syntax: Syntax.Identifier;
        name: Token;
    }
    type Expression = ValueList | Function | Value;
    interface ValueList extends $.Node {
        syntax: Syntax.ValueList;
        items: Expression[];
        separator: string;
    }
    interface Function extends $.Node {
        syntax: Syntax.Function;
        name: Token;
        parameters: Value[];
    }
    interface Value extends $.Node {
        syntax: Syntax.Value;
        value: string;
        token: Token;
    }
}
declare namespace grammar$css {
    function selectProcessorSuite(suite: ProcessorSuite): $.Processor[];
    function scan<V>(source: string | $.SourceDescriptor, suite?: ProcessorSuite, rule?: string, options?: Partial<$.ScanOptions>): V;
    function tokens(source: string | $.SourceDescriptor, options?: Partial<$.ScanOptions>): Token[];
}
declare namespace grammar$css {
    const enum PrintFormat {
        Minify = 0,
        Pretty = 1
    }
    type PrintOptions = {
        format?: PrintFormat;
    };
    function print(value: StyleSheet, options?: PrintOptions): string;
}
/**
 *  CSS 3
 *
 *  stylesheet = statement-list
 *  statement-list = ( ruleset )*
 *  ruleset = selectorGroup '{' propertyList '}'
 *  selectorGroup = selector ( ',' selector )*
 *  selector = selectorItem ( combinator )? selectorItem
 *  selectorItem = id | class | attribute | pseudo | negation
 *  id = '#' [a-zA-Z][a-zA-Z0-9]*
 *  class = '.' [a-zA-Z][a-zA-Z0-9]*
 *  combinator = '+' | '>' | '~'
 *  declarationList = ( declaration? ( ';' declaration? )* )?
 *  declaration = property ':' value
 *  property = ident
 *  value = ...
 *  comment = '/' '*' ... '*' '/'
 */
declare namespace grammar$css.recipes {
    const css: $.Recipe;
}
declare namespace grammar$css.recipes {
    const selectors: $.Recipe;
}
declare namespace grammar$css.recipes {
    const values: $.Recipe;
}
declare namespace grammar$css {
    enum ProcessorSuite {
        CST = "cst",
        AST = "ast"
    }
    const processors: {
        [name: string]: {
            [name: string]: $.Processor;
        };
    };
}
declare namespace grammar$css {
}
declare namespace grammar$css {
}
declare namespace grammar$css {
}
declare namespace grammar$css {
}
export default grammar$css;
//# sourceMappingURL=grammar-css.d.ts.map