partial interface Element {
  [SameObject] readonly attribute CSSToggleMap toggles;
};

interface CSSToggleMap {
  maplike<DOMString, CSSToggle>;
  CSSToggleMap set(DOMString key, CSSToggle value);
};

interface CSSToggle {
  attribute (unsigned long or DOMString) value;
  attribute unsigned long? valueAsNumber;
  attribute DOMString? valueAsString;

  attribute (unsigned long or FrozenArray<DOMString>) states;
  attribute boolean group;
  attribute CSSToggleScope scope;
  attribute CSSToggleCycle cycle;

  constructor(optional CSSToggleData options);
};

dictionary CSSToggleData {
  (unsigned long or DOMString) value = 0;
  (unsigned long or sequence<DOMString>) states = 1;
  boolean group = false;
  CSSToggleScope scope = "wide";
  CSSToggleCycle cycle = "cycle";
};

enum CSSToggleScope {
  "narrow",
  "wide",
};

enum CSSToggleCycle {
  "cycle",
  "cycle-on",
  "sticky",
};

interface CSSToggleEvent : Event {
  constructor(DOMString type, optional CSSToggleEventInit eventInitDict = {});
  readonly attribute DOMString toggleName;
  readonly attribute CSSToggle? toggle;
};

dictionary CSSToggleEventInit : EventInit {
  DOMString toggleName = "";
  CSSToggle? toggle = null;
};
