/** @deprecated */
interface CssSelectors extends StringMap {
    IMAGE: string;
}

interface CssPropertyData {
    trait: number;
    type: number;
    value: string | CssStyleAttr[];
    keywords?: CssPropertyKeywords | (() => CssPropertyKeywords);
    anyStart?: number;
    separator?: string | [string, number, ...string[]];
    range?: [number, number] | [number, number, number, number];
    keywordEnd?: number;
    allValue?: -1 | 0 | 1 | 2;
    splitValue?: [number, number, number?];
    repeatStart?: number | [number, string, number?];
    extends?: CssStyleAttr[];
    name?: string;
    also?: CssStyleAttr;
    readonly alias?: CssStyleAttr;
    readonly valueOfNone?: string;
    readonly valueOfAuto?: string;
    /** @deprecated */
    readonly valueOfShorthand?: string;
    readonly valueOfSome?: (elememt: Element) => string;
}

interface CssPropertyWritingModeData {
    readonly value: [CssStyleAttr, CssStyleAttr, CssStyleAttr?] | [CssStyleAttr, CssStyleAttr][];
}

interface CssCascadeLayer {
    sessionId: string;
    name: string;
    parent: CssCascadeLayer | null;
    namespaces: CssCascadeLayer[];
    elements: Map<Element, IterableMap<LayerElementData>>;
    keyframes: KeyframesMap | null;
    fontFeatureValues: FontFeatureValuesMap | null;
    add(name: string | undefined): CssCascadeLayer;
    find(name: string): CssCascadeLayer | undefined;
    getElementData(element: Element, pseudoElt?: PseudoElt): LayerElementData | undefined;
    get nameList(): string[];
}

declare var CssCascadeLayer: {
    create(root: CssCascadeLayer, nameList: string[]): CssCascadeLayer | undefined;
    prototype: CssCascadeLayer;
    new(sessionId: string, name?: string, parent?: CssCascadeLayer): CssCascadeLayer;
};

interface CssConditionData extends ConditionAction {
    readonly name?: string;
    readonly parentRule?: CSSRule | null;
}

interface ConditionAction {
    readonly conditionText: string;
}

interface CssScopeData {
    selectorText: string;
    readonly start: Element[];
    readonly parentRule: CSSScopeRule[];
    readonly selectorParent?: string;
    readonly end?: Element[];
}

interface CssRuleSession {
    active: boolean;
    selectors: string[];
    selectorsScope: string[];
    important?: string[];
    namespace?: CssCascadeLayer;
    container?: CssConditionData;
    scope?: CssScopeData;
}

interface ElementData extends PropertyValueSuffix<"style", PseudoElt | PseudoStyleElt, CSSStyleDeclaration>, PropertyValueSuffix<"styleMap", PseudoElt | PseudoStyleElt | PseudoStyleWebkitElt, CssStyleMap>, PropertyValueSuffix<"styleSpecificity", PseudoElt, ObjectMap<number>> {
    sessionId?: string;
    clientRect?: DOMRect;
    textRangeRect?: BoxRectDimension;
    pseudoElt?: PseudoElt;
    node?: unknown;
    style?: CSSStyleDeclaration;
    styleMap?: CssStyleMap;
    styleSpecificity?: ObjectMap<Specificity>;
    keyframes?: KeyframesMap;
    fontFeatureValues?: FontFeatureValuesMap;
}

interface LayerElementData {
    styleMap: CssStyleMap;
    styleSpecificity: ObjectMap<Specificity>;
    importantMap?: CssStyleMap;
    importantSpecificity?: ObjectMap<Specificity>;
}

interface ImportMap {
    imports?: StringMap;
    scopes?: ObjectMap<StringMap>;
    integrity?: StringMap;
}

type CssPropertyKeywords = (
    string |
    [string, string, (string | string[])?] |
    [string | string[], number[], boolean?] |
    [string | string[], string[]] |
    [string[], string?, number?] |
    [string[], string[], string?]
)[];

type KeyframeData = ObjectMap<StringMap>;
type FontFeatureValuesData = { [K in KeyOfType<CSSFontFeatureValuesRule, string, CSSFontFeatureValuesMap>]?: Map<string, string>; };
type CssProperties = ObjectMap<CssPropertyData>;
type CssStyleProperties = { [K in KeyOfType<CSSStyleDeclaration, string, string>]?: CssPropertyData };
type CssPropertiesWritingMode = { [K in KeyOfType<CSSStyleDeclaration, string, string>]?: CssPropertyWritingModeData };
type CssDataTypes = ObjectMap<string[] | (() => string[])>;