// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
// Source: CSS Parser API (https://wicg.github.io/css-parser-api/)

typedef (DOMString or ReadableStream) CSSStringSource;
typedef (DOMString or CSSStyleValue or CSSParserValue) CSSToken;

partial namespace CSS {
  Promise<sequence<CSSParserRule>> parseStylesheet(CSSStringSource css, optional CSSParserOptions options = {});
  Promise<sequence<CSSParserRule>> parseRuleList(CSSStringSource css, optional CSSParserOptions options = {});
  Promise<CSSParserRule> parseRule(CSSStringSource css, optional CSSParserOptions options = {});
  Promise<sequence<CSSParserRule>> parseDeclarationList(CSSStringSource css, optional CSSParserOptions options = {});
  CSSParserDeclaration parseDeclaration(DOMString css, optional CSSParserOptions options = {});
  CSSToken parseValue(DOMString css);
  sequence<CSSToken> parseValueList(DOMString css);
  sequence<sequence<CSSToken>> parseCommaValueList(DOMString css);
};

dictionary CSSParserOptions {
  object atRules;
  /* dict of at-rule name => at-rule type
     (contains decls or contains qualified rules) */
};

[Exposed=Window]
interface CSSParserRule {
  /* Just a superclass. */
};

[Exposed=Window]
interface CSSParserAtRule : CSSParserRule {
  constructor(DOMString name, sequence<CSSToken> prelude, optional sequence<CSSParserRule>? body);
  readonly attribute DOMString name;
  readonly attribute FrozenArray<CSSParserValue> prelude;
  readonly attribute FrozenArray<CSSParserRule>? body;
  /* nullable to handle at-statements */
  stringifier;
};

[Exposed=Window]
interface CSSParserQualifiedRule : CSSParserRule {
  constructor(sequence<CSSToken> prelude, optional sequence<CSSParserRule>? body);
  readonly attribute FrozenArray<CSSParserValue> prelude;
  readonly attribute FrozenArray<CSSParserRule> body;
  stringifier;
};

[Exposed=Window]
interface CSSParserDeclaration : CSSParserRule {
  constructor(DOMString name, optional sequence<CSSParserRule> body);
  readonly attribute DOMString name;
  readonly attribute FrozenArray<CSSParserValue> body;
  stringifier;
};

[Exposed=Window]
interface CSSParserValue {
  /* Just a superclass. */
};

[Exposed=Window]
interface CSSParserBlock : CSSParserValue {
  constructor(DOMString name, sequence<CSSParserValue> body);
  readonly attribute DOMString name; /* "[]", "{}", or "()" */
  readonly attribute FrozenArray<CSSParserValue> body;
  stringifier;
};

[Exposed=Window]
interface CSSParserFunction : CSSParserValue {
  constructor(DOMString name, sequence<sequence<CSSParserValue>> args);
  readonly attribute DOMString name;
  readonly attribute FrozenArray<FrozenArray<CSSParserValue>> args;
  stringifier;
};
