[
  {
    "__docId__": 1,
    "kind": "external",
    "name": "Infinity",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Infinity",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 2,
    "kind": "external",
    "name": "NaN",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~NaN",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 3,
    "kind": "external",
    "name": "undefined",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~undefined",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 4,
    "kind": "external",
    "name": "null",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~null",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 5,
    "kind": "external",
    "name": "Object",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Object",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 6,
    "kind": "external",
    "name": "object",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~object",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 7,
    "kind": "external",
    "name": "Function",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Function",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 8,
    "kind": "external",
    "name": "function",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~function",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 9,
    "kind": "external",
    "name": "Boolean",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Boolean",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 10,
    "kind": "external",
    "name": "boolean",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~boolean",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 11,
    "kind": "external",
    "name": "Symbol",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Symbol",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 12,
    "kind": "external",
    "name": "Error",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Error",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 13,
    "kind": "external",
    "name": "EvalError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~EvalError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 14,
    "kind": "external",
    "name": "InternalError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~InternalError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 15,
    "kind": "external",
    "name": "RangeError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~RangeError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 16,
    "kind": "external",
    "name": "ReferenceError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~ReferenceError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 17,
    "kind": "external",
    "name": "SyntaxError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~SyntaxError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 18,
    "kind": "external",
    "name": "TypeError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~TypeError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 19,
    "kind": "external",
    "name": "URIError",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~URIError",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 20,
    "kind": "external",
    "name": "Number",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Number",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 21,
    "kind": "external",
    "name": "number",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~number",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 22,
    "kind": "external",
    "name": "Date",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Date",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 23,
    "kind": "external",
    "name": "String",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~String",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 24,
    "kind": "external",
    "name": "string",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~string",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 25,
    "kind": "external",
    "name": "RegExp",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~RegExp",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 26,
    "kind": "external",
    "name": "Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 27,
    "kind": "external",
    "name": "Int8Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Int8Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 28,
    "kind": "external",
    "name": "Uint8Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Uint8Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 29,
    "kind": "external",
    "name": "Uint8ClampedArray",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Uint8ClampedArray",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 30,
    "kind": "external",
    "name": "Int16Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Int16Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 31,
    "kind": "external",
    "name": "Uint16Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Uint16Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 32,
    "kind": "external",
    "name": "Int32Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Int32Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 33,
    "kind": "external",
    "name": "Uint32Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Uint32Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 34,
    "kind": "external",
    "name": "Float32Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Float32Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 35,
    "kind": "external",
    "name": "Float64Array",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Float64Array",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 36,
    "kind": "external",
    "name": "Map",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Map",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 37,
    "kind": "external",
    "name": "Set",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Set",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 38,
    "kind": "external",
    "name": "WeakMap",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~WeakMap",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 39,
    "kind": "external",
    "name": "WeakSet",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~WeakSet",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 40,
    "kind": "external",
    "name": "ArrayBuffer",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~ArrayBuffer",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 41,
    "kind": "external",
    "name": "DataView",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~DataView",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 42,
    "kind": "external",
    "name": "JSON",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~JSON",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 43,
    "kind": "external",
    "name": "Promise",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Promise",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 44,
    "kind": "external",
    "name": "Generator",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Generator",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 45,
    "kind": "external",
    "name": "GeneratorFunction",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~GeneratorFunction",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 46,
    "kind": "external",
    "name": "Reflect",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Reflect",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 47,
    "kind": "external",
    "name": "Proxy",
    "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~Proxy",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 48,
    "kind": "external",
    "name": "CustomEvent",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/CustomEvent",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~CustomEvent",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 49,
    "kind": "external",
    "name": "HTMLElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 50,
    "kind": "external",
    "name": "HTMLAnchorElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLAnchorElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLAnchorElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 51,
    "kind": "external",
    "name": "HTMLButtonElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLButtonElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLButtonElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 52,
    "kind": "external",
    "name": "HTMLTableElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTableElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTableElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 53,
    "kind": "external",
    "name": "HTMLTableSectionElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTableSectionElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTableSectionElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 54,
    "kind": "external",
    "name": "HTMLTableCellElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTableCellElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTableCellElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 55,
    "kind": "external",
    "name": "HTMLTableRowElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTableRowElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTableRowElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 56,
    "kind": "external",
    "name": "HTMLTableColElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTableColElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTableColElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 57,
    "kind": "external",
    "name": "HTMLTextAreaElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLTextAreaElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLTextAreaElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 58,
    "kind": "external",
    "name": "HTMLInputElement",
    "externalLink": "https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~HTMLInputElement",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 59,
    "kind": "external",
    "name": "momentJS",
    "externalLink": "https://momentjs.com/",
    "memberof": "coral-spectrum/.external-ecmascript.js",
    "static": true,
    "longname": "coral-spectrum/.external-ecmascript.js~momentJS",
    "access": "public",
    "description": "",
    "builtinExternal": true
  },
  {
    "__docId__": 60,
    "kind": "file",
    "name": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseLabellable} from '../../../coral-base-labellable';\nimport {Icon} from '../../../coral-component-icon';\nimport {transform, validate, commons} from '../../../coral-utils';\n\n/**\n Enumeration for {@link Button}, {@link AnchorButton} icon sizes.\n\n @typedef {Object} ButtonIconSizeEnum\n\n @property {String} EXTRA_EXTRA_SMALL\n Extra extra small size icon, typically 9px size.\n @property {String} EXTRA_SMALL\n Extra small size icon, typically 12px size.\n @property {String} SMALL\n Small size icon, typically 18px size. This is the default size.\n @property {String} MEDIUM\n Medium size icon, typically 24px size.\n */\nconst iconSize = {};\nconst excludedIconSizes = [Icon.size.LARGE, Icon.size.EXTRA_LARGE, Icon.size.EXTRA_EXTRA_LARGE];\nfor (const key in Icon.size) {\n  // Populate button icon sizes by excluding the largest icon sizes\n  if (excludedIconSizes.indexOf(Icon.size[key]) === -1) {\n    iconSize[key] = Icon.size[key];\n  }\n}\n\n/**\n Enumeration for {@link Button}, {@link AnchorButton} variants.\n\n @typedef {Object} ButtonVariantEnum\n\n @property {String} CTA\n A button that is meant to grab the user's attention.\n @property {String} PRIMARY\n A button that is meant to grab the user's attention.\n @property {String} QUIET\n A quiet button that indicates that the button's action is the primary action.\n @property {String} SECONDARY\n A button that indicates that the button's action is the secondary action.\n @property {String} QUIET_SECONDARY\n A quiet secondary button.\n @property {String} ACTION\n An action button.\n @property {String} QUIET_ACTION\n A quiet action button.\n @property {String} MINIMAL\n A quiet minimalistic button.\n @property {String} WARNING\n A button that indicates that the button's action is dangerous.\n @property {String} QUIET_WARNING\n A quiet warning button,\n @property {String} OVER_BACKGROUND\n A button to be placed on top of colored background.\n @property {String} DEFAULT\n The default button look and feel.\n */\nconst variant = {\n  CTA: 'cta',\n  PRIMARY: 'primary',\n  SECONDARY: 'secondary',\n  QUIET: 'quiet',\n  MINIMAL: 'minimal',\n  WARNING: 'warning',\n  ACTION: 'action',\n  QUIET_ACTION: 'quietaction',\n  QUIET_SECONDARY: 'quietsecondary',\n  QUIET_WARNING: 'quietwarning',\n  OVER_BACKGROUND: 'overbackground',\n  DEFAULT: 'default',\n  // Private to be used for custom Button classes like field buttons\n  _CUSTOM: '_custom'\n};\n\n// the button's base classname\nconst CLASSNAME = '_coral-Button';\nconst ACTION_CLASSNAME = '_coral-ActionButton';\n\nconst ALL_VARIANT_CLASSES = [\n  `${CLASSNAME}--cta`,\n  `${CLASSNAME}--primary`,\n  `${CLASSNAME}--secondary`,\n  `${CLASSNAME}--warning`,\n  `${CLASSNAME}--quiet`,\n  `${ACTION_CLASSNAME}--quiet`,\n  `${CLASSNAME}--overBackground`,\n];\n\nconst VARIANT_MAP = {\n  cta: [CLASSNAME, ALL_VARIANT_CLASSES[0]],\n  primary: [CLASSNAME, ALL_VARIANT_CLASSES[0]],\n  secondary: [CLASSNAME, ALL_VARIANT_CLASSES[2]],\n  warning: [CLASSNAME, ALL_VARIANT_CLASSES[3]],\n  quiet: [CLASSNAME, ALL_VARIANT_CLASSES[1], ALL_VARIANT_CLASSES[4]],\n  minimal: [CLASSNAME, ALL_VARIANT_CLASSES[2], ALL_VARIANT_CLASSES[4]],\n  default: [CLASSNAME, ALL_VARIANT_CLASSES[1]],\n  action: [ACTION_CLASSNAME],\n  quietaction: [ACTION_CLASSNAME, ALL_VARIANT_CLASSES[5]],\n  quietsecondary: [CLASSNAME, ALL_VARIANT_CLASSES[2], ALL_VARIANT_CLASSES[4]],\n  quietwarning: [CLASSNAME, ALL_VARIANT_CLASSES[3], ALL_VARIANT_CLASSES[4]],\n  overbackground: [CLASSNAME, ALL_VARIANT_CLASSES[6]]\n};\n\n/**\n Enumeration for {@link BaseButton} sizes.\n\n @typedef {Object} ButtonSizeEnum\n\n @property {String} MEDIUM\n A medium button is the default, normal sized button.\n @property {String} LARGE\n Not supported. Falls back to MEDIUM.\n */\nconst size = {\n  MEDIUM: 'M',\n  LARGE: 'L'\n};\n\n/**\n Enumeration for {@link BaseButton} icon position options.\n\n @typedef {Object} ButtonIconPositionEnum\n\n @property {String} RIGHT\n Position should be right of the button label.\n @property {String} LEFT\n Position should be left of the button label.\n */\nconst iconPosition = {\n  RIGHT: 'right',\n  LEFT: 'left'\n};\n\n/**\n @base BaseButton\n @classdesc The base element for Button components\n */\nconst BaseButton = (superClass) => class extends BaseLabellable(superClass) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      // Create or fetch the label element\n      label: this.querySelector(this._contentZoneTagName) || document.createElement(this._contentZoneTagName),\n      icon: this.querySelector('coral-icon')\n    };\n\n    // Events\n    this._events = {\n      mousedown: '_onMouseDown',\n      click: '_onClick'\n    };\n\n    super._observeLabel();\n  }\n\n  /**\n   The label of the button.\n   @type {HTMLElement}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: this._contentZoneTagName,\n      insert: function (label) {\n        // Update label styles\n        this._updateLabel(label);\n\n        // Ensure there's no extra space left for icon only buttons\n        if (label.innerHTML.trim() === '') {\n          label.textContent = '';\n        }\n\n        if (this.iconPosition === iconPosition.LEFT) {\n          this.appendChild(label);\n        } else {\n          this.insertBefore(label, this.firstChild);\n        }\n      }\n    });\n  }\n\n  /**\n   Position of the icon relative to the label. If no <code>iconPosition</code> is provided, it will be set on the\n   left side by default.\n   See {@link ButtonIconPositionEnum}.\n\n   @type {String}\n   @default ButtonIconPositionEnum.LEFT\n   @htmlattribute iconposition\n   @htmlattributereflected\n   */\n  get iconPosition() {\n    return this._iconPosition || iconPosition.LEFT;\n  }\n\n  set iconPosition(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(iconPosition)(value) && value || iconPosition.LEFT;\n    \n    this._reflectAttribute('iconposition', value);\n\n    if(validate.valueMustChange(this._iconPosition, value)) {\n      this._iconPosition = value;\n      this._updateIcon(this.icon);\n    }\n  }\n\n  /**\n   Specifies the icon name used inside the button. See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    if (this._elements.icon) {\n      return this._elements.icon.getAttribute('icon') || '';\n    }\n\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    value = transform.string(value);\n    if(validate.valueMustChange(this._icon, value)) {\n      this._icon = value;\n      this._updateIcon(value);\n    }\n  }\n\n  /**\n   Size of the icon. It accepts both lower and upper case sizes. See {@link ButtonIconSizeEnum}.\n\n   @type {String}\n   @default ButtonIconSizeEnum.SMALL\n   @htmlattribute iconsize\n   */\n  get iconSize() {\n    if (this._elements.icon) {\n      return this._elements.icon.getAttribute('size') || Icon.size.SMALL;\n    }\n\n    return this._iconSize || Icon.size.SMALL;\n  }\n\n  set iconSize(value) {\n    value = transform.string(value).toUpperCase();\n    value = validate.enumeration(Icon.size)(value) && value || Icon.size.SMALL;\n\n    if(validate.valueMustChange(this._iconSize, value)) {\n      this._iconSize = value;\n      this._updatedIcon && this._getIconElement().setAttribute('size', value);\n    }\n  }\n\n  /**\n   Whether aria-label is set automatically. See {@link IconAutoAriaLabelEnum}.\n\n   @type {String}\n   @default IconAutoAriaLabelEnum.OFF\n   @htmlattribute autoarialabel\n   */\n  get iconAutoAriaLabel() {\n    if (this._elements.icon) {\n      return this._elements.icon.getAttribute('autoarialabel') || Icon.autoAriaLabel.OFF;\n    }\n\n    return this._iconAutoAriaLabel || Icon.autoAriaLabel.OFF;\n  }\n\n  set iconAutoAriaLabel(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(Icon.autoAriaLabel)(value) && value || Icon.autoAriaLabel.OFF;\n\n    if(validate.valueMustChange(this._iconAutoAriaLabel, value)) {\n      this._iconAutoAriaLabel = value;\n      this._updatedIcon && this._getIconElement().setAttribute('autoarialabel', value);\n    }\n  }\n\n  /**\n   The size of the button. It accepts both lower and upper case sizes. See {@link ButtonSizeEnum}.\n   Currently only \"MEDIUM\" is supported.\n\n   @type {String}\n   @default ButtonSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    \n    this._reflectAttribute('size', this._size);\n  }\n\n  /**\n   Whether the button is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n    \n    this._reflectAttribute('selected', value);\n\n    if(validate.valueMustChange(this._selected, value)) {\n      this._selected = value;\n\n      this.classList.toggle('is-selected', value);\n  \n      this.trigger('coral-button:_selectedchanged');\n    }\n  }\n\n  // We just reflect it but we also trigger an event to be used by button group\n  /** @ignore */\n  get value() {\n    return this.getAttribute('value');\n  }\n\n  set value(value) {\n    this._reflectAttribute('value', value);\n\n    this.trigger('coral-button:_valuechanged');\n  }\n\n  /**\n   Expands the button to the full width of the parent.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute block\n   @htmlattributereflected\n   */\n  get block() {\n    return this._block || false;\n  }\n\n  set block(value) {\n    value = transform.booleanAttr(value);\n    \n    this._reflectAttribute('block', value);\n\n    if(validate.valueMustChange(this._block, value)) {\n      this._block = value;\n\n      this.classList.toggle(`${CLASSNAME}--block`, value);\n    }\n  }\n\n  /**\n   The button's variant. See {@link ButtonVariantEnum}.\n\n   @type {String}\n   @default ButtonVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n\n    this._reflectAttribute('variant', value);\n\n    if(validate.valueMustChange(this._variant , value)) {\n      this._variant = value;\n\n      // removes every existing variant\n      this.classList.remove(CLASSNAME, ACTION_CLASSNAME);\n      this.classList.remove(...ALL_VARIANT_CLASSES);\n  \n      if (value === variant._CUSTOM) {\n        this.classList.remove(CLASSNAME);\n      } else {\n        this.classList.add(...VARIANT_MAP[value]);\n  \n        if (value === variant.ACTION || value === variant.QUIET_ACTION) {\n          this.classList.remove(CLASSNAME);\n        }\n      }\n  \n      // Update label styles\n      this._updateLabel();\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() || this.icon :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  _onClick(event) {\n    if (!this.disabled) {\n      this._trackEvent('click', this.getAttribute('is'), event);\n    }\n  }\n\n  /** @ignore */\n  _updateIcon(value) {\n    if (!this._updatedIcon && this._elements.icon) {\n      return;\n    }\n\n    this._updatedIcon = true;\n\n    const iconSizeValue = this.iconSize;\n    const iconAutoAriaLabelValue = this.iconAutoAriaLabel;\n    const iconElement = this._getIconElement();\n    iconElement.icon = value;\n    // Update size as well\n    iconElement.size = iconSizeValue;\n    // Update autoAriaLabel as well\n    iconElement.autoAriaLabel = iconAutoAriaLabelValue;\n\n    // removes the icon element from the DOM.\n    if (this.icon === '') {\n      iconElement.remove();\n    }\n    // add or adjust the icon. Add it back since it was blown away by textContent\n    else if (!iconElement.parentNode || this._iconPosition) {\n      if (this.contains(this.label)) {\n        // insertBefore with <code>null</code> appends\n        this.insertBefore(iconElement, this.iconPosition === iconPosition.LEFT ? this.label : this.label.nextElementSibling);\n      }\n    }\n\n    super._toggleIconAriaHidden();\n  }\n\n  /** @ignore */\n  _getIconElement() {\n    if (!this._elements.icon) {\n      this._elements.icon = new Icon();\n      this._elements.icon.size = this.iconSize;\n    }\n    return this._elements.icon;\n  }\n\n  /**\n   Forces button to receive focus on mousedown\n   @param {MouseEvent} event mousedown event\n   @ignore\n   */\n  _onMouseDown(event) {\n    const target = event.matchedTarget;\n\n    // Wait a frame or button won't receive focus in Safari.\n    window.requestAnimationFrame(() => {\n      if (target !== document.activeElement) {\n        target.focus();\n      }\n    });\n  }\n\n  _updateLabel(label) {\n    label = label || this._elements.label;\n\n    label.classList.remove(`${CLASSNAME}-label`, `${ACTION_CLASSNAME}-label`);\n\n    if (this._variant !== variant._CUSTOM) {\n      if (this._variant === variant.ACTION || this._variant === variant.QUIET_ACTION) {\n        label.classList.add(`${ACTION_CLASSNAME}-label`);\n      } else {\n        label.classList.add(`${CLASSNAME}-label`);\n      }\n    }\n  }\n\n  /** @private */\n  get _contentZoneTagName() {\n    return Object.keys(this._contentZones)[0];\n  }\n\n  get _contentZones() {\n    return {'coral-button-label': 'label'};\n  }\n\n  /**\n   Returns {@link BaseButton} sizes.\n\n   @return {ButtonSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link BaseButton} variants.\n\n   @return {ButtonVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link BaseButton} icon positions.\n\n   @return {ButtonIconPositionEnum}\n   */\n  static get iconPosition() {\n    return iconPosition;\n  }\n\n  /**\n   Returns {@link BaseButton} icon sizes.\n\n   @return {ButtonIconSizeEnum}\n   */\n  static get iconSize() {\n    return iconSize;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      iconposition: 'iconPosition',\n      iconsize: 'iconSize',\n      iconautoarialabel: 'iconAutoAriaLabel'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'iconposition',\n      'iconsize',\n      'icon',\n      'iconautoarialabel',\n      'size',\n      'selected',\n      'block',\n      'variant',\n      'value'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    const label = this._elements.label;\n\n    const contentZoneProvided = label.parentNode;\n\n    // Remove it so we can process children\n    if (contentZoneProvided) {\n      this.removeChild(label);\n    }\n\n    let iconAdded = false;\n    // Process remaining elements as necessary\n    while (this.firstChild) {\n      const child = this.firstChild;\n\n      if (child.nodeName === 'CORAL-ICON') {\n        // Don't add duplicated icons\n        if (iconAdded) {\n          this.removeChild(child);\n        } else {\n          // Conserve existing icon element to content\n          this._elements.icon = child;\n          fragment.appendChild(child);\n          iconAdded = true;\n        }\n      }\n      // Avoid content zone to be voracious\n      else if (contentZoneProvided) {\n        fragment.appendChild(child);\n      } else {\n        // Move anything else into the label\n        label.appendChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n\n    // Make sure the icon is well positioned\n    this._updatedIcon = true;\n    this._updateIcon(this.icon);\n  }\n\n  /**\n   Triggered when {@link BaseButton#selected} changed.\n\n   @typedef {CustomEvent} coral-button:_selectedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link BaseButton#value} changed.\n\n   @typedef {CustomEvent} coral-button:_valuechanged\n\n   @private\n   */\n};\n\nexport default BaseButton;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 61,
    "kind": "typedef",
    "name": "ButtonIconSizeEnum",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ButtonIconSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Button}, {@link AnchorButton} icon sizes.",
    "lineNumber": 31,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_EXTRA_SMALL",
        "description": "Extra extra small size icon, typically 9px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_SMALL",
        "description": "Extra small size icon, typically 12px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "Small size icon, typically 18px size. This is the default size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "Medium size icon, typically 24px size."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ButtonIconSizeEnum"
    }
  },
  {
    "__docId__": 62,
    "kind": "variable",
    "name": "excludedIconSizes",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~excludedIconSizes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "type": {
      "types": [
        "undefined[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 63,
    "kind": "typedef",
    "name": "ButtonVariantEnum",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ButtonVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Button}, {@link AnchorButton} variants.",
    "lineNumber": 70,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CTA",
        "description": "A button that is meant to grab the user's attention."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PRIMARY",
        "description": "A button that is meant to grab the user's attention."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A quiet button that indicates that the button's action is the primary action."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SECONDARY",
        "description": "A button that indicates that the button's action is the secondary action."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET_SECONDARY",
        "description": "A quiet secondary button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ACTION",
        "description": "An action button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET_ACTION",
        "description": "A quiet action button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MINIMAL",
        "description": "A quiet minimalistic button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "A button that indicates that the button's action is dangerous."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET_WARNING",
        "description": "A quiet warning button,"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OVER_BACKGROUND",
        "description": "A button to be placed on top of colored background."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "The default button look and feel."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ButtonVariantEnum"
    }
  },
  {
    "__docId__": 64,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 88,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 65,
    "kind": "variable",
    "name": "ACTION_CLASSNAME",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ACTION_CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 89,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 66,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 91,
    "undocument": true,
    "type": {
      "types": [
        "undefined[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 67,
    "kind": "variable",
    "name": "VARIANT_MAP",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~VARIANT_MAP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 101,
    "undocument": true,
    "type": {
      "types": [
        "{\"cta\": *, \"primary\": *, \"secondary\": *, \"warning\": *, \"quiet\": *, \"minimal\": *, \"default\": *, \"action\": *, \"quietaction\": *, \"quietsecondary\": *, \"quietwarning\": *, \"overbackground\": *}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 68,
    "kind": "typedef",
    "name": "ButtonSizeEnum",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ButtonSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseButton} sizes.",
    "lineNumber": 126,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A medium button is the default, normal sized button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "Not supported. Falls back to MEDIUM."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ButtonSizeEnum"
    }
  },
  {
    "__docId__": 69,
    "kind": "typedef",
    "name": "ButtonIconPositionEnum",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~ButtonIconPositionEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseButton} icon position options.",
    "lineNumber": 141,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT",
        "description": "Position should be right of the button label."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT",
        "description": "Position should be left of the button label."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ButtonIconPositionEnum"
    }
  },
  {
    "__docId__": 70,
    "kind": "function",
    "name": "BaseButton",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~BaseButton",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for Button components",
    "lineNumber": 150,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseButton"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for Button components"
      }
    ],
    "params": [
      {
        "name": "superClass",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 71,
    "kind": "typedef",
    "name": "coral-button:_selectedchanged",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~coral-button:_selectedchanged",
    "access": "private",
    "description": "Triggered when {@link BaseButton#selected} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-button:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 72,
    "kind": "typedef",
    "name": "coral-button:_valuechanged",
    "memberof": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-button/src/scripts/BaseButton.js~coral-button:_valuechanged",
    "access": "private",
    "description": "Triggered when {@link BaseButton#value} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-button:_valuechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 73,
    "kind": "file",
    "name": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport Vent from '@adobe/vent';\nimport {commons, Keys, keys, events, transform, validate, tracking as trackingUtil} from '../../../coral-utils';\n\n// Used to split events by type/target\nconst delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n/**\n Enumeration representing the tracking options.\n\n @typedef {Object} TrackingEnum\n\n @property {String} ON\n Enables tracking of the component interactions.\n @property {String} OFF\n Disables tracking of the component interactions.\n */\nconst tracking = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Return the method corresponding to the method name or the function, if passed.\n @ignore\n */\nconst getListenerFromMethodNameOrFunction = function (obj, eventName, methodNameOrFunction) {\n  // Try to get the method\n  if (typeof methodNameOrFunction === 'function') {\n    return methodNameOrFunction;\n  } else if (typeof methodNameOrFunction === 'string') {\n    if (!obj[methodNameOrFunction]) {\n      throw new Error(`Coral.Component: Unable to add ${eventName} listener for ${obj.toString()}, method\n      ${methodNameOrFunction} not found`);\n    }\n\n    const listener = obj[methodNameOrFunction];\n\n    if (typeof listener !== 'function') {\n      throw new Error(`Coral.Component: Unable to add ${eventName} listener for ${obj.toString()}, listener is a\n      ${(typeof listener)} but should be a function`);\n    }\n\n    return listener;\n  } else if (methodNameOrFunction) {\n    // If we're passed something that's truthy (like an object), but it's not a valid method name or a function, get\n    // angry\n    throw new Error(`Coral.Component: Unable to add ${eventName} listener for ${obj.toString()}, ${methodNameOrFunction}\n    is neither a method name or a function`);\n  }\n\n  return null;\n};\n\n/**\n Add local event and key combo listeners for this component, store global event/key combo listeners for later.\n @ignore\n */\nconst delegateEvents = function () {\n  /*\n   Add listeners to new event\n   - Include in hash\n   Add listeners to existing event\n   - Override method and use super\n   Remove existing event\n   - Pass null\n   */\n  let match;\n  let eventName;\n  let eventInfo;\n  let listener;\n  let selector;\n  let elements;\n  let isGlobal;\n  let isKey;\n  let isResize;\n  let isCapture;\n\n  for (eventInfo in this._events) {\n    listener = this._events[eventInfo];\n\n    // Extract the event name and the selector\n    match = eventInfo.match(delegateEventSplitter);\n    eventName = `${match[1]}.CoralComponent`;\n    selector = match[2];\n\n    if (selector === '') {\n      // instead of null because the key module checks for undefined\n      selector = undefined;\n    }\n\n    // Try to get the method corresponding to the value in the map\n    listener = getListenerFromMethodNameOrFunction(this, eventName, listener);\n\n    if (listener) {\n      // Always execute in the context of the object\n      // @todo is this necessary? this should be correct anyway\n      listener = listener.bind(this);\n\n      // Check if the listener is on the window\n      isGlobal = eventName.indexOf('global:') === 0;\n      if (isGlobal) {\n        eventName = eventName.substr(7);\n      }\n\n      // Check if the listener is a capture listener\n      isCapture = eventName.indexOf('capture:') === 0;\n      if (isCapture) {\n        // @todo Limitation: It should be possible to do capture:global:, but it isn't\n        eventName = eventName.substr(8);\n      }\n\n      // Check if the listener is a key listener\n      isKey = eventName.indexOf('key:') === 0;\n      if (isKey) {\n        if (isCapture) {\n          throw new Error('Coral.Keys does not currently support listening to key events with capture');\n        }\n        eventName = eventName.substr(4);\n      }\n\n      // Check if the listener is a resize listener\n      isResize = eventName.indexOf('resize') === 0;\n      if (isResize) {\n        if (isCapture) {\n          throw new Error('Coral.commons.addResizeListener does not currently support listening to resize event with capture');\n        }\n      }\n\n      if (isGlobal) {\n        // Store for adding/removal\n        if (isKey) {\n          this._globalKeys = this._globalKeys || [];\n          this._globalKeys.push({\n            keyCombo: eventName,\n            selector: selector,\n            listener: listener\n          });\n        } else {\n          this._globalEvents = this._globalEvents || [];\n          this._globalEvents.push({eventName, selector, listener, isCapture});\n        }\n      }\n      // Events on the element itself\n      else if (isKey) {\n        // Create the keys instance only if its needed\n        this._keys = this._keys || new Keys(this, {\n          // The filter function for keyboard events.\n          filter: this._filterKeys,\n          // Execute key listeners in the context of the element\n          context: this\n        });\n\n        // Add listener locally\n        this._keys.on(eventName, selector, listener);\n      } else if (isResize) {\n        if (selector) {\n          elements = document.querySelectorAll(selector);\n          for (let i = 0 ; i < elements.length ; ++i) {\n            commons.addResizeListener(elements[i], listener);\n          }\n        } else {\n          commons.addResizeListener(this, listener);\n        }\n      } else {\n        this._vent.on(eventName, selector, listener, isCapture);\n      }\n    }\n  }\n};\n\n/**\n Attach global event listeners for this component.\n @ignore\n */\nconst delegateGlobalEvents = function () {\n  let i;\n  if (this._globalEvents) {\n    // Remove global event listeners\n    for (i = 0 ; i < this._globalEvents.length ; i++) {\n      const event = this._globalEvents[i];\n      events.on(event.eventName, event.selector, event.listener, event.isCapture);\n    }\n  }\n\n  if (this._globalKeys) {\n    // Remove global key listeners\n    for (i = 0 ; i < this._globalKeys.length ; i++) {\n      const key = this._globalKeys[i];\n      keys.on(key.keyCombo, key.selector, key.listener);\n    }\n  }\n\n  if (this._keys) {\n    this._keys.init(true);\n  }\n};\n\n/**\n Remove global event listeners for this component.\n @ignore\n */\nconst undelegateGlobalEvents = function () {\n  let i;\n  if (this._globalEvents) {\n    // Remove global event listeners\n    for (i = 0 ; i < this._globalEvents.length ; i++) {\n      const event = this._globalEvents[i];\n      events.off(event.eventName, event.selector, event.listener, event.isCapture);\n    }\n  }\n\n  if (this._globalKeys) {\n    // Remove global key listeners\n    for (i = 0 ; i < this._globalKeys.length ; i++) {\n      const key = this._globalKeys[i];\n      keys.off(key.keyCombo, key.selector, key.listener);\n    }\n  }\n\n  if (this._keys) {\n    this._keys.destroy(true);\n  }\n};\n\n// Used to find upper case characters\nconst REG_EXP_UPPERCASE = /[A-Z]/g;\n\n/**\n Returns the constructor namespace\n @ignore\n */\nconst getConstructorName = function (constructor) {\n  // Will contain the namespace of the constructor in reversed order\n  const constructorName = [];\n  // Keep a reference on the passed constructor\n  const originalConstructor = constructor;\n\n  // Traverses Coral constructors if not already done to set the namespace\n  if (!constructor._namespace) {\n    // Set namespace on Coral constructors until 'constructor' is found\n    const find = (obj, constructorToFind) => {\n      let found = false;\n      const type = typeof obj;\n\n      if (obj && type === 'object' || type === 'function') {\n        const subObj = Object.keys(obj);\n\n        for (let i = 0 ; i < subObj.length ; i++) {\n          const key = subObj[i];\n\n          // Components are capitalized\n          if (key[0].match(REG_EXP_UPPERCASE) !== null) {\n            // Keep a reference of the constructor name and its parent\n            obj[key]._namespace = {\n              parent: obj,\n              value: key\n            };\n\n            found = obj[key] === constructorToFind;\n\n            if (found) {\n              break;\n            } else {\n              found = find(obj[key], constructorToFind);\n            }\n          }\n        }\n      }\n\n      return found;\n    };\n\n    // Look for the constructor in the Coral namespace\n    find(window.Coral, constructor);\n  }\n\n  // Climb up the constructor namespace\n  while (constructor) {\n    if (constructor._namespace) {\n      constructorName.push(constructor._namespace.value);\n      constructor = constructor._namespace.parent;\n    } else {\n      constructor = false;\n    }\n  }\n\n  // Build the full namespace string and save it for reuse\n  originalConstructor._componentName = constructorName.reverse().join('.');\n\n  return originalConstructor._componentName;\n};\n\n/**\n * recursively update the _ignoreConnectedCallback value\n * for children coral-component, if parent has ignored the callback\n * its child should also ignore the callback hooks\n * @private\n */\nconst _recursiveIgnoreConnectedCallback = function(el, value) {\n  let children = Array.from(el.children);\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    // todo better check for coral-component\n    if(typeof child._ignoreConnectedCallback === 'boolean') {\n      child._ignoreConnectedCallback = value;\n    } else {\n      _recursiveIgnoreConnectedCallback(child, value);\n    }\n  }\n};\n\n/**\n @base BaseComponent\n @classdesc The base element for all Coral components\n */\nclass BaseComponent extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach Vent\n    this._vent = new Vent(this);\n    this._events = {};\n\n    // Content zone MO for virtual DOM support\n    if (this._contentZones) {\n      this._contentZoneObserver = new MutationObserver((mutations) => {\n        mutations.forEach((mutation) => {\n          for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n            const addedNode = mutation.addedNodes[i];\n\n            for (const name in this._contentZones) {\n              const contentZone = this._contentZones[name];\n              if (addedNode.nodeName.toLowerCase() === name && !addedNode._contentZoned) {\n                // Insert the content zone at the right position\n                /** @ignore */\n                this[contentZone] = addedNode;\n              }\n            }\n          }\n        });\n      });\n\n      this._contentZoneObserver.observe(this, {\n        childList: true,\n        subtree: true\n      });\n    }\n  }\n\n  /**\n   Tracking of events. This provides insight on the usage of the components. It accepts \"ON\" and \"OFF\". In order to\n   successfully track the events, {Tracking} needs to be configured.\n\n   @type {String}\n   @default TrackingEnum.ON\n   @htmlattribute tracking\n   */\n  get tracking() {\n    return this._tracking || this.getAttribute('tracking') || tracking.ON;\n  }\n\n  set tracking(value) {\n    value = transform.string(value).toLowerCase();\n    this._tracking = validate.enumeration(tracking)(value) && value || tracking.ON;\n  }\n\n  /**\n   The string representing the feature being tracked. This provides additional context to the analytics trackers\n   about the feature that the element enables.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute trackingfeature\n   */\n  get trackingFeature() {\n    return this._trackingFeature || this.getAttribute('trackingFeature') || '';\n  }\n\n  set trackingFeature(value) {\n    this._trackingFeature = transform.string(value);\n  }\n\n  /**\n   The string representing the element name being tracked. This providex additional context to the trackers about the\n   element that was interacted with.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute trackingelement\n   */\n  get trackingElement() {\n    return this._trackingElement || this.getAttribute('trackingElement') || '';\n  }\n\n  set trackingElement(value) {\n    this._trackingElement = transform.string(value);\n  }\n\n  // Constructs and returns the component name based on the constructor\n  get _componentName() {\n    return this.constructor._componentName || getConstructorName(this.constructor);\n  }\n\n  // The filter function for keyboard events. By default, any child element can trigger keyboard events.\n  // You can pass {@link Keys.filterInputs} to avoid listening to key events triggered from within\n  // inputs.\n  _filterKeys() {\n    return true;\n  }\n\n  // Attach event listeners including global ones\n  _delegateEvents(eventMap) {\n    this._events = commons.extend(this._events, eventMap);\n    delegateEvents.call(this);\n\n    // Once events are attached, we dispose them\n    this._events = {};\n  }\n\n  // Returns the content zone if the component is connected and contains the content zone else null\n  // Ideally content zones will be replaced by shadow dom and <slot> elements\n  _getContentZone(contentZone) {\n    if (document.documentElement.contains(this)) {\n      return this.contains(contentZone) && contentZone || null;\n    }\n    // Return the content zone by default\n    return contentZone;\n  }\n\n  // Sets the value as content zone for the property given the specified options\n  // Ideally content zones will be replaced by shadow dom and <slot> elements\n  _setContentZone(property, value, options) {\n    const handle = options.handle;\n    const expectedTagName = options.tagName;\n    const additionalSetter = options.set;\n    const insert = options.insert;\n\n    let oldNode;\n\n    if (value) {\n      if (!(value instanceof HTMLElement)) {\n        throw new Error(`DOMException: Failed to set the \"${property}\" property on \"${this.toString()}\":\n        The provided value is not of type \"HTMLElement\".`);\n      }\n\n      if (expectedTagName && value.tagName.toLowerCase() !== expectedTagName) {\n        throw new Error(`DOMException: Failed to set the \"${property}\" property on \"${this.toString()}\": The new\n        ${property} element is of type \"${value.tagName}\". It must be a \"${expectedTagName.toUpperCase()}\" element.`);\n      }\n\n      oldNode = this._elements[handle];\n\n      // Flag it for the content zone MO\n      value._contentZoned = true;\n\n      // Replace the existing element\n      if (insert) {\n        // Remove old node\n        if (oldNode && oldNode.parentNode) {\n          oldNode.parentNode.removeChild(oldNode);\n        }\n        // Insert new node\n        insert.call(this, value);\n      } else if (oldNode && oldNode.parentNode) {\n        commons._log('warn', `${this._componentName} does not define an insert method for content zone ${handle}, falling back to replace.`);\n        // Old way -- assume we have an old node\n        this._elements[handle].parentNode.replaceChild(value, this._elements[handle]);\n      } else {\n        commons._log('error', `${this._componentName} does not define an insert method for content zone ${handle}, falling back to append.`);\n        // Just append, which may introduce bugs, but at least doesn't crazy\n        this.appendChild(value);\n      }\n    } else {\n      // we need to remove the content zone if it exists\n      oldNode = this._elements[handle];\n      if (oldNode && oldNode.parentNode) {\n        oldNode.parentNode.removeChild(oldNode);\n      }\n    }\n\n    // Re-assign the handle to the new element\n    this._elements[handle] = value;\n\n    // Invoke the setter\n    if (typeof additionalSetter === 'function') {\n      additionalSetter.call(this, value);\n    }\n  }\n\n  // Handles the reflection of properties by using a flag to prevent setting the property by changing the attribute\n  _reflectAttribute(attributeName, value) {\n    if (typeof value === 'boolean') {\n      if (value && !this.hasAttribute(attributeName)) {\n        this._reflectedAttribute = true;\n        this.setAttribute(attributeName, '');\n        this._reflectedAttribute = false;\n      } else if (!value && this.hasAttribute(attributeName)) {\n        this._reflectedAttribute = true;\n        this.removeAttribute(attributeName);\n        this._reflectedAttribute = false;\n      }\n    } else if (this.getAttribute(attributeName) !== String(value)) {\n      this._reflectedAttribute = true;\n      this.setAttribute(attributeName, value);\n      this._reflectedAttribute = false;\n    }\n  }\n\n  /**\n   Notifies external listeners about an internal interaction. This method is used internally in every\n   component's method that we want to track.\n\n   @param {String} eventType The event type. Eg. click, select, etc.\n   @param {String} targetType The element type being used. Eg. cyclebutton, cyclebuttonitem, etc.\n   @param {CustomEvent} event\n   @param {BaseComponent} childComponent - Optional, in case the event occurred on a child component.\n\n   @returns {BaseComponent}\n   */\n  _trackEvent(eventType, targetType, event, childComponent) {\n    if (this.tracking === this.constructor.tracking.ON) {\n      trackingUtil.track(eventType, targetType, event, this, childComponent);\n    }\n    return this;\n  }\n\n  /**\n   Returns the component name.\n\n   @return {String}\n   */\n  toString() {\n    return `Coral.${this._componentName}`;\n  }\n\n  /**\n   Add an event listener.\n\n   @param {String} eventName\n   The event name to listen for.\n   @param {String} [selector]\n   The selector to use for event delegation.\n   @param {Function} func\n   The function that will be called when the event is triggered.\n   @param {Boolean} [useCapture=false]\n   Whether or not to listen during the capturing or bubbling phase.\n   @returns {BaseComponent} this, chainable.\n   */\n  on(eventName, selector, func, useCapture) {\n    this._vent.on(eventName, selector, func, useCapture);\n    return this;\n  }\n\n  /**\n   Remove an event listener.\n\n   @param {String} eventName\n   The event name to stop listening for.\n   @param {String} [selector]\n   The selector that was used for event delegation.\n   @param {Function} func\n   The function that was passed to <code>on()</code>.\n   @param {Boolean} [useCapture]\n   Only remove listeners with <code>useCapture</code> set to the value passed in.\n   @returns {BaseComponent} this, chainable.\n   */\n  off(eventName, selector, func, useCapture) {\n    this._vent.off(eventName, selector, func, useCapture);\n    return this;\n  }\n\n  /**\n   Trigger an event.\n\n   @param {String} eventName\n   The event name to trigger.\n   @param {Object} [props]\n   Additional properties to make available to handlers as <code>event.detail</code>.\n   @param {Boolean} [bubbles=true]\n   Set to <code>false</code> to prevent the event from bubbling.\n   @param {Boolean} [cancelable=true]\n   Set to <code>false</code> to prevent the event from being cancelable.\n   @returns {CustomEvent} CustomEvent object\n   */\n  trigger(eventName, props, bubbles, cancelable) {\n    // When 'bubbles' is not set, then default to true:\n    bubbles = bubbles || bubbles === undefined;\n\n    // When 'cancelable' is not set, then default to true:\n    cancelable = cancelable || cancelable === undefined;\n\n    const event = new CustomEvent(eventName, {\n      bubbles: bubbles,\n      cancelable: cancelable,\n      detail: props\n    });\n\n    // Don't trigger the event if silenced\n    if (this._silenced) {\n      return event;\n    }\n\n    // default value in case the dispatching fails\n    let defaultPrevented = false;\n\n    try {\n      // leads to NS_ERROR_UNEXPECTED in Firefox\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=329509\n      defaultPrevented = !this.dispatchEvent(event);\n    }\n      // eslint-disable-next-line no-empty\n    catch (e) {\n    }\n\n    // Check if the defaultPrevented status was correctly stored back to the event object\n    if (defaultPrevented !== event.defaultPrevented) {\n      // dispatchEvent() doesn't correctly set event.defaultPrevented in IE 9\n      // However, it does return false if preventDefault() was called\n      // Unfortunately, the returned event's defaultPrevented property is read-only\n      // We need to work around this such that (patchedEvent instanceof Event) === true\n      // First, we'll create an object that uses the event as its prototype\n      // This gives us an object we can modify that is still technically an instanceof Event\n      const patchedEvent = Object.create(event);\n\n      // Next, we set the correct value for defaultPrevented on the new object\n      // We cannot simply assign defaultPrevented, it causes a \"Invalid Calling Object\" error in IE 9\n      // For some reason, defineProperty doesn't cause this\n      Object.defineProperty(patchedEvent, 'defaultPrevented', {\n        value: defaultPrevented\n      });\n\n      return patchedEvent;\n    }\n\n    return event;\n  }\n\n  /**\n   Set multiple properties.\n\n   @param {Object.<String, *>} properties\n   An object of property/value pairs to set.\n   @param {Boolean} silent\n   If true, events should not be triggered as a result of this set.\n\n   @returns {BaseComponent} this, chainable.\n   */\n  set(propertyOrProperties, valueOrSilent, silent) {\n    let property;\n    let properties;\n    let value;\n\n    const isContentZone = (prop) => this._contentZones && commons.swapKeysAndValues(this._contentZones)[prop];\n\n    const updateContentZone = (prop, val) => {\n      // If content zone exists and we only want to update properties on the content zone\n      if (this[prop] instanceof HTMLElement && !(val instanceof HTMLElement)) {\n        for (const contentZoneProperty in val) {\n          /** @ignore */\n          this[prop][contentZoneProperty] = val[contentZoneProperty];\n        }\n      }\n      // Else assign the new value to the content zone\n      else {\n        /** @ignore */\n        this[prop] = val;\n      }\n    };\n\n    const setProperty = (prop, val) => {\n      if (isContentZone(prop)) {\n        updateContentZone(prop, val);\n      } else {\n        this._silenced = silent;\n        /** @ignore */\n        this[prop] = val;\n        this._silenced = false;\n      }\n    };\n\n    if (typeof propertyOrProperties === 'string') {\n      // Set a single property\n      property = propertyOrProperties;\n      value = valueOrSilent;\n\n      setProperty(property, value);\n    } else {\n      properties = propertyOrProperties;\n      silent = valueOrSilent;\n\n      // Set a map of properties\n      for (property in properties) {\n        value = properties[property];\n\n        setProperty(property, value);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   Get the value of a property.\n\n   @param {String} property\n   The name of the property to fetch the value of.\n   @returns {*} Property value.\n   */\n  get(property) {\n    return this[property];\n  }\n\n  /**\n   Show this component.\n\n   @returns {BaseComponent} this, chainable\n   */\n  show() {\n    if (!this.hidden) {\n      return this;\n    }\n\n    /** @ignore */\n    this.hidden = false;\n    return this;\n  }\n\n  /**\n   Hide this component.\n   @returns {BaseComponent} this, chainable\n   */\n  hide() {\n    if (this.hidden) {\n      return this;\n    }\n\n    /** @ignore */\n    this.hidden = true;\n    return this;\n  }\n\n  /**\n    This should be executed when messenger is connect event is connected.\n    It will add the parent as a listener in child messenger.\n    @ignore\n   */\n  _onMessengerConnected(event) {\n    event.stopImmediatePropagation();\n\n    let handler = event.detail.handler;\n    if(typeof handler === 'function') {\n      handler(this);\n    } else {\n      throw new Error(\"Messenger handler should be a function\");\n    }\n  }\n\n  /**\n   specify whether the connected and disconnected hooks are ignore for component\n   @returns true when ignored\n   @private\n   */\n  get _ignoreConnectedCallback() {\n    return this.__ignoreConnectedCallback || false;\n  }\n\n  set _ignoreConnectedCallback(value) {\n    value = transform.booleanAttr(value);\n\n    if(value !== this.__ignoreConnectedCallback) {\n      this.__ignoreConnectedCallback = value;\n      _recursiveIgnoreConnectedCallback(this, value);\n    }\n  }\n\n  /**\n   Returns {@link BaseComponent} tracking options.\n\n   @return {TrackingEnum}\n   */\n  static get tracking() {\n    return tracking;\n  }\n\n  static get _attributePropertyMap() {\n    return {\n      trackingelement: 'trackingElement',\n      trackingfeature: 'trackingFeature'\n    };\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return [\n      'tracking',\n      'trackingelement',\n      'trackingfeature',\n      'trackingFeature'\n    ];\n  }\n\n  /** @ignore */\n  // eslint-disable-next-line no-unused-vars\n  attributeChangedCallback(name, oldValue, value) {\n    const self = this;\n    if (!self._reflectedAttribute) {\n      // Use the attribute/property mapping\n      self[self.constructor._attributePropertyMap[name] || name] = value;\n    }\n  }\n\n  /**\n   called when we need to suspend state and properties, when\n   disconnected callback are skipped.\n   @private\n   */\n  _suspendCallback() {\n    // do nothing\n  }\n\n  /**\n   called when we need to re-initialise state and properties, when\n   connected callback are skipped.\n   @private\n   */\n  _resumeCallback() {\n    // do nothing\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    // A component that is reattached should respond to global events again\n    // Attach global listener when component is connected to DOM\n    // this would avoid memory leak when element is created but never connected.\n    delegateGlobalEvents.call(this);\n\n    this._disconnected = false;\n\n    if (!this._rendered) {\n      this.render();\n    }\n  }\n\n  /** @ignore */\n  render() {\n    this._rendered = true;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    // A component that isn't in the DOM should not be responding to global events\n    this._disconnected = true;\n    \n    undelegateGlobalEvents.call(this);\n  }\n};\n\nexport default BaseComponent;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 74,
    "kind": "variable",
    "name": "delegateEventSplitter",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~delegateEventSplitter",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 75,
    "kind": "typedef",
    "name": "TrackingEnum",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~TrackingEnum",
    "access": "public",
    "description": "Enumeration representing the tracking options.",
    "lineNumber": 29,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Enables tracking of the component interactions."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Disables tracking of the component interactions."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TrackingEnum"
    }
  },
  {
    "__docId__": 76,
    "kind": "function",
    "name": "getListenerFromMethodNameOrFunction",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~getListenerFromMethodNameOrFunction",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Return the method corresponding to the method name or the function, if passed.",
    "lineNumber": 38,
    "ignore": true,
    "params": [
      {
        "name": "obj",
        "types": [
          "*"
        ]
      },
      {
        "name": "eventName",
        "types": [
          "*"
        ]
      },
      {
        "name": "methodNameOrFunction",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 77,
    "kind": "function",
    "name": "delegateEvents",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~delegateEvents",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Add local event and key combo listeners for this component, store global event/key combo listeners for later.",
    "lineNumber": 70,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 78,
    "kind": "function",
    "name": "delegateGlobalEvents",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~delegateGlobalEvents",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Attach global event listeners for this component.",
    "lineNumber": 187,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 79,
    "kind": "function",
    "name": "undelegateGlobalEvents",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~undelegateGlobalEvents",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Remove global event listeners for this component.",
    "lineNumber": 214,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 80,
    "kind": "variable",
    "name": "REG_EXP_UPPERCASE",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~REG_EXP_UPPERCASE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 238,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 81,
    "kind": "function",
    "name": "getConstructorName",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~getConstructorName",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Returns the constructor namespace",
    "lineNumber": 244,
    "ignore": true,
    "params": [
      {
        "name": "constructor",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 82,
    "kind": "function",
    "name": "_recursiveIgnoreConnectedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~_recursiveIgnoreConnectedCallback",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "recursively update the _ignoreConnectedCallback value\nfor children coral-component, if parent has ignored the callback\nits child should also ignore the callback hooks",
    "lineNumber": 311,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 83,
    "kind": "class",
    "name": "BaseComponent",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for all Coral components",
    "lineNumber": 328,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseComponent"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for all Coral components"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 84,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 330,
    "ignore": true
  },
  {
    "__docId__": 85,
    "kind": "member",
    "name": "_vent",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_vent",
    "access": "private",
    "description": null,
    "lineNumber": 334,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 86,
    "kind": "member",
    "name": "_events",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_events",
    "access": "private",
    "description": null,
    "lineNumber": 335,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 87,
    "kind": "member",
    "name": "_contentZoneObserver",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_contentZoneObserver",
    "access": "private",
    "description": null,
    "lineNumber": 339,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 88,
    "kind": "member",
    "name": "[contentZone]",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#[contentZone]",
    "access": "public",
    "description": null,
    "lineNumber": 349,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 89,
    "kind": "member",
    "name": "tracking",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#tracking",
    "access": "public",
    "description": "Tracking of events. This provides insight on the usage of the components. It accepts \"ON\" and \"OFF\". In order to\nsuccessfully track the events, {Tracking} needs to be configured.\n<ul><li><code>TrackingEnum.ON</code> by default.</li></ul>",
    "lineNumber": 371,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "TrackingEnum.ON"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "tracking"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 91,
    "kind": "member",
    "name": "_tracking",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_tracking",
    "access": "private",
    "description": null,
    "lineNumber": 377,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 92,
    "kind": "member",
    "name": "trackingFeature",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#trackingFeature",
    "access": "public",
    "description": "The string representing the feature being tracked. This provides additional context to the analytics trackers\nabout the feature that the element enables.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 388,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "trackingfeature"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 94,
    "kind": "member",
    "name": "_trackingFeature",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_trackingFeature",
    "access": "private",
    "description": null,
    "lineNumber": 393,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 95,
    "kind": "member",
    "name": "trackingElement",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#trackingElement",
    "access": "public",
    "description": "The string representing the element name being tracked. This providex additional context to the trackers about the\nelement that was interacted with.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 404,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "trackingelement"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 97,
    "kind": "member",
    "name": "_trackingElement",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_trackingElement",
    "access": "private",
    "description": null,
    "lineNumber": 409,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 98,
    "kind": "member",
    "name": "_componentName",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_componentName",
    "access": "private",
    "description": null,
    "lineNumber": 413,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 99,
    "kind": "method",
    "name": "_filterKeys",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_filterKeys",
    "access": "private",
    "description": null,
    "lineNumber": 420,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 100,
    "kind": "method",
    "name": "_delegateEvents",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_delegateEvents",
    "access": "private",
    "description": null,
    "lineNumber": 425,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "eventMap",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 103,
    "kind": "method",
    "name": "_getContentZone",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_getContentZone",
    "access": "private",
    "description": null,
    "lineNumber": 435,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "contentZone",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 104,
    "kind": "method",
    "name": "_setContentZone",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_setContentZone",
    "access": "private",
    "description": null,
    "lineNumber": 445,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "property",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      },
      {
        "name": "options",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 105,
    "kind": "method",
    "name": "_reflectAttribute",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_reflectAttribute",
    "access": "private",
    "description": null,
    "lineNumber": 504,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "attributeName",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 106,
    "kind": "member",
    "name": "_reflectedAttribute",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_reflectedAttribute",
    "access": "private",
    "description": null,
    "lineNumber": 507,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 112,
    "kind": "method",
    "name": "_trackEvent",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_trackEvent",
    "access": "private",
    "description": "Notifies external listeners about an internal interaction. This method is used internally in every\ncomponent's method that we want to track.",
    "lineNumber": 533,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventType",
        "description": "The event type. Eg. click, select, etc."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "targetType",
        "description": "The element type being used. Eg. cyclebutton, cyclebuttonitem, etc."
      },
      {
        "nullable": null,
        "types": [
          "CustomEvent"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "childComponent",
        "description": "Optional, in case the event occurred on a child component."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 113,
    "kind": "method",
    "name": "toString",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#toString",
    "access": "public",
    "description": "Returns the component name.",
    "lineNumber": 545,
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": ""
    },
    "params": []
  },
  {
    "__docId__": 114,
    "kind": "method",
    "name": "on",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#on",
    "access": "public",
    "description": "Add an event listener.",
    "lineNumber": 562,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventName",
        "description": "The event name to listen for."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "The selector to use for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "func",
        "description": "The function that will be called when the event is triggered."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "false",
        "defaultRaw": false,
        "name": "useCapture",
        "description": "Whether or not to listen during the capturing or bubbling phase."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 115,
    "kind": "method",
    "name": "off",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#off",
    "access": "public",
    "description": "Remove an event listener.",
    "lineNumber": 580,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventName",
        "description": "The event name to stop listening for."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "The selector that was used for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "func",
        "description": "The function that was passed to <code>on()</code>."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "name": "useCapture",
        "description": "Only remove listeners with <code>useCapture</code> set to the value passed in."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 116,
    "kind": "method",
    "name": "trigger",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#trigger",
    "access": "public",
    "description": "Trigger an event.",
    "lineNumber": 598,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{CustomEvent} CustomEvent object"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventName",
        "description": "The event name to trigger."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "name": "props",
        "description": "Additional properties to make available to handlers as <code>event.detail</code>."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "true",
        "defaultRaw": true,
        "name": "bubbles",
        "description": "Set to <code>false</code> to prevent the event from bubbling."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "true",
        "defaultRaw": true,
        "name": "cancelable",
        "description": "Set to <code>false</code> to prevent the event from being cancelable."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "CustomEvent"
      ],
      "spread": false,
      "description": "CustomEvent object"
    }
  },
  {
    "__docId__": 117,
    "kind": "method",
    "name": "set",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#set",
    "access": "public",
    "description": "Set multiple properties.",
    "lineNumber": 661,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object.<String, *>"
        ],
        "spread": false,
        "optional": false,
        "name": "properties",
        "description": "An object of property/value pairs to set."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "silent",
        "description": "If true, events should not be triggered as a result of this set."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 118,
    "kind": "member",
    "name": "[prop]",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#[prop]",
    "access": "public",
    "description": null,
    "lineNumber": 679,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 119,
    "kind": "member",
    "name": "_silenced",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_silenced",
    "access": "private",
    "description": null,
    "lineNumber": 687,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 122,
    "kind": "method",
    "name": "get",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#get",
    "access": "public",
    "description": "Get the value of a property.",
    "lineNumber": 722,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{*} Property value."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "property",
        "description": "The name of the property to fetch the value of."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "Property value."
    }
  },
  {
    "__docId__": 123,
    "kind": "method",
    "name": "show",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#show",
    "access": "public",
    "description": "Show this component.",
    "lineNumber": 731,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent} this, chainable"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": "this, chainable"
    },
    "params": []
  },
  {
    "__docId__": 124,
    "kind": "member",
    "name": "hidden",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#hidden",
    "access": "public",
    "description": null,
    "lineNumber": 737,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 125,
    "kind": "method",
    "name": "hide",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#hide",
    "access": "public",
    "description": "Hide this component.",
    "lineNumber": 745,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseComponent} this, chainable"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseComponent"
      ],
      "spread": false,
      "description": "this, chainable"
    },
    "params": []
  },
  {
    "__docId__": 127,
    "kind": "method",
    "name": "_onMessengerConnected",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_onMessengerConnected",
    "access": "private",
    "description": "This should be executed when messenger is connect event is connected.\nIt will add the parent as a listener in child messenger.",
    "lineNumber": 760,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 128,
    "kind": "member",
    "name": "_ignoreConnectedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_ignoreConnectedCallback",
    "access": "private",
    "description": "specify whether the connected and disconnected hooks are ignore for component",
    "lineNumber": 776,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "true when ignored"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "true when ignored"
    },
    "modality": "both",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 130,
    "kind": "member",
    "name": "__ignoreConnectedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#__ignoreConnectedCallback",
    "access": "private",
    "description": null,
    "lineNumber": 784,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 131,
    "kind": "member",
    "name": "tracking",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent.tracking",
    "access": "public",
    "description": "Returns {@link BaseComponent} tracking options.",
    "lineNumber": 794,
    "return": {
      "nullable": null,
      "types": [
        "TrackingEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 132,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 798,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 133,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 806,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 134,
    "kind": "method",
    "name": "attributeChangedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#attributeChangedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 817,
    "ignore": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      },
      {
        "name": "oldValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 135,
    "kind": "method",
    "name": "_suspendCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_suspendCallback",
    "access": "private",
    "description": "called when we need to suspend state and properties, when\ndisconnected callback are skipped.",
    "lineNumber": 830,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 136,
    "kind": "method",
    "name": "_resumeCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_resumeCallback",
    "access": "private",
    "description": "called when we need to re-initialise state and properties, when\nconnected callback are skipped.",
    "lineNumber": 839,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 137,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 844,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 138,
    "kind": "member",
    "name": "_disconnected",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_disconnected",
    "access": "private",
    "description": null,
    "lineNumber": 850,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 139,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#render",
    "access": "public",
    "description": null,
    "lineNumber": 858,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 140,
    "kind": "member",
    "name": "_rendered",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#_rendered",
    "access": "private",
    "description": null,
    "lineNumber": 859,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 141,
    "kind": "method",
    "name": "disconnectedCallback",
    "memberof": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-component/src/scripts/BaseComponent.js~BaseComponent#disconnectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 863,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 143,
    "kind": "file",
    "name": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate} from '../../../coral-utils';\n\n// @compat\nconst CLASSNAME = 'coral-RadioGroup';\n\n/**\n Enumeration for {@link BaseFieldGroup} orientations.\n\n @typedef {Object} BaseFieldGroupOrientationEnum\n\n @property {String} HORIZONTAL\n Horizontal default orientation.\n @property {String} VERTICAL\n Vertical orientation.\n */\nconst orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical'\n};\n\n/**\n @base BaseFieldGroup\n @classdesc The base element for FieldGroup components\n */\nclass BaseFieldGroup extends superClass {\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        itemTagName: this._itemTagName,\n        host: this\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Orientation of the field group. See {@link BaseFieldGroupOrientationEnum}.\n\n   @type {String}\n   @default BaseFieldGroupOrientationEnum.HORIZONTAL\n   @htmlattribute orientation\n   @htmlattributereflected\n   */\n  get orientation() {\n    return this._orientation || orientation.HORIZONTAL;\n  }\n\n  set orientation(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(this.constructor.orientation)(value) && value || orientation.HORIZONTAL;\n    \n    this._reflectAttribute('orientation', value);\n    \n    if(validate.valueMustChange(this._orientation, value)) {\n      this._orientation = value;\n\n      this.classList.toggle(`${CLASSNAME}--vertical`, value === orientation.VERTICAL);\n    }\n  }\n\n  /**\n   Returns the first selected field group item in the Field Group. The value <code>null</code> is returned if no item is\n   selected.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected('checked');\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-fieldgroup-item';\n  }\n\n  /**\n   Returns {@link BaseFieldGroup} orientation options.\n\n   @return {BaseFieldGroupEnum}\n   */\n  static get orientation() {\n    return orientation;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['orientation']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'group');\n\n    // Default reflected attributes\n    if (!this._orientation) {\n      this.orientation = orientation.HORIZONTAL;\n    }\n  }\n};\n\nexport default BaseFieldGroup;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 144,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 145,
    "kind": "typedef",
    "name": "BaseFieldGroupOrientationEnum",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroupOrientationEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseFieldGroup} orientations.",
    "lineNumber": 29,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Horizontal default orientation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Vertical orientation."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "BaseFieldGroupOrientationEnum"
    }
  },
  {
    "__docId__": 146,
    "kind": "class",
    "name": "BaseFieldGroup",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for FieldGroup components",
    "lineNumber": 38,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseFieldGroup"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for FieldGroup components"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 147,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#items",
    "access": "public",
    "description": "The Collection Interface that allows interacting with the items that the component contains.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 148,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#_items",
    "access": "private",
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 149,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#orientation",
    "access": "public",
    "description": "Orientation of the field group. See {@link BaseFieldGroupOrientationEnum}.\n<ul><li><code>BaseFieldGroupOrientationEnum.HORIZONTAL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 65,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "BaseFieldGroupOrientationEnum.HORIZONTAL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "orientation"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 151,
    "kind": "member",
    "name": "_orientation",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#_orientation",
    "access": "private",
    "description": null,
    "lineNumber": 76,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 152,
    "kind": "member",
    "name": "selectedItem",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#selectedItem",
    "access": "public",
    "description": "Returns the first selected field group item in the Field Group. The value <code>null</code> is returned if no item is\nselected.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 89,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 153,
    "kind": "member",
    "name": "_itemTagName",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#_itemTagName",
    "access": "private",
    "description": null,
    "lineNumber": 94,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 154,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup.orientation",
    "access": "public",
    "description": "Returns {@link BaseFieldGroup} orientation options.",
    "lineNumber": 104,
    "return": {
      "nullable": null,
      "types": [
        "BaseFieldGroupEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 155,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 109,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 156,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-fieldgroup/src/scripts/BaseFieldGroup.js~BaseFieldGroup#render",
    "access": "public",
    "description": null,
    "lineNumber": 114,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 158,
    "kind": "file",
    "name": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {transform, commons, validate} from '../../../coral-utils';\n\n// https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories\nlet LABELLABLE_ELEMENTS_SELECTOR = 'button,input:not([type=hidden]),keygen,meter,output,progress,select,textarea';\n// @polyfill ie11\n// IE11 throws syntax error because of the \"not()\" in the selector for some reason in ColorInputColorProperties\nif (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {\n  LABELLABLE_ELEMENTS_SELECTOR = 'button,keygen,meter,output,progress,select,textarea,';\n\n  // Since we can't use :not() we have to indicate all input types\n  [\n    'text',\n    'password',\n    'submit',\n    'reset',\n    'radio',\n    'checkbox',\n    'button',\n    'color',\n    'date',\n    'datetime-local',\n    'email',\n    'month',\n    'number',\n    'range',\n    'search',\n    'tel',\n    'time',\n    'url',\n    'week'\n  ].forEach((type) => {\n    LABELLABLE_ELEMENTS_SELECTOR += `input[type=${type}],`;\n  });\n\n  // Remove last \",\"\n  LABELLABLE_ELEMENTS_SELECTOR = LABELLABLE_ELEMENTS_SELECTOR.slice(0, -1);\n}\n// _onInputChange is only triggered on non-hidden inputs\nconst TARGET_INPUT_SELECTOR = 'input:not([type=hidden])';\n\n/**\n @base BaseFormField\n @classdesc The base element for Form Field components. If not extending a {@link HTMLInputElement}, following\n properties should be implemented at least :\n - <code>disabled</code>. Whether this field is disabled or not.\n - <code>invalid</code>. Whether the current value of this field is invalid or not.\n - <code>name</code>. Name used to submit the data in a form.\n - <code>readOnly</code>. Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n - <code>required</code>. Whether this field is required or not.\n - <code>value</code>. This field's current value.\n */\nclass BaseFormField extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._events = {\n      'capture:change input': '_onTargetInputChange',\n      'global:reset': '_onFormReset'\n    };\n  }\n\n  /**\n   Whether this field is disabled or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   @abstract\n   */\n\n  /**\n   Whether the current value of this field is invalid or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute invalid\n   @htmlattributereflected\n   @abstract\n   */\n\n  /**\n   Name used to submit the data in a form.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   @abstract\n   */\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   This is ignored for checkbox, radio or fileupload.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   @abstract\n   */\n\n  /**\n   Whether this field is required or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   @abstract\n   */\n\n  /**\n   This field's current value.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @abstract\n   */\n\n  /**\n   Whether the current value of this field is invalid or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute invalid\n   @htmlattributereflected\n   */\n  get invalid() {\n    return this._invalid || false;\n  }\n\n  set invalid(value) {\n    value = transform.booleanAttr(value);\n\n    this._reflectAttribute('invalid', value);\n    \n    if(validate.valueMustChange(this._invalid, value)) {\n      this._invalid = value;\n      this.setAttribute('aria-invalid', value);\n      this.classList.toggle('is-invalid', value);\n    }\n  }\n\n  /**\n   Reflects the <code>aria-describedby</code> attribute to the labellable element e.g. inner input.\n\n   @type {String}\n   @default null\n   @htmlattribute describedby\n   */\n  get describedBy() {\n    return this._getLabellableElement().getAttribute('aria-describedby');\n  }\n\n  set describedBy(value) {\n    value = transform.string(value);\n\n    this._getLabellableElement()[value ? 'setAttribute' : 'removeAttribute']('aria-describedby', value);\n  }\n\n  /**\n   Reflects the <code>aria-label</code> attribute to the labellable element e.g. inner input.\n\n   @type {String}\n   @default null\n   @htmlattribute labelled\n   */\n  get labelled() {\n    return this._getLabellableElement().getAttribute('aria-label');\n  }\n\n  set labelled(value) {\n    value = transform.string(value);\n\n    this._getLabellableElement()[value ? 'setAttribute' : 'removeAttribute']('aria-label', value);\n  }\n\n  /**\n   Reference to a space delimited set of ids for the HTML elements that provide a label for the formField.\n   Implementers should override this method to ensure that the appropriate descendant elements are labelled using the\n   <code>aria-labelledby</code> attribute. This will ensure that the component is properly identified for\n   accessibility purposes. It reflects the <code>aria-labelledby</code> attribute to the DOM.\n   @type {?String}\n   @default null\n   @htmlattribute labelledby\n   */\n  get labelledBy() {\n    return this._getLabellableElement().getAttribute('aria-labelledby');\n  }\n\n  set labelledBy(value) {\n    value = transform.string(value);\n\n    // gets the element that will get the label assigned. the _getLabellableElement method should be overriden to\n    // allow other bevaviors.\n    const element = this._getLabellableElement();\n    // we get and assign the it that will be passed around\n    const elementId = element.id = element.id || commons.getUID();\n\n    const currentLabelledBy = element.getAttribute('aria-labelledby');\n\n    // we clear the old label assignments\n    if (currentLabelledBy && currentLabelledBy !== value) {\n      this._updateForAttributes(currentLabelledBy, elementId, true);\n    }\n\n    if (value) {\n      element.setAttribute('aria-labelledby', value);\n      if (element.matches(LABELLABLE_ELEMENTS_SELECTOR)) {\n        this._updateForAttributes(value, elementId);\n      }\n    } else {\n      // since no labelledby value was set, we remove everything\n      element.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /**\n   Target property inside the component that will be updated when a change event is triggered.\n   @type {String}\n   @default \"value\"\n   @protected\n   */\n  get _componentTargetProperty() {\n    return 'value';\n  }\n\n  /**\n   Target property that will be taken from <code>event.target</code> and set into\n   {@link BaseFormField#_componentTargetProperty} when a change event is triggered.\n   @type {String}\n   @default \"value\"\n   @protected\n   */\n  get _eventTargetProperty() {\n    return 'value';\n  }\n\n  /**\n   Whether the change event needs to be triggered when {@link BaseFormField#_onInputChange} is called.\n   @type {Boolean}\n   @default true\n   @protected\n   */\n  get _triggerChangeEvent() {\n    return true;\n  }\n\n  /**\n   Gets the element that should get the label. In case none of the valid labelelable items are found, the component\n   will be labelled instead.\n   @protected\n   @returns {HTMLElement} the labellable element.\n   */\n  _getLabellableElement() {\n    // Use predefined element or query it\n    const element = this._labellableElement || this.querySelector(LABELLABLE_ELEMENTS_SELECTOR);\n\n    // Use the found element or the container\n    return element || this;\n  }\n\n  /**\n   Gets the internal input that the BaseFormField would watch for change. By default, it searches if the\n   <code>_getLabellableElement()</code> is an input. Components can override this function to be able to provide a\n   different implementation. In case the value is <code>null</code>, the change event will be handled no matter\n   the input that produced it.\n   @protected\n   @return {HTMLElement} the input to watch for changes.\n   */\n  _getTargetChangeInput() {\n    // we use this._targetChangeInput as an internal cache to avoid querying the DOM again every time\n    return this._targetChangeInput ||\n      // assignment returns the value\n      (this._targetChangeInput = this._getLabellableElement().matches(TARGET_INPUT_SELECTOR) ?\n        this._getLabellableElement() : null);\n  }\n\n  /**\n   Function called whenever the target component triggers a change event. <code>_getTargetChangeInput</code> is used\n   internally to determine if the input belongs to the component. If the component decides to override this function,\n   the default from the base will not be called.\n   @protected\n   */\n  _onInputChange(event) {\n    // stops the current event\n    event.stopPropagation();\n\n    /** @ignore */\n    this[this._componentTargetProperty] = event.target[this._eventTargetProperty];\n\n    // Explicitly re-emit the change event after the property has been set\n    if (this._triggerChangeEvent) {\n      this.trigger('change');\n    }\n  }\n\n  /**\n   Resets the formField when a reset is triggered on the parent form.\n   @protected\n   */\n  _onFormReset(event) {\n    if (event.target.contains(this)) {\n      this.reset();\n    }\n  }\n\n  /**\n   We capture every input change and validate that it belongs to our target input. If this is the case,\n   <code>_onInputChange</code> will be called with the same event.\n   @protected\n   */\n  _onTargetInputChange(event) {\n    const targetInput = this._getTargetChangeInput();\n    // if the targetInput is null we still call _onInputChange to be backwards compatible\n    if (targetInput === event.target || targetInput === null) {\n      // we call _onInputChange since the target matches\n      this._onInputChange(event);\n    }\n  }\n\n  /**\n   A utility method for adding the appropriate <code>for</code> attribute to any <code>label</code> elements\n   referenced by the <code>labelledBy</code> property value.\n   @param {String} labelledBy\n   The value of the <code>labelledBy<code> property providing a space-delimited list of the <code>id</code>\n   attributes for elements that label the formField.\n   @param {String} elementId\n   The <code>id</code> of the formField or one of its descendants that should be labelled by\n   <code>label</code> elements referenced by the <code>labelledBy</code> property value.\n   @param {Boolean} remove\n   Whether the existing <code>for</code> attributes should be removed.\n   @protected\n   */\n  _updateForAttributes(labelledBy, elementId, remove) {\n    // labelledby contains whitespace sparated items, so we need to separate each individual id\n    const labelIds = labelledBy.split(/\\s+/);\n    // we update the 'for' attribute for every id.\n    labelIds.forEach((currentValue) => {\n      const labelElement = document.getElementById(currentValue);\n      if (labelElement && labelElement.tagName === 'LABEL') {\n        const forAttribute = labelElement.getAttribute('for');\n\n        if (remove) {\n          // we just remove it when it is our target\n          if (forAttribute === elementId) {\n            labelElement.removeAttribute('for');\n          }\n        } else {\n          // if we do not have to remove, it does not matter the current value of the label, we can set it in every\n          // case\n          labelElement.setAttribute('for', elementId);\n        }\n      }\n    });\n  }\n\n  /**\n   Clears the <code>value</code> of formField to the default value.\n   */\n  clear() {\n    /** @ignore */\n    this.value = '';\n  }\n\n  /**\n   Resets the <code>value</code> to the initial value.\n   */\n  reset() {\n    // since the 'value' property is not reflected, form components use it to restore the initial value. When a\n    // component has support for values, this method needs to be overwritten\n    /** @ignore */\n    this.value = transform.string(this.getAttribute('value'));\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      describedby: 'describedBy',\n      labelledby: 'labelledBy',\n      readonly: 'readOnly',\n    });\n  }\n\n  // We don't want to watch existing attributes for components that extend native HTML elements\n  static get _nativeObservedAttributes() {\n    return super.observedAttributes.concat([\n      'describedby',\n      'labelled',\n      'labelledby',\n      'invalid'\n    ]);\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'describedby',\n      'labelled',\n      'labelledby',\n      'invalid',\n      'readonly',\n      'name',\n      'value',\n      'disabled',\n      'required'\n    ]);\n  }\n};\n\nexport default BaseFormField;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 159,
    "kind": "variable",
    "name": "LABELLABLE_ELEMENTS_SELECTOR",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~LABELLABLE_ELEMENTS_SELECTOR",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 160,
    "kind": "variable",
    "name": "TARGET_INPUT_SELECTOR",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~TARGET_INPUT_SELECTOR",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 51,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 161,
    "kind": "class",
    "name": "BaseFormField",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for Form Field components. If not extending a {@link HTMLInputElement}, following\nproperties should be implemented at least :\n- <code>disabled</code>. Whether this field is disabled or not.\n- <code>invalid</code>. Whether the current value of this field is invalid or not.\n- <code>name</code>. Name used to submit the data in a form.\n- <code>readOnly</code>. Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n- <code>required</code>. Whether this field is required or not.\n- <code>value</code>. This field's current value.",
    "lineNumber": 64,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseFormField"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for Form Field components. If not extending a {@link HTMLInputElement}, following\nproperties should be implemented at least :\n- <code>disabled</code>. Whether this field is disabled or not.\n- <code>invalid</code>. Whether the current value of this field is invalid or not.\n- <code>name</code>. Name used to submit the data in a form.\n- <code>readOnly</code>. Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n- <code>required</code>. Whether this field is required or not.\n- <code>value</code>. This field's current value."
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 162,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 66,
    "ignore": true
  },
  {
    "__docId__": 163,
    "kind": "member",
    "name": "_events",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_events",
    "access": "private",
    "description": null,
    "lineNumber": 69,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"capture:change input\": string, \"global:reset\": string}"
      ]
    }
  },
  {
    "__docId__": 164,
    "kind": "member",
    "name": "invalid",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#invalid",
    "access": "public",
    "description": "Whether the current value of this field is invalid or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 143,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "invalid"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 166,
    "kind": "member",
    "name": "_invalid",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_invalid",
    "access": "private",
    "description": null,
    "lineNumber": 153,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 167,
    "kind": "member",
    "name": "describedBy",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#describedBy",
    "access": "public",
    "description": "Reflects the <code>aria-describedby</code> attribute to the labellable element e.g. inner input.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 166,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "describedby"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 169,
    "kind": "member",
    "name": "labelled",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#labelled",
    "access": "public",
    "description": "Reflects the <code>aria-label</code> attribute to the labellable element e.g. inner input.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 183,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "labelled"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 171,
    "kind": "member",
    "name": "labelledBy",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#labelledBy",
    "access": "public",
    "description": "Reference to a space delimited set of ids for the HTML elements that provide a label for the formField.\nImplementers should override this method to ensure that the appropriate descendant elements are labelled using the\n<code>aria-labelledby</code> attribute. This will ensure that the component is properly identified for\naccessibility purposes. It reflects the <code>aria-labelledby</code> attribute to the DOM.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 202,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "labelledby"
      }
    ],
    "type": {
      "nullable": true,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 173,
    "kind": "member",
    "name": "_componentTargetProperty",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_componentTargetProperty",
    "access": "protected",
    "description": "Target property inside the component that will be updated when a change event is triggered.\n<ul><li><code>\"value\"</code> by default.</li></ul>",
    "lineNumber": 239,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"value\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly",
    "ignore": true
  },
  {
    "__docId__": 174,
    "kind": "member",
    "name": "_eventTargetProperty",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_eventTargetProperty",
    "access": "protected",
    "description": "Target property that will be taken from <code>event.target</code> and set into\n{@link BaseFormField#_componentTargetProperty} when a change event is triggered.\n<ul><li><code>\"value\"</code> by default.</li></ul>",
    "lineNumber": 250,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"value\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly",
    "ignore": true
  },
  {
    "__docId__": 175,
    "kind": "member",
    "name": "_triggerChangeEvent",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_triggerChangeEvent",
    "access": "protected",
    "description": "Whether the change event needs to be triggered when {@link BaseFormField#_onInputChange} is called.\n<ul><li><code>true</code> by default.</li></ul>",
    "lineNumber": 260,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "true"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly",
    "ignore": true
  },
  {
    "__docId__": 176,
    "kind": "method",
    "name": "_getLabellableElement",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_getLabellableElement",
    "access": "protected",
    "description": "Gets the element that should get the label. In case none of the valid labelelable items are found, the component\nwill be labelled instead.",
    "lineNumber": 270,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement} the labellable element."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the labellable element."
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 177,
    "kind": "method",
    "name": "_getTargetChangeInput",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_getTargetChangeInput",
    "access": "protected",
    "description": "Gets the internal input that the BaseFormField would watch for change. By default, it searches if the\n<code>_getLabellableElement()</code> is an input. Components can override this function to be able to provide a\ndifferent implementation. In case the value is <code>null</code>, the change event will be handled no matter\nthe input that produced it.",
    "lineNumber": 286,
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the input to watch for changes."
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 178,
    "kind": "method",
    "name": "_onInputChange",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_onInputChange",
    "access": "protected",
    "description": "Function called whenever the target component triggers a change event. <code>_getTargetChangeInput</code> is used\ninternally to determine if the input belongs to the component. If the component decides to override this function,\nthe default from the base will not be called.",
    "lineNumber": 300,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 179,
    "kind": "member",
    "name": "[._componentTargetProperty]",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#[._componentTargetProperty]",
    "access": "public",
    "description": null,
    "lineNumber": 305,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 180,
    "kind": "method",
    "name": "_onFormReset",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_onFormReset",
    "access": "protected",
    "description": "Resets the formField when a reset is triggered on the parent form.",
    "lineNumber": 317,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 181,
    "kind": "method",
    "name": "_onTargetInputChange",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_onTargetInputChange",
    "access": "protected",
    "description": "We capture every input change and validate that it belongs to our target input. If this is the case,\n<code>_onInputChange</code> will be called with the same event.",
    "lineNumber": 328,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 182,
    "kind": "method",
    "name": "_updateForAttributes",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#_updateForAttributes",
    "access": "protected",
    "description": "A utility method for adding the appropriate <code>for</code> attribute to any <code>label</code> elements\nreferenced by the <code>labelledBy</code> property value.",
    "lineNumber": 350,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "labelledBy",
        "description": "The value of the <code>labelledBy<code> property providing a space-delimited list of the <code>id</code>\nattributes for elements that label the formField."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "elementId",
        "description": "The <code>id</code> of the formField or one of its descendants that should be labelled by\n<code>label</code> elements referenced by the <code>labelledBy</code> property value."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "remove",
        "description": "Whether the existing <code>for</code> attributes should be removed."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 183,
    "kind": "method",
    "name": "clear",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#clear",
    "access": "public",
    "description": "Clears the <code>value</code> of formField to the default value.",
    "lineNumber": 376,
    "params": [],
    "return": null
  },
  {
    "__docId__": 184,
    "kind": "member",
    "name": "value",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#value",
    "access": "public",
    "description": null,
    "lineNumber": 378,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 185,
    "kind": "method",
    "name": "reset",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField#reset",
    "access": "public",
    "description": "Resets the <code>value</code> to the initial value.",
    "lineNumber": 384,
    "params": [],
    "return": null
  },
  {
    "__docId__": 187,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 391,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 188,
    "kind": "member",
    "name": "_nativeObservedAttributes",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField._nativeObservedAttributes",
    "access": "private",
    "description": null,
    "lineNumber": 400,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 189,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-formfield/src/scripts/BaseFormField.js~BaseFormField.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 410,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 190,
    "kind": "file",
    "name": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @base BaseLabellable\n @classdesc Accessibility helper for components with label and icon properties\n */\nclass BaseLabellable extends superClass {\n  _observeLabel() {\n    this._observableLabel = this._observableLabel || this._elements.label || this._elements.content;\n\n    // Listen for mutations\n    this._observer = new MutationObserver(this._toggleIconAriaHidden.bind(this));\n\n    // Watch for changes to the content element\n    this._observer.observe(this._observableLabel, {\n      // Catch changes to childList\n      childList: true,\n      // Catch changes to textContent\n      characterData: true,\n      // Monitor any child node\n      subtree: true\n    });\n  }\n\n  // Hides the icon from screen readers to avoid duplicated labels\n  _toggleIconAriaHidden() {\n    this._renderedLabel = this._renderedLabel || this.label || this.content;\n\n    // toggle aria-hidden if tab is labelled\n    if (this._elements.icon) {\n      const isLabelled = (this._renderedLabel && this._renderedLabel.textContent.trim().length) ||\n        this.getAttribute('aria-label') !== null ||\n        this.getAttribute('aria-labelledby') !== null;\n\n      this._elements.icon[isLabelled ? 'setAttribute' : 'removeAttribute']('aria-hidden', 'true');\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['aria-label', 'aria-labelledby']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === 'aria-label' || name === 'aria-labelledby') {\n      this._toggleIconAriaHidden();\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n};\n\nexport default BaseLabellable;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 191,
    "kind": "class",
    "name": "BaseLabellable",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "Accessibility helper for components with label and icon properties",
    "lineNumber": 17,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseLabellable"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Accessibility helper for components with label and icon properties"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 192,
    "kind": "method",
    "name": "_observeLabel",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#_observeLabel",
    "access": "private",
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 193,
    "kind": "member",
    "name": "_observableLabel",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#_observableLabel",
    "access": "private",
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 194,
    "kind": "member",
    "name": "_observer",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#_observer",
    "access": "private",
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 195,
    "kind": "method",
    "name": "_toggleIconAriaHidden",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#_toggleIconAriaHidden",
    "access": "private",
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 196,
    "kind": "member",
    "name": "_renderedLabel",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#_renderedLabel",
    "access": "private",
    "description": null,
    "lineNumber": 37,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 197,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 50,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 198,
    "kind": "method",
    "name": "attributeChangedCallback",
    "memberof": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-labellable/src/scripts/BaseLabellable.js~BaseLabellable#attributeChangedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 55,
    "ignore": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      },
      {
        "name": "oldValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 199,
    "kind": "file",
    "name": "coral-spectrum/coral-base-list/src/scripts/BaseList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Menu';\n\n/**\n Enumeration for {@link BaseList} interactions.\n\n @typedef {Object} ListInteractionEnum\n\n @property {String} ON\n Keyboard interaction is enabled.\n @property {String} OFF\n Keyboard interaction is disabled.\n */\nconst interaction = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n @base BaseList\n @classdesc The base element for List components\n */\nclass BaseList extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._events = {\n      'mouseenter': '_onMouseEnter',\n      // Keyboard interaction\n      'key:down [coral-list-item]': '_focusNextItem',\n      'key:right [coral-list-item]': '_focusNextItem',\n      'key:left [coral-list-item]': '_focusPreviousItem',\n      'key:up [coral-list-item]': '_focusPreviousItem',\n      'key:pageup [coral-list-item]': '_focusPreviousItem',\n      'key:pagedown [coral-list-item]': '_focusNextItem',\n      'key:home [coral-list-item]': '_focusFirstItem',\n      'key:end [coral-list-item]': '_focusLastItem'\n    };\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        itemTagName: this._itemTagName,\n        itemBaseTagName: this._itemBaseTagName,\n        itemSelector: 'coral-list-item, button[is=\"coral-buttonlist-item\"], a[is=\"coral-anchorlist-item\"]',\n        host: this\n      });\n    }\n\n    return this._items;\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-list-item';\n  }\n\n  /**\n   Whether interaction with the component is enabled. See {@link ListInteractionEnum}.\n\n   @type {String}\n   @default ListInteractionEnum.ON\n   @htmlattribute interaction\n   @htmlattributereflected\n   */\n  get interaction() {\n    return this._interaction || interaction.ON;\n  }\n\n  set interaction(value) {\n    value = transform.string(value).toLowerCase();\n    this._interaction = validate.enumeration(interaction)(value) && value || interaction.ON;\n    \n    this._reflectAttribute('interaction', this._interaction);\n  }\n\n  /**\n   Returns true if the event is at the matched target.\n\n   @private\n   */\n  _eventIsAtTarget(event) {\n    const target = event.target;\n    const listItem = event.matchedTarget;\n\n    const isAtTarget = target === listItem;\n\n    if (isAtTarget) {\n      // Don't let arrow keys etc scroll the page\n      event.preventDefault();\n    }\n\n    return isAtTarget;\n  }\n\n  _onMouseEnter() {\n    if (this.contains(document.activeElement)) {\n      document.activeElement.blur();\n    }\n  }\n\n  /** @private */\n  _focusFirstItem(event) {\n    if (this.interaction === interaction.OFF || !this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const items = this._getSelectableItems();\n    items.forEach((item, i) => this.setIndex(item, i === 0 ? 0 : -1));\n    items[0].focus();\n  }\n\n  /** @private */\n  _focusLastItem(event) {\n    if (this.interaction === interaction.OFF || !this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const items = this._getSelectableItems();\n    items.forEach((item, i) =>\n      this.setIndex(item, i === items.length - 1 ? 0 : -1)\n    );\n    items[items.length - 1].focus();\n  }\n\n  /** @private */\n  _focusNextItem(event) {\n    if (this.interaction === interaction.OFF || !this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const target = event.matchedTarget;\n    const items = this._getSelectableItems();\n    const index = items.indexOf(target);\n\n    if (index === -1) {\n      // Invalid state\n      return;\n    }\n\n    if (index < items.length - 1) {\n      this.setIndex(target, -1);\n      this.setIndex(items[index + 1], 0);\n      items[index + 1].focus();\n    } else {\n      items.forEach((item, i) => this.setIndex(item, i === 0 ? 0 : -1));\n      items[0].focus();\n    }\n  }\n\n  /** @private */\n  _focusPreviousItem(event) {\n    if (this.interaction === interaction.OFF || !this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const target = event.matchedTarget;\n    const items = this._getSelectableItems();\n    const index = items.indexOf(target);\n\n    if (index === -1) {\n      // Invalid state\n      return;\n    }\n\n    if (index > 0) {\n      this.setIndex(target, -1);\n      this.setIndex(items[index - 1], 0);\n      items[index - 1].focus();\n    } else {\n      items.forEach((item, i) =>\n        this.setIndex(item, i === items[length - 1] ? 0 : -1)\n      );\n      items[items.length - 1].focus();\n    }\n  }\n\n  /** @private */\n  _getSelectableItems() {\n    // Also checks if item is visible\n    return this.items._getSelectableItems().filter(item => !item.hasAttribute('hidden') && item.offsetParent);\n  }\n\n  /** @ignore */\n  focus() {\n    if (!this.contains(document.activeElement)) {\n      const items = this._getSelectableItems();\n      if (items.length > 0) {\n        items[0].focus();\n      }\n    }\n  }\n\n  setIndex(element, value) {\n    if (element instanceof HTMLElement) {\n      element.setAttribute(\"tabindex\", value);\n      const el = element.querySelectorAll(\"button:not([hidden])\");\n      const buttonArray = Array.from(el).filter(item => item.offsetParent);\n      buttonArray.forEach(item => {\n        item.setAttribute(\"tabindex\", value);\n      });\n    }\n  }\n\n  /**\n   Returns {@link BaseList} interaction options.\n\n   @return {ListInteractionEnum}\n   */\n  static get interaction() {\n    return interaction;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['interaction']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._interaction) {\n      this.interaction = interaction.ON;\n    }\n  }\n};\n\nexport default BaseList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-list/src/scripts/BaseList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 200,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 201,
    "kind": "typedef",
    "name": "ListInteractionEnum",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~ListInteractionEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseList} interactions.",
    "lineNumber": 28,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Keyboard interaction is enabled."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Keyboard interaction is disabled."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ListInteractionEnum"
    }
  },
  {
    "__docId__": 202,
    "kind": "class",
    "name": "BaseList",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for List components",
    "lineNumber": 37,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for List components"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 203,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 39,
    "ignore": true
  },
  {
    "__docId__": 204,
    "kind": "member",
    "name": "_events",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_events",
    "access": "private",
    "description": null,
    "lineNumber": 42,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"mouseenter\": string, \"key:down [coral-list-item]\": string, \"key:right [coral-list-item]\": string, \"key:left [coral-list-item]\": string, \"key:up [coral-list-item]\": string, \"key:pageup [coral-list-item]\": string, \"key:pagedown [coral-list-item]\": string, \"key:home [coral-list-item]\": string, \"key:end [coral-list-item]\": string}"
      ]
    }
  },
  {
    "__docId__": 205,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#items",
    "access": "public",
    "description": "The Collection Interface that allows interacting with the items that the component contains.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 62,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 206,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_items",
    "access": "private",
    "description": null,
    "lineNumber": 65,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 207,
    "kind": "member",
    "name": "_itemTagName",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_itemTagName",
    "access": "private",
    "description": null,
    "lineNumber": 77,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 208,
    "kind": "member",
    "name": "interaction",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#interaction",
    "access": "public",
    "description": "Whether interaction with the component is enabled. See {@link ListInteractionEnum}.\n<ul><li><code>ListInteractionEnum.ON</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 90,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ListInteractionEnum.ON"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "interaction"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 210,
    "kind": "member",
    "name": "_interaction",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_interaction",
    "access": "private",
    "description": null,
    "lineNumber": 96,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 211,
    "kind": "method",
    "name": "_eventIsAtTarget",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_eventIsAtTarget",
    "access": "private",
    "description": "Returns true if the event is at the matched target.",
    "lineNumber": 106,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 212,
    "kind": "method",
    "name": "_onMouseEnter",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_onMouseEnter",
    "access": "private",
    "description": null,
    "lineNumber": 120,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 213,
    "kind": "method",
    "name": "_focusFirstItem",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_focusFirstItem",
    "access": "private",
    "description": null,
    "lineNumber": 127,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 214,
    "kind": "method",
    "name": "_focusLastItem",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_focusLastItem",
    "access": "private",
    "description": null,
    "lineNumber": 138,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 215,
    "kind": "method",
    "name": "_focusNextItem",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_focusNextItem",
    "access": "private",
    "description": null,
    "lineNumber": 151,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 216,
    "kind": "method",
    "name": "_focusPreviousItem",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_focusPreviousItem",
    "access": "private",
    "description": null,
    "lineNumber": 176,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 217,
    "kind": "method",
    "name": "_getSelectableItems",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#_getSelectableItems",
    "access": "private",
    "description": null,
    "lineNumber": 203,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 218,
    "kind": "method",
    "name": "focus",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#focus",
    "access": "public",
    "description": null,
    "lineNumber": 209,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 219,
    "kind": "method",
    "name": "setIndex",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#setIndex",
    "access": "public",
    "description": null,
    "lineNumber": 218,
    "undocument": true,
    "params": [
      {
        "name": "element",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 220,
    "kind": "member",
    "name": "interaction",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList.interaction",
    "access": "public",
    "description": "Returns {@link BaseList} interaction options.",
    "lineNumber": 234,
    "return": {
      "nullable": null,
      "types": [
        "ListInteractionEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 221,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 239,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 222,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseList.js~BaseList#render",
    "access": "public",
    "description": null,
    "lineNumber": 244,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 224,
    "kind": "file",
    "name": "coral-spectrum/coral-base-list/src/scripts/BaseListItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseLabellable} from '../../../coral-base-labellable';\nimport {Icon} from '../../../coral-component-icon';\nimport {transform, validate} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Menu-item';\n\n/**\n @base BaseListItem\n @classdesc The base element for List Item components\n */\nconst BaseListItem = (superClass) => class extends BaseLabellable(superClass) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      // Fetch or create the content zone element\n      content: this.querySelector('coral-list-item-content') || document.createElement('coral-list-item-content')\n    };\n\n    super._observeLabel();\n  }\n\n  /**\n   The content of the help item.\n\n   @type {ListItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-list-item-content',\n      insert: (content) => {\n        content.classList.add(`${CLASSNAME}Label`);\n        this.appendChild(content);\n        super._toggleIconAriaHidden();\n      }\n    });\n  }\n\n  /**\n   Whether this item is disabled.\n\n   @default false\n   @type {Boolean}\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    value = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', value);\n    \n    if(validate.valueMustChange(this._disabled, value)) {\n      this._disabled = value;\n      this.classList.toggle('is-disabled', value);\n      this[value ? 'setAttribute' : 'removeAttribute']('aria-disabled', value);\n    }\n  }\n\n  /**\n   The icon to display. See {@link Icon}.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    const el = this._getIconElement();\n    return el.icon;\n  }\n\n  set icon(value) {\n    const el = this._getIconElement();\n    if (transform.string(value) === '') {\n      el.remove();\n    } else {\n      this.insertBefore(el, this.firstChild);\n    }\n\n    el.icon = value;\n\n    super._toggleIconAriaHidden();\n  }\n\n  _getIconElement() {\n    if (!this._elements.icon) {\n      this._elements.icon = this.querySelector('._coral-Menu-item-icon') || new Icon();\n      this._elements.icon.size = Icon.size.SMALL;\n      this._elements.icon.classList.add('_coral-Menu-item-icon');\n    }\n    return this._elements.icon;\n  }\n\n  get _contentZones() {\n    return {'coral-list-item-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['disabled', 'icon']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // The attribute that makes different types of list items co-exist\n    // This is also used for event delegation\n    this.setAttribute('coral-list-item', '');\n\n    // Fetch or create the content content zone element\n    const content = this._elements.content;\n\n    // This stops the content zone from being voracious\n    if (!content.parentNode) {\n      // move the contents of the item into the content zone\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Assign the content zones, moving them into place in the process\n    this.icon = this.icon;\n    this.content = content;\n  }\n};\n\nexport default BaseListItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-list/src/scripts/BaseListItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 225,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseListItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 226,
    "kind": "function",
    "name": "BaseListItem",
    "memberof": "coral-spectrum/coral-base-list/src/scripts/BaseListItem.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-list/src/scripts/BaseListItem.js~BaseListItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for List Item components",
    "lineNumber": 23,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseListItem"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for List Item components"
      }
    ],
    "params": [
      {
        "name": "superClass",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 227,
    "kind": "file",
    "name": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport base from '../templates/base';\nimport Vent from '@adobe/vent';\nimport {validate, transform, commons} from '../../../coral-utils';\nimport {trapFocus, returnFocus, focusOnShow, scrollOnFocus, FADETIME} from './enums';\n\nconst CLASSNAME = '_coral-BaseOverlay';\n\n// Includes overlay itself\nconst COMPONENTS_WITH_OVERLAY = `\n  coral-actionbar,\n  coral-autocomplete,\n  coral-colorinput,\n  coral-cyclebutton,\n  coral-datepicker,\n  coral-dialog,\n  coral-overlay,\n  coral-popover,\n  coral-quickactions,\n  coral-select,\n  coral-tooltip\n`;\n\n// The tab capture element that lives at the top of the body\nlet topTabCaptureEl;\nlet bottomTabCaptureEl;\n\n// A reference to the backdrop element\nlet backdropEl;\n\n// The starting zIndex for overlays\nconst startZIndex = 10000;\n\n// Tab keycode\nconst TAB_KEY = 9;\n\n// A stack interface for overlays\nconst overlayStack = [];\nlet OverlayManager = {};\n\n/**\n Return focus option\n */\nfunction preventScroll(instance) {\n  return {preventScroll: instance.scrollOnFocus === scrollOnFocus.OFF};\n}\n\n/**\n Cancel the backdrop hide mid-animation.\n */\nlet fadeTimeout;\n\nfunction cancelBackdropHide() {\n  window.clearTimeout(fadeTimeout);\n}\n\n/**\n Set aria-hidden on every immediate child except the one passed, which should not be hidden.\n */\nfunction hideEverythingBut(instance) {\n  // ARIA: Hide all the things\n  const children = document.body.children;\n  for (let i = 0 ; i < children.length ; i++) {\n    const child = children[i];\n\n    // If it's not a parent of or not the instance itself, it needs to be hidden\n    if (child !== instance && child.contains && !child.contains(instance)) {\n      const currentAriaHidden = child.getAttribute('aria-hidden');\n      if (currentAriaHidden) {\n        // Store the previous value of aria-hidden if present\n        // Don't blow away the previously stored value\n        child._previousAriaHidden = child._previousAriaHidden || currentAriaHidden;\n        if (currentAriaHidden === 'true') {\n          // It's already true, don't bother setting\n          continue;\n        }\n      } else {\n        // Nothing is hidden by default, store that\n        child._previousAriaHidden = 'false';\n      }\n\n      // Hide it\n      child.setAttribute('aria-hidden', 'true');\n    }\n  }\n\n  // Always show ourselves\n  instance.setAttribute('aria-hidden', 'false');\n}\n\n/**\n Actually reposition the backdrop to be under the topmost overlay.\n */\nfunction doRepositionBackdrop() {\n  // Position under the topmost overlay\n  const top = OverlayManager.top();\n\n  if (top) {\n    // The backdrop, if shown, should be positioned under the topmost overlay that does have a backdrop\n    for (let i = overlayStack.length - 1 ; i > -1 ; i--) {\n      if (overlayStack[i].backdrop) {\n        backdropEl.style.zIndex = overlayStack[i].zIndex - 1;\n        break;\n      }\n    }\n\n    // ARIA: Set hidden properly\n    hideEverythingBut(top.instance);\n  }\n}\n\nOverlayManager = {\n  pop(instance) {\n    // Get overlay index\n    const index = this.indexOf(instance);\n\n    if (index === -1) {\n      return null;\n    }\n\n    // Get the overlay\n    const overlay = overlayStack[index];\n\n    // Remove from the stack\n    overlayStack.splice(index, 1);\n\n    // Return the passed overlay or the found overlay\n    return overlay;\n  },\n\n  push(instance) {\n    // Pop overlay\n    const overlay = this.pop(instance) || {instance};\n\n    // Get the new highest zIndex\n    const zIndex = this.getHighestZIndex() + 10;\n\n    // Store the zIndex\n    overlay.zIndex = zIndex;\n    instance.style.zIndex = zIndex;\n\n    // Push it\n    overlayStack.push(overlay);\n\n    if (overlay.backdrop) {\n      // If the backdrop is shown, we'll need to reposition it\n      // Generally, a component will not call _pushOverlay unnecessarily\n      // However, attachedCallback is asynchronous in polyfilld environments,\n      // so _pushOverlay will be called when shown and when attached\n      doRepositionBackdrop();\n    }\n\n    return overlay;\n  },\n\n  indexOf(instance) {\n    // Loop over stack\n    // Find overlay\n    // Return index\n    for (let i = 0 ; i < overlayStack.length ; i++) {\n      if (overlayStack[i].instance === instance) {\n        return i;\n      }\n    }\n    return -1;\n  },\n\n  get(instance) {\n    // Get overlay index\n    const index = this.indexOf(instance);\n\n    // Return overlay\n    return index === -1 ? null : overlayStack[index];\n  },\n\n  top() {\n    const length = overlayStack.length;\n    return length === 0 ? null : overlayStack[length - 1];\n  },\n\n  getHighestZIndex() {\n    const overlay = this.top();\n    return overlay ? overlay.zIndex : startZIndex;\n  },\n\n  some(...args) {\n    return overlayStack.some(...args);\n  },\n\n  forEach(...args) {\n    return overlayStack.forEach(...args);\n  }\n};\n\n/**\n Create the global tab capture element.\n */\nfunction createDocumentTabCaptureEls() {\n  if (!topTabCaptureEl) {\n    topTabCaptureEl = document.createElement('div');\n    topTabCaptureEl.setAttribute('coral-tabcapture', '');\n    topTabCaptureEl.setAttribute('role', 'presentation');\n    topTabCaptureEl.tabIndex = 0;\n    document.body.insertBefore(topTabCaptureEl, document.body.firstChild);\n    topTabCaptureEl.addEventListener('focus', () => {\n      const top = OverlayManager.top();\n      if (top && top.instance.trapFocus === trapFocus.ON) {\n        // Focus on the first tabbable element of the top overlay\n        Array.prototype.some.call(top.instance.querySelectorAll(commons.TABBABLE_ELEMENT_SELECTOR), (item) => {\n          if (item.offsetParent !== null && !item.hasAttribute('coral-tabcapture')) {\n            item.focus(preventScroll(top));\n            return true;\n          }\n\n          return false;\n        });\n      }\n    });\n\n    bottomTabCaptureEl = document.createElement('div');\n    bottomTabCaptureEl.setAttribute('coral-tabcapture', '');\n    bottomTabCaptureEl.setAttribute('role', 'presentation');\n    bottomTabCaptureEl.tabIndex = 0;\n    document.body.appendChild(bottomTabCaptureEl);\n    bottomTabCaptureEl.addEventListener('focus', () => {\n      const top = OverlayManager.top();\n      if (top && top.instance.trapFocus === trapFocus.ON) {\n        const tabbableElement = Array.prototype.filter.call(top.instance.querySelectorAll(commons.TABBABLE_ELEMENT_SELECTOR), (item) => item.offsetParent !== null && !item.hasAttribute('coral-tabcapture')).pop();\n\n        // Focus on the last tabbable element of the top overlay\n        if (tabbableElement) {\n          tabbableElement.focus(preventScroll(top));\n        }\n      }\n    });\n  } else {\n    if (document.body.firstElementChild !== topTabCaptureEl) {\n      // Make sure we stay at the very top\n      document.body.insertBefore(topTabCaptureEl, document.body.firstChild);\n    }\n\n    if (document.body.lastElementChild !== bottomTabCaptureEl) {\n      // Make sure we stay at the very bottom\n      document.body.appendChild(bottomTabCaptureEl);\n    }\n  }\n\n  // Make sure the tab capture elemenst are shown\n  topTabCaptureEl.style.display = 'inline';\n  bottomTabCaptureEl.style.display = 'inline';\n}\n\n/**\n Called after all overlays are hidden and we shouldn't capture the first tab into the page.\n */\nfunction hideDocumentTabCaptureEls() {\n  if (topTabCaptureEl) {\n    topTabCaptureEl.style.display = 'none';\n    bottomTabCaptureEl.style.display = 'none';\n  }\n}\n\n/**\n Show or restore the aria-hidden state of every child of body.\n */\nfunction showEverything() {\n  // ARIA: Show all the things\n  const children = document.body.children;\n  for (let i = 0 ; i < children.length ; i++) {\n    const child = children[i];\n    // Restore the previous aria-hidden value\n    child.setAttribute('aria-hidden', child._previousAriaHidden || 'false');\n  }\n}\n\n/**\n Actually hide the backdrop.\n */\nfunction doBackdropHide() {\n  document.body.classList.remove('u-coral-noscroll');\n\n  // Start animation\n  window.requestAnimationFrame(() => {\n    backdropEl.classList.remove('is-open');\n\n    cancelBackdropHide();\n    fadeTimeout = window.setTimeout(() => {\n      backdropEl.style.display = 'none';\n    }, FADETIME);\n  });\n\n  // Set flag for testing\n  backdropEl._isOpen = false;\n\n  // Wait for animation to complete\n  showEverything();\n}\n\n/**\n Hide the backdrop if no overlays are using it.\n */\nfunction hideOrRepositionBackdrop() {\n  if (!backdropEl || !backdropEl._isOpen) {\n    // Do nothing if the backdrop isn't shown\n    return;\n  }\n\n  // Loop over all overlays\n  const keepBackdrop = OverlayManager.some((overlay) => {\n    // Check for backdrop usage\n    return !!overlay.backdrop;\n  });\n\n  if (!keepBackdrop) {\n    // Hide the backdrop\n    doBackdropHide();\n  } else {\n    // Reposition the backdrop\n    doRepositionBackdrop();\n  }\n\n  // Hide/create the document-level tab capture element as necessary\n  // This only applies to modal overlays (those that have backdrops)\n  const top = OverlayManager.top();\n  if (!top || !(top.instance.trapFocus === trapFocus.ON && top.instance._requestedBackdrop)) {\n    hideDocumentTabCaptureEls();\n  } else if (top && top.instance.trapFocus === trapFocus.ON && top.instance._requestedBackdrop) {\n    createDocumentTabCaptureEls();\n  }\n}\n\n/**\n Handles clicks to the backdrop, calling backdropClickedCallback for every overlay\n */\nfunction handleBackdropClick(event) {\n  OverlayManager.forEach((overlay) => {\n    if (typeof overlay.instance.backdropClickedCallback === 'function') {\n      overlay.instance.backdropClickedCallback(event);\n    }\n  });\n}\n\n/**\n Actually show the backdrop.\n */\nfunction doBackdropShow(zIndex, instance) {\n  document.body.classList.add('u-coral-noscroll');\n\n  if (!backdropEl) {\n    backdropEl = document.createElement('div');\n    backdropEl.className = '_coral-Underlay';\n    document.body.appendChild(backdropEl);\n\n    backdropEl.addEventListener('click', handleBackdropClick);\n  }\n\n  // Show just under the provided zIndex\n  // Since we always increment by 10, this will never collide\n  backdropEl.style.zIndex = zIndex - 1;\n\n  // Set flag for testing\n  backdropEl._isOpen = true;\n\n  // Start animation\n  backdropEl.style.display = '';\n  window.requestAnimationFrame(() => {\n    // Add the class on the next animation frame so backdrop has time to exist\n    // Otherwise, the animation for opacity will not work.\n    backdropEl.classList.add('is-open');\n\n    cancelBackdropHide();\n  });\n\n  hideEverythingBut(instance);\n}\n\n/**\n @base BaseOverlay\n @classdesc The base element for Overlay components\n */\nclass BaseOverlay extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    base.call(this._elements);\n  }\n\n  /**\n   Whether to trap tabs and keep them within the overlay. See {@link OverlayTrapFocusEnum}.\n\n   @type {String}\n   @default OverlayTrapFocusEnum.OFF\n   @htmlattribute trapfocus\n   */\n  get trapFocus() {\n    return this._trapFocus || trapFocus.OFF;\n  }\n\n  set trapFocus(value) {\n    value = transform.string(value).toLowerCase();\n    this._trapFocus = validate.enumeration(trapFocus)(value) && value || trapFocus.OFF;\n\n    if (this._trapFocus === trapFocus.ON) {\n      // Give ourselves tabIndex if we are not focusable\n      if (this.tabIndex < 0) {\n        /** @ignore */\n        this.tabIndex = 0;\n      }\n\n      // Insert elements\n      this.insertBefore(this._elements.topTabCapture, this.firstElementChild);\n      this.appendChild(this._elements.intermediateTabCapture);\n      this.appendChild(this._elements.bottomTabCapture);\n\n      // Add listeners\n      this._handleTabCaptureFocus = this._handleTabCaptureFocus.bind(this);\n      this._handleRootKeypress = this._handleRootKeypress.bind(this);\n      this._vent.on('keydown', this._handleRootKeypress);\n      this._vent.on('focus', '[coral-tabcapture]', this._handleTabCaptureFocus);\n\n    } else if (this._trapFocus === trapFocus.OFF) {\n      // Remove elements\n      this._elements.topTabCapture && this._elements.topTabCapture.remove();\n      this._elements.intermediateTabCapture && this._elements.intermediateTabCapture.remove();\n      this._elements.bottomTabCapture && this._elements.bottomTabCapture.remove();\n\n      // Remove listeners\n      this._vent.off('keydown', this._handleRootKeypress);\n      this._vent.off('focus', '[coral-tabcapture]', this._handleTabCaptureFocus);\n    }\n  }\n\n  /**\n   Whether to return focus to the previously focused element when closed. See {@link OverlayReturnFocusEnum}.\n\n   @type {String}\n   @default OverlayReturnFocusEnum.OFF\n   @htmlattribute returnfocus\n   */\n  get returnFocus() {\n    return this._returnFocus || returnFocus.OFF;\n  }\n\n  set returnFocus(value) {\n    value = transform.string(value).toLowerCase();\n    this._returnFocus = validate.enumeration(returnFocus)(value) && value || returnFocus.OFF;\n  }\n\n  /**\n   returns element that will receive focus when overlay is closed\n   @returns {HTMLElement}element passed via returnFocusTo()\n   */\n  get returnFocusToElement() {\n    return this._returnFocusToElement;\n  }\n\n  /**\n   returns element that will receive focus when overlay is hidden\n   @returns {HTMLElement} element cached\n   */\n  get elementToFocusWhenHidden() {\n    return this._elementToFocusWhenHidden;\n  }\n\n  /**\n   Whether the browser should scroll the document to bring the newly-focused element into view. See {@link OverlayScrollOnFocusEnum}.\n\n   @type {String}\n   @default OverlayScrollOnFocusEnum.ON\n   @htmlattribute scrollonfocus\n   */\n  get scrollOnFocus() {\n    return this._scrollOnFocus || scrollOnFocus.ON;\n  }\n\n  set scrollOnFocus(value) {\n    value = transform.string(value).toLowerCase();\n    this._scrollOnFocus = validate.enumeration(scrollOnFocus)(value) && value || scrollOnFocus.ON;\n  }\n\n  /**\n   Whether to focus the overlay, when opened or not. By default the overlay itself will get the focus. It also accepts\n   an instance of HTMLElement or a selector like ':first-child' or 'button:last-of-type'. If the selector returns\n   multiple elements, it will focus the first element inside the overlay that matches the selector.\n   See {@link OverlayFocusOnShowEnum}.\n\n   @type {HTMLElement|String}\n   @default OverlayFocusOnShowEnum.ON\n   @htmlattribute focusonshow\n   */\n  get focusOnShow() {\n    return this._focusOnShow || focusOnShow.ON;\n  }\n\n  set focusOnShow(value) {\n    if (typeof value === 'string' || value instanceof HTMLElement) {\n      this._focusOnShow = value;\n    }\n  }\n\n  /**\n   Whether this overlay is open or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute open\n   @htmlattributereflected\n   @emits {coral-overlay:open}\n   @emits {coral-overlay:close}\n   @emits {coral-overlay:beforeopen}\n   @emits {coral-overlay:beforeclose}\n   */\n  get open() {\n    return this._open || false;\n  }\n\n  set open(value) {\n    const silenced = this._silenced;\n\n    value = transform.booleanAttr(value);\n\n    // Used for global animations\n    this.trigger('coral-overlay:_animate');\n\n    const beforeEvent = this.trigger(value ? 'coral-overlay:beforeopen' : 'coral-overlay:beforeclose');\n\n    if (!beforeEvent.defaultPrevented) {\n      const open = this._open = value;\n      this._reflectAttribute('open', open);\n\n      // Remove aria-hidden attribute before we show.\n      // Otherwise, screen readers will not announce\n      // Doesn't matter when we set aria-hidden true (nothing being announced)\n      if (open) {\n        this.removeAttribute('aria-hidden');\n      } else {\n        this.setAttribute('aria-hidden', !open);\n      }\n\n      // Don't do anything if we're not in the DOM yet\n      // This prevents errors related to allocating a zIndex we don't need\n      if (this.parentNode) {\n        // Do this check afterwards as we may have been appended inside of _show()\n        if (open) {\n          // Set z-index\n          this._pushOverlay();\n\n          if (this.returnFocus === returnFocus.ON) {\n            this._elementToFocusWhenHidden =\n              // cached element\n              this._elementToFocusWhenHidden ||\n              // element passed via returnFocusTo()\n              this._returnFocusToElement ||\n              // element that had focus before opening the overlay\n              (document.activeElement === document.body ? null : document.activeElement);\n          }\n        } else {\n          // Release zIndex\n          this._popOverlay();\n        }\n      }\n\n      // Don't force reflow\n      window.requestAnimationFrame(() => {\n        // Keep it silenced\n        this._silenced = silenced;\n\n        if (open) {\n          if (this.trapFocus === trapFocus.ON) {\n            // Make sure tab capture elements are positioned correctly\n            if (\n              // Tab capture elements are no longer at the bottom\n              this._elements.topTabCapture !== this.firstElementChild ||\n              this._elements.bottomTabCapture !== this.lastElementChild ||\n              // Tab capture elements have been separated\n              this._elements.bottomTabCapture.previousElementSibling !== this._elements.intermediateTabCapture\n            ) {\n              this.insertBefore(this._elements.intermediateTabCapture, this.firstElementChild);\n              this.appendChild(this._elements.intermediateTabCapture);\n              this.appendChild(this._elements.bottomTabCapture);\n            }\n          }\n\n          // visibility should revert to whatever is specified in CSS, so that transition renders.\n          this.style.visibility = '';\n\n          // The default style should be display: none for overlays\n          // Show ourselves first for centering calculations etc\n          this.style.display = '';\n\n          // Do it in the next frame to make the animation happen\n          window.requestAnimationFrame(() => {\n            this.classList.add('is-open');\n          });\n\n          const openComplete = () => {\n            if (this.open) {\n              this._debounce(() => {\n                // handles the focus behavior based on accessibility recommendations\n                this._handleFocus();\n\n                this.trigger('coral-overlay:open');\n                this._silenced = false;\n              });\n            }\n          };\n\n          if (this._overlayAnimationTime) {\n            // Wait for animation to complete\n            commons.transitionEnd(this, openComplete);\n          } else {\n            // Execute immediately\n            openComplete();\n          }\n        } else {\n          // Fade out\n          this.classList.remove('is-open');\n\n          const closeComplete = () => {\n            if (!this.open) {\n\n              // When the CSS transition has finished, set visibility to browser default, `visibility: visible`,\n              // to ensure that the overlay will be included in accessibility name or description\n              // of an element that references it using `aria-labelledby` or `aria-describedby`.\n              this.style.visibility = 'visible';\n\n              // makes sure the focus is returned per accessibility recommendations\n              this._handleReturnFocus();\n\n              // Hide self\n              this.style.display = 'none';\n\n              this._debounce(() => {\n                // Inform child overlays that we're closing\n                this._closeChildOverlays();\n\n                this.trigger('coral-overlay:close');\n                this._silenced = false;\n              });\n            }\n          };\n\n          if (this._overlayAnimationTime) {\n            // Wait for animation to complete\n            commons.transitionEnd(this, closeComplete);\n          } else {\n            // Execute immediately\n            closeComplete();\n          }\n        }\n      });\n    }\n  }\n\n  _closeChildOverlays() {\n    const components = this.querySelectorAll(COMPONENTS_WITH_OVERLAY);\n\n    // Close all children overlays and components with overlays\n    for (let i = 0 ; i < components.length ; i++) {\n      const component = components[i];\n\n      // Overlay component\n      if (component.hasAttribute('open')) {\n        component.removeAttribute('open');\n      }\n      // Component that uses an overlay\n      else if (component._elements && component._elements.overlay && component._elements.overlay.hasAttribute('open')) {\n        component._elements.overlay.removeAttribute('open');\n      }\n    }\n  }\n\n  /** @private */\n  _debounce(f) {\n    // Used to avoid triggering open/close event continuously\n    window.clearTimeout(this._debounceId);\n    this._debounceId = window.setTimeout(() => {\n      f();\n    }, 10);\n  }\n\n  /**\n   Check if this overlay is the topmost.\n\n   @protected\n   */\n  _isTopOverlay() {\n    const top = OverlayManager.top();\n    return top && top.instance === this;\n  }\n\n  /**\n   Push the overlay to the top of the stack.\n\n   @protected\n   */\n  _pushOverlay() {\n    OverlayManager.push(this);\n  }\n\n  /**\n   Remove the overlay from the stack.\n\n   @protected\n   */\n  _popOverlay() {\n    OverlayManager.pop(this);\n\n    // Automatically hide the backdrop if required\n    hideOrRepositionBackdrop();\n  }\n\n  /**\n   Show the backdrop.\n\n   @protected\n   */\n  _showBackdrop() {\n    const overlay = OverlayManager.get(this);\n\n    // Overlay is not tracked unless the component is in the DOM\n    // Hence, we need to check\n    if (overlay) {\n      overlay.backdrop = true;\n      doBackdropShow(overlay.zIndex, this);\n    }\n\n    // Mark on the instance that the backdrop has been requested for this overlay\n    this._requestedBackdrop = true;\n\n    // Mark that the backdrop was requested when not attached to the DOM\n    // This allows us to know whether to push the overlay when the component is attached\n    if (!this.parentNode) {\n      this._showBackdropOnAttached = true;\n    }\n\n    if (this.trapFocus === trapFocus.ON) {\n      createDocumentTabCaptureEls();\n    }\n  }\n\n  /**\n   Show the backdrop.\n\n   @protected\n   */\n  _hideBackdrop() {\n    const overlay = OverlayManager.get(this);\n\n    if (overlay) {\n      overlay.backdrop = false;\n\n      // If that was the last overlay using the backdrop, hide it\n      hideOrRepositionBackdrop();\n    }\n\n    // Mark on the instance that the backdrop is no longer needed\n    this._requestedBackdrop = false;\n  }\n\n  /**\n   Handles keypresses on the root of the overlay and marshalls focus accordingly.\n\n   @protected\n   */\n  _handleRootKeypress(event) {\n    if (event.target === this && event.keyCode === TAB_KEY) {\n      // Skip the top tabcapture and focus on the first focusable element\n      this._focusOn('first');\n\n      // Stop the normal tab behavior\n      event.preventDefault();\n    }\n  }\n\n  /**\n   Handles focus events on tab capture elements.\n\n   @protected\n   */\n  _handleTabCaptureFocus(event) {\n    // Avoid moving around if we're trying to focus on coral-tabcapture\n    if (this._ignoreTabCapture) {\n      this._ignoreTabCapture = false;\n      return;\n    }\n\n    // Focus on the correct tabbable element\n    const target = event.target;\n    const which = target === this._elements.intermediateTabCapture ? 'first' : 'last';\n\n    this._focusOn(which);\n  }\n\n  /**\n   Handles the focus behavior. When \"on\" is specified it would try to find the first tababble descendent in the\n   content and if there are no valid candidates it will focus the element itself.\n\n   @protected\n   */\n  _handleFocus() {\n    // ON handles the focusing per accessibility recommendations\n    if (this.focusOnShow === focusOnShow.ON) {\n      this._focusOn('first');\n      if (this._elementToFocusWhenHidden) {\n        this._elementToFocusWhenHidden.setAttribute('aria-expanded', 'true');\n      }\n    } else if (this.focusOnShow instanceof HTMLElement) {\n      this.focusOnShow.focus(preventScroll(this));\n    } else if (typeof this.focusOnShow === 'string' && this.focusOnShow !== focusOnShow.OFF) {\n      // we need to add :not([coral-tabcapture]) to avoid selecting the tab captures\n      const selectedElement = this.querySelector(`${this.focusOnShow}:not([coral-tabcapture])`);\n\n      if (selectedElement) {\n        selectedElement.focus(preventScroll(this));\n      }\n      // in case the selector does not match, it should fallback to the default behavior\n      else {\n        this._focusOn('first');\n      }\n    }\n  }\n\n  /**\n   @protected\n   */\n  _handleReturnFocus() {\n    if (this.returnFocus === returnFocus.ON && this._elementToFocusWhenHidden) {\n      if (document.activeElement && !this.contains(document.activeElement)) {\n        // Don't return focus if the user focused outside of the overlay\n        return;\n      }\n\n      this._elementToFocusWhenHidden.setAttribute('aria-expanded', 'false');\n\n      // Return focus, ignoring tab capture if it is an overlay\n      this._elementToFocusWhenHidden._ignoreTabCapture = true;\n      this._elementToFocusWhenHidden.focus(preventScroll(this));\n      this._elementToFocusWhenHidden._ignoreTabCapture = false;\n\n      // Drop the reference to avoid memory leaks\n      this._elementToFocusWhenHidden = null;\n    }\n  }\n\n  /**\n   Focus on the first or last element.\n\n   @param {String} which\n   one of \"first\" or \"last\"\n   @protected\n   */\n  _focusOn(which) {\n    const focusableTarget = this._getFocusableElement(which);\n\n    // if we found a focusing target we focus it\n    if (focusableTarget) {\n      focusableTarget.focus(preventScroll(this));\n    }\n    // otherwise the element itself should get focus\n    else {\n      this.focus(preventScroll(this));\n    }\n  }\n\n  _getFocusableElements() {\n    return Array.prototype.filter.call(this.querySelectorAll(commons.FOCUSABLE_ELEMENT_SELECTOR), item => item.offsetParent !== null && !item.hasAttribute('coral-tabcapture'));\n  }\n\n  _getFocusableElement(which) {\n    let focusableTarget;\n\n    if (which === 'first' || which === 'last') {\n      const focusableElements = this._getFocusableElements();\n      focusableTarget = focusableElements[which === 'first' ? 'shift' : 'pop']();\n    }\n\n    return focusableTarget;\n  }\n\n  /**\n   Open the overlay and set the z-index accordingly.\n\n   @returns {BaseOverlay} this, chainable\n   */\n  show() {\n    this.open = true;\n\n    return this;\n  }\n\n  /**\n   Close the overlay.\n\n   @returns {BaseOverlay} this, chainable\n   */\n  hide() {\n    this.open = false;\n\n    return this;\n  }\n\n  /**\n   Set the element that focus should be returned to when the overlay is hidden.\n\n   @param {HTMLElement} element\n   The element to return focus to. This must be a DOM element, not a jQuery object or selector.\n\n   @returns {BaseOverlay} this, chainable\n   */\n  returnFocusTo(element) {\n    if (this.returnFocus === returnFocus.OFF) {\n      // Switch on returning focus if it's off\n      this.returnFocus = returnFocus.ON;\n    }\n\n    // If the element is not focusable,\n    if (!element.matches(commons.FOCUSABLE_ELEMENT_SELECTOR)) {\n      // add tabindex so that it is programmatically focusable.\n      element.setAttribute('tabindex', -1);\n\n      // On blur, restore element to its prior, not-focusable state\n      const tempVent = new Vent(element);\n      tempVent.on('blur.afterFocus', (event) => {\n        // Wait a frame before testing whether focus has moved to an open overlay or to some other element.\n        window.requestAnimationFrame(() => {\n          // If overlay remains open, don't remove tabindex event handler until after it has been closed\n          const top = OverlayManager.top();\n          if (top && top.instance.contains(document.activeElement)) {\n            return;\n          }\n          tempVent.off('blur.afterFocus');\n          event.matchedTarget.removeAttribute('tabindex');\n        });\n      }, true);\n    }\n\n    this._returnFocusToElement = element;\n    return this;\n  }\n\n  static get _OverlayManager() {\n    return OverlayManager;\n  }\n\n  /**\n   Returns {@link BaseOverlay} trap focus options.\n\n   @return {OverlayTrapFocusEnum}\n   */\n  static get trapFocus() {\n    return trapFocus;\n  }\n\n  /**\n   Returns {@link BaseOverlay} return focus options.\n\n   @return {OverlayReturnFocusEnum}\n   */\n  static get returnFocus() {\n    return returnFocus;\n  }\n\n  /**\n   Returns {@link BaseOverlay} scroll focus options.\n\n   @return {OverlayScrollOnFocusEnum}\n   */\n  static get scrollOnFocus() {\n    return scrollOnFocus;\n  }\n\n  /**\n   Returns {@link BaseOverlay} focus on show options.\n\n   @return {OverlayFocusOnShowEnum}\n   */\n  static get focusOnShow() {\n    return focusOnShow;\n  }\n\n  /**\n   Returns {@link BaseOverlay} fadetime in milliseconds.\n\n   @return {Number}\n   */\n  static get FADETIME() {\n    return FADETIME;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      trapfocus: 'trapFocus',\n      returnfocus: 'returnFocus',\n      focusonshow: 'focusOnShow',\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'trapfocus',\n      'returnfocus',\n      'focusonshow',\n      'open'\n    ]);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    if (!this.hasAttribute('trapfocus')) {\n      this.trapFocus = this.trapFocus;\n    }\n    if (!this.hasAttribute('returnfocus')) {\n      this.returnFocus = this.returnFocus;\n    }\n    if (!this.hasAttribute('focusonshow')) {\n      this.focusOnShow = this.focusOnShow;\n    }\n    if (!this.hasAttribute('scrollonfocus')) {\n      this.scrollOnFocus = this.scrollOnFocus;\n    }\n\n    if (this.open) {\n      this._pushOverlay();\n\n      if (this._showBackdropOnAttached) {\n        // Show the backdrop again\n        this._showBackdrop();\n      }\n    } else {\n      // If overlay is closed, make sure that it is hidden with `display: none`,\n      // but set `visibility: visible` to ensure that the overlay will be included in accessibility name or description\n      // of an element that references it using `aria-labelledby` or `aria-describedby`.\n      this.style.display = 'none';\n      this.style.visibility = 'visible';\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    if (this.open) {\n      // Release zIndex as we're not in the DOM any longer\n      // When we're re-added, we'll get a new zIndex\n      this._popOverlay();\n\n      if (this._requestedBackdrop) {\n        // Mark that we'll need to show the backdrop when attached\n        this._showBackdropOnAttached = true;\n      }\n    }\n  }\n\n  /**\n   Called when the {@link BaseOverlay} is clicked.\n\n   @function backdropClickedCallback\n   @protected\n   */\n\n  /**\n   Triggered before the {@link BaseOverlay} is opened with <code>show()</code> or <code>instance.open = true</code>.\n\n   @typedef {CustomEvent} coral-overlay:beforeopen\n\n   @property {function} preventDefault\n   Call to stop the overlay from opening.\n   */\n\n  /**\n   Triggered after the {@link BaseOverlay} is opened with <code>show()</code> or <code>instance.open = true</code>\n\n   @typedef {CustomEvent} coral-overlay:open\n   */\n\n  /**\n   Triggered before the {@link BaseOverlay} is closed with <code>hide()</code> or <code>instance.open = false</code>.\n\n   @typedef {CustomEvent} coral-overlay:beforeclose\n\n   @property {function} preventDefault\n   Call to stop the overlay from closing.\n   */\n\n  /**\n   Triggered after the {@link BaseOverlay} is closed with <code>hide()</code> or <code>instance.open = false</code>\n\n   @typedef {CustomEvent} coral-overlay:close\n   */\n};\n\nexport default BaseOverlay;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 228,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 229,
    "kind": "variable",
    "name": "COMPONENTS_WITH_OVERLAY",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~COMPONENTS_WITH_OVERLAY",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 230,
    "kind": "variable",
    "name": "startZIndex",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~startZIndex",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 231,
    "kind": "variable",
    "name": "TAB_KEY",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~TAB_KEY",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 232,
    "kind": "variable",
    "name": "overlayStack",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~overlayStack",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 49,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 233,
    "kind": "variable",
    "name": "OverlayManager",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~OverlayManager",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 50,
    "undocument": true,
    "type": {
      "types": [
        "{}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 234,
    "kind": "function",
    "name": "preventScroll",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~preventScroll",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Return focus option",
    "lineNumber": 55,
    "params": [
      {
        "name": "instance",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "{\"preventScroll\": *}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 235,
    "kind": "function",
    "name": "cancelBackdropHide",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~cancelBackdropHide",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 64,
    "undocument": true,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 236,
    "kind": "function",
    "name": "hideEverythingBut",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~hideEverythingBut",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Set aria-hidden on every immediate child except the one passed, which should not be hidden.",
    "lineNumber": 71,
    "params": [
      {
        "name": "instance",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 237,
    "kind": "function",
    "name": "doRepositionBackdrop",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~doRepositionBackdrop",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Actually reposition the backdrop to be under the topmost overlay.",
    "lineNumber": 105,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 238,
    "kind": "function",
    "name": "createDocumentTabCaptureEls",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~createDocumentTabCaptureEls",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Create the global tab capture element.",
    "lineNumber": 209,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 239,
    "kind": "function",
    "name": "hideDocumentTabCaptureEls",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~hideDocumentTabCaptureEls",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Called after all overlays are hidden and we shouldn't capture the first tab into the page.",
    "lineNumber": 267,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 240,
    "kind": "function",
    "name": "showEverything",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~showEverything",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Show or restore the aria-hidden state of every child of body.",
    "lineNumber": 277,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 241,
    "kind": "function",
    "name": "doBackdropHide",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~doBackdropHide",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Actually hide the backdrop.",
    "lineNumber": 290,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 242,
    "kind": "function",
    "name": "hideOrRepositionBackdrop",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~hideOrRepositionBackdrop",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Hide the backdrop if no overlays are using it.",
    "lineNumber": 313,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 243,
    "kind": "function",
    "name": "handleBackdropClick",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~handleBackdropClick",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Handles clicks to the backdrop, calling backdropClickedCallback for every overlay",
    "lineNumber": 346,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 244,
    "kind": "function",
    "name": "doBackdropShow",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~doBackdropShow",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Actually show the backdrop.",
    "lineNumber": 357,
    "params": [
      {
        "name": "zIndex",
        "types": [
          "*"
        ]
      },
      {
        "name": "instance",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 245,
    "kind": "class",
    "name": "BaseOverlay",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for Overlay components",
    "lineNumber": 392,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseOverlay"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for Overlay components"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 246,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 394,
    "ignore": true
  },
  {
    "__docId__": 247,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 398,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 248,
    "kind": "member",
    "name": "trapFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#trapFocus",
    "access": "public",
    "description": "Whether to trap tabs and keep them within the overlay. See {@link OverlayTrapFocusEnum}.\n<ul><li><code>OverlayTrapFocusEnum.OFF</code> by default.</li></ul>",
    "lineNumber": 409,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayTrapFocusEnum.OFF"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "trapfocus"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 250,
    "kind": "member",
    "name": "_trapFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_trapFocus",
    "access": "private",
    "description": null,
    "lineNumber": 415,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 251,
    "kind": "member",
    "name": "tabIndex",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#tabIndex",
    "access": "public",
    "description": null,
    "lineNumber": 421,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 254,
    "kind": "member",
    "name": "returnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#returnFocus",
    "access": "public",
    "description": "Whether to return focus to the previously focused element when closed. See {@link OverlayReturnFocusEnum}.\n<ul><li><code>OverlayReturnFocusEnum.OFF</code> by default.</li></ul>",
    "lineNumber": 454,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayReturnFocusEnum.OFF"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "returnfocus"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 256,
    "kind": "member",
    "name": "_returnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_returnFocus",
    "access": "private",
    "description": null,
    "lineNumber": 460,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 257,
    "kind": "member",
    "name": "returnFocusToElement",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#returnFocusToElement",
    "access": "public",
    "description": "returns element that will receive focus when overlay is closed",
    "lineNumber": 467,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}element passed via returnFocusTo()"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "{HTMLElement}element passed via returnFocusTo()"
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 258,
    "kind": "member",
    "name": "elementToFocusWhenHidden",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#elementToFocusWhenHidden",
    "access": "public",
    "description": "returns element that will receive focus when overlay is hidden",
    "lineNumber": 475,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement} element cached"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "element cached"
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 259,
    "kind": "member",
    "name": "scrollOnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#scrollOnFocus",
    "access": "public",
    "description": "Whether the browser should scroll the document to bring the newly-focused element into view. See {@link OverlayScrollOnFocusEnum}.\n<ul><li><code>OverlayScrollOnFocusEnum.ON</code> by default.</li></ul>",
    "lineNumber": 486,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayScrollOnFocusEnum.ON"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "scrollonfocus"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 261,
    "kind": "member",
    "name": "_scrollOnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_scrollOnFocus",
    "access": "private",
    "description": null,
    "lineNumber": 492,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 262,
    "kind": "member",
    "name": "focusOnShow",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#focusOnShow",
    "access": "public",
    "description": "Whether to focus the overlay, when opened or not. By default the overlay itself will get the focus. It also accepts\nan instance of HTMLElement or a selector like ':first-child' or 'button:last-of-type'. If the selector returns\nmultiple elements, it will focus the first element inside the overlay that matches the selector.\nSee {@link OverlayFocusOnShowEnum}.\n<ul><li><code>OverlayFocusOnShowEnum.ON</code> by default.</li></ul>",
    "lineNumber": 505,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayFocusOnShowEnum.ON"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "focusonshow"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement",
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 264,
    "kind": "member",
    "name": "_focusOnShow",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_focusOnShow",
    "access": "private",
    "description": null,
    "lineNumber": 511,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 265,
    "kind": "member",
    "name": "open",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#open",
    "access": "public",
    "description": "Whether this overlay is open or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 527,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "open"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "emits": [
      {
        "types": [
          "coral-overlay:open"
        ],
        "description": ""
      },
      {
        "types": [
          "coral-overlay:close"
        ],
        "description": ""
      },
      {
        "types": [
          "coral-overlay:beforeopen"
        ],
        "description": ""
      },
      {
        "types": [
          "coral-overlay:beforeclose"
        ],
        "description": ""
      }
    ],
    "modality": "both"
  },
  {
    "__docId__": 267,
    "kind": "member",
    "name": "_elementToFocusWhenHidden",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_elementToFocusWhenHidden",
    "access": "private",
    "description": null,
    "lineNumber": 563,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 268,
    "kind": "member",
    "name": "_silenced",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_silenced",
    "access": "private",
    "description": null,
    "lineNumber": 580,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 271,
    "kind": "method",
    "name": "_closeChildOverlays",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_closeChildOverlays",
    "access": "private",
    "description": null,
    "lineNumber": 669,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 272,
    "kind": "method",
    "name": "_debounce",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_debounce",
    "access": "private",
    "description": null,
    "lineNumber": 688,
    "ignore": true,
    "params": [
      {
        "name": "f",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 273,
    "kind": "member",
    "name": "_debounceId",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_debounceId",
    "access": "private",
    "description": null,
    "lineNumber": 691,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 274,
    "kind": "method",
    "name": "_isTopOverlay",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_isTopOverlay",
    "access": "protected",
    "description": "Check if this overlay is the topmost.",
    "lineNumber": 701,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 275,
    "kind": "method",
    "name": "_pushOverlay",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_pushOverlay",
    "access": "protected",
    "description": "Push the overlay to the top of the stack.",
    "lineNumber": 711,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 276,
    "kind": "method",
    "name": "_popOverlay",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_popOverlay",
    "access": "protected",
    "description": "Remove the overlay from the stack.",
    "lineNumber": 720,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 277,
    "kind": "method",
    "name": "_showBackdrop",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_showBackdrop",
    "access": "protected",
    "description": "Show the backdrop.",
    "lineNumber": 732,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 278,
    "kind": "member",
    "name": "_requestedBackdrop",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_requestedBackdrop",
    "access": "private",
    "description": null,
    "lineNumber": 743,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 279,
    "kind": "member",
    "name": "_showBackdropOnAttached",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_showBackdropOnAttached",
    "access": "private",
    "description": null,
    "lineNumber": 748,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 280,
    "kind": "method",
    "name": "_hideBackdrop",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_hideBackdrop",
    "access": "protected",
    "description": "Show the backdrop.",
    "lineNumber": 761,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 282,
    "kind": "method",
    "name": "_handleRootKeypress",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_handleRootKeypress",
    "access": "protected",
    "description": "Handles keypresses on the root of the overlay and marshalls focus accordingly.",
    "lineNumber": 780,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 283,
    "kind": "method",
    "name": "_handleTabCaptureFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_handleTabCaptureFocus",
    "access": "protected",
    "description": "Handles focus events on tab capture elements.",
    "lineNumber": 795,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 284,
    "kind": "member",
    "name": "_ignoreTabCapture",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_ignoreTabCapture",
    "access": "private",
    "description": null,
    "lineNumber": 798,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 285,
    "kind": "method",
    "name": "_handleFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_handleFocus",
    "access": "protected",
    "description": "Handles the focus behavior. When \"on\" is specified it would try to find the first tababble descendent in the\ncontent and if there are no valid candidates it will focus the element itself.",
    "lineNumber": 815,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 286,
    "kind": "method",
    "name": "_handleReturnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_handleReturnFocus",
    "access": "protected",
    "description": "",
    "lineNumber": 841,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 288,
    "kind": "method",
    "name": "_focusOn",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_focusOn",
    "access": "protected",
    "description": "Focus on the first or last element.",
    "lineNumber": 867,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "which",
        "description": "one of \"first\" or \"last\""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 289,
    "kind": "method",
    "name": "_getFocusableElements",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_getFocusableElements",
    "access": "private",
    "description": null,
    "lineNumber": 880,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 290,
    "kind": "method",
    "name": "_getFocusableElement",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_getFocusableElement",
    "access": "private",
    "description": null,
    "lineNumber": 884,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "which",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 291,
    "kind": "method",
    "name": "show",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#show",
    "access": "public",
    "description": "Open the overlay and set the z-index accordingly.",
    "lineNumber": 900,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseOverlay} this, chainable"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseOverlay"
      ],
      "spread": false,
      "description": "this, chainable"
    },
    "params": []
  },
  {
    "__docId__": 293,
    "kind": "method",
    "name": "hide",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#hide",
    "access": "public",
    "description": "Close the overlay.",
    "lineNumber": 911,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseOverlay} this, chainable"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseOverlay"
      ],
      "spread": false,
      "description": "this, chainable"
    },
    "params": []
  },
  {
    "__docId__": 295,
    "kind": "method",
    "name": "returnFocusTo",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#returnFocusTo",
    "access": "public",
    "description": "Set the element that focus should be returned to when the overlay is hidden.",
    "lineNumber": 925,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{BaseOverlay} this, chainable"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The element to return focus to. This must be a DOM element, not a jQuery object or selector."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "BaseOverlay"
      ],
      "spread": false,
      "description": "this, chainable"
    }
  },
  {
    "__docId__": 297,
    "kind": "member",
    "name": "_returnFocusToElement",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#_returnFocusToElement",
    "access": "private",
    "description": null,
    "lineNumber": 952,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 298,
    "kind": "member",
    "name": "_OverlayManager",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay._OverlayManager",
    "access": "private",
    "description": null,
    "lineNumber": 956,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 299,
    "kind": "member",
    "name": "trapFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.trapFocus",
    "access": "public",
    "description": "Returns {@link BaseOverlay} trap focus options.",
    "lineNumber": 965,
    "return": {
      "nullable": null,
      "types": [
        "OverlayTrapFocusEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 300,
    "kind": "member",
    "name": "returnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.returnFocus",
    "access": "public",
    "description": "Returns {@link BaseOverlay} return focus options.",
    "lineNumber": 974,
    "return": {
      "nullable": null,
      "types": [
        "OverlayReturnFocusEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 301,
    "kind": "member",
    "name": "scrollOnFocus",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.scrollOnFocus",
    "access": "public",
    "description": "Returns {@link BaseOverlay} scroll focus options.",
    "lineNumber": 983,
    "return": {
      "nullable": null,
      "types": [
        "OverlayScrollOnFocusEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 302,
    "kind": "member",
    "name": "focusOnShow",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.focusOnShow",
    "access": "public",
    "description": "Returns {@link BaseOverlay} focus on show options.",
    "lineNumber": 992,
    "return": {
      "nullable": null,
      "types": [
        "OverlayFocusOnShowEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 303,
    "kind": "member",
    "name": "FADETIME",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.FADETIME",
    "access": "public",
    "description": "Returns {@link BaseOverlay} fadetime in milliseconds.",
    "lineNumber": 1001,
    "return": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 304,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 1005,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 305,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 1014,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 306,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 1024,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 311,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#render",
    "access": "public",
    "description": null,
    "lineNumber": 1057,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 312,
    "kind": "method",
    "name": "disconnectedCallback",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay#disconnectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 1064,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 313,
    "kind": "typedef",
    "name": "coral-overlay:beforeopen",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.coral-overlay:beforeopen",
    "access": "public",
    "description": "Triggered before the {@link BaseOverlay} is opened with <code>show()</code> or <code>instance.open = true</code>.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "function"
        ],
        "spread": false,
        "optional": false,
        "name": "preventDefault",
        "description": "Call to stop the overlay from opening."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-overlay:beforeopen"
    }
  },
  {
    "__docId__": 314,
    "kind": "typedef",
    "name": "coral-overlay:open",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.coral-overlay:open",
    "access": "public",
    "description": "Triggered after the {@link BaseOverlay} is opened with <code>show()</code> or <code>instance.open = true</code>",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-overlay:open"
    }
  },
  {
    "__docId__": 315,
    "kind": "typedef",
    "name": "coral-overlay:beforeclose",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.coral-overlay:beforeclose",
    "access": "public",
    "description": "Triggered before the {@link BaseOverlay} is closed with <code>hide()</code> or <code>instance.open = false</code>.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "function"
        ],
        "spread": false,
        "optional": false,
        "name": "preventDefault",
        "description": "Call to stop the overlay from closing."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-overlay:beforeclose"
    }
  },
  {
    "__docId__": 316,
    "kind": "typedef",
    "name": "coral-overlay:close",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/BaseOverlay.js~BaseOverlay.coral-overlay:close",
    "access": "public",
    "description": "Triggered after the {@link BaseOverlay} is closed with <code>hide()</code> or <code>instance.open = false</code>",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-overlay:close"
    }
  },
  {
    "__docId__": 318,
    "kind": "file",
    "name": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Enumeration for {@link BaseOverlay} trap options.\n\n @typedef {Object} OverlayTrapFocusEnum\n\n @property {String} ON\n Focus is trapped such that the use cannot focus outside of the overlay.\n @property {String} OFF\n The user can focus outside the overlay as normal.\n */\nconst trapFocus = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link BaseOverlay} scroll focus options.\n\n @typedef {Object} OverlayScrollOnFocusEnum\n\n @property {String} ON\n Scroll the document to bring the newly-focused element into view.\n @property {String} OFF\n Document will not scroll on focus.\n */\nconst scrollOnFocus = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link BaseOverlay} return focus options.\n\n @typedef {Object} OverlayReturnFocusEnum\n\n @property {String} ON\n When the overlay is closed, the element that was focused before the it was shown will be focused again.\n @property {String} OFF\n Nothing will be focused when the overlay is closed.\n */\nconst returnFocus = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link BaseOverlay} focus behavior options.\n\n @typedef {Object} OverlayFocusOnShowEnum\n\n @property {String} ON\n When the overlay is opened, it will be focused.\n @property {String} OFF\n The overlay will not focus itself when opened.\n */\nconst focusOnShow = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n The time it should take for {@link BaseOverlay} to fade in milliseconds.\n Important: This should be greater than or equal to the CSS transition time.\n\n @typedef {Number} OverlayFadeTime\n */\nconst FADETIME = 350;\n\nexport {trapFocus, returnFocus, focusOnShow, scrollOnFocus, FADETIME};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 319,
    "kind": "typedef",
    "name": "OverlayTrapFocusEnum",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/enums.js~OverlayTrapFocusEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseOverlay} trap options.",
    "lineNumber": 23,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Focus is trapped such that the use cannot focus outside of the overlay."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "The user can focus outside the overlay as normal."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayTrapFocusEnum"
    }
  },
  {
    "__docId__": 320,
    "kind": "typedef",
    "name": "OverlayReturnFocusEnum",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/enums.js~OverlayReturnFocusEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseOverlay} return focus options.",
    "lineNumber": 53,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "When the overlay is closed, the element that was focused before the it was shown will be focused again."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Nothing will be focused when the overlay is closed."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayReturnFocusEnum"
    }
  },
  {
    "__docId__": 321,
    "kind": "typedef",
    "name": "OverlayFocusOnShowEnum",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/enums.js~OverlayFocusOnShowEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseOverlay} focus behavior options.",
    "lineNumber": 68,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "When the overlay is opened, it will be focused."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "The overlay will not focus itself when opened."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayFocusOnShowEnum"
    }
  },
  {
    "__docId__": 322,
    "kind": "typedef",
    "name": "OverlayScrollOnFocusEnum",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/enums.js~OverlayScrollOnFocusEnum",
    "access": "public",
    "description": "Enumeration for {@link BaseOverlay} scroll focus options.",
    "lineNumber": 38,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Scroll the document to bring the newly-focused element into view."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Document will not scroll on focus."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayScrollOnFocusEnum"
    }
  },
  {
    "__docId__": 323,
    "kind": "typedef",
    "name": "OverlayFadeTime",
    "memberof": "coral-spectrum/coral-base-overlay/src/scripts/enums.js",
    "static": true,
    "longname": "coral-spectrum/coral-base-overlay/src/scripts/enums.js~OverlayFadeTime",
    "access": "public",
    "description": "The time it should take for {@link BaseOverlay} to fade in milliseconds.\nImportant: This should be greater than or equal to the CSS transition time.",
    "lineNumber": 79,
    "type": {
      "types": [
        "Number"
      ],
      "optional": false,
      "name": "OverlayFadeTime"
    }
  },
  {
    "__docId__": 324,
    "kind": "file",
    "name": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport listToArray from './listToArray';\n\n/**\n Unique id used to idenfity the collection.\n\n @private\n */\nlet nextID = 0;\n\n/**\n Attribute used to identify the items of a collection.\n\n @private\n */\nconst COLLECTION_ID = 'coral-collection-id-';\n\n/**\n Selector used to determine if nested items should be allowed.\n\n @private\n */\nconst SCOPE_SELECTOR = ':scope > ';\n\n/** @private */\nfunction getTagSelector(tag, nativeTag) {\n  return nativeTag ? `${nativeTag}[is=\"${tag}\"]` : tag;\n}\n\n/**\n Helper function used to determine if the item should be filtered. If the filter is <code>undefined</code>, then the\n item will pass the filter.\n\n @param {HTMLElement} item\n The item that should be filtered.\n @param {Function} filter\n Function used to filter the item\n\n @returns {Boolean} true if the item passes the filter, otherwise false.\n\n @private\n */\nfunction filterItem(item, filter) {\n  return typeof filter !== 'function' || filter(item);\n}\n\n/**\n Collection provides a standardized way to manipulate items in a component.\n */\nclass Collection {\n  /**\n   @param {HTMLElement} options.host\n   The element that hosts the collection.\n   @param {String} options.itemTagName\n   The tag name of the elements that constitute a collection item.\n   @param {String} options.itemBaseTagName\n   The optional base tag name of the elements that constitute a collection item. This is required for elements that\n   extend native elements, like Button.\n   @param {String} [options.itemSelector]\n   Optional, derived from itemTagName and itemBaseTagName by default. Used to query the host element for its\n   collection items.\n   @param {HTMLElement} [options.container]\n   Optional element that wraps the collection. Defines where the new items will be added when <code>add</code> method\n   is called. Is the same as options.host by default.\n   @param {CollectionFilter} [options.filter]\n   Optional function used to filter the results.\n   @param {CollectionOnItemAdded} [options.onItemAdded]\n   Function called once an item is added to the DOM. If the Collection has been configured to handle the items\n   automatically, the callback will be called once the collection detects that the item has been added to the DOM and\n   not synchronously with <code>add()</code>.\n   @param {CollectionOnItemRemoved} [options.onItemRemoved]\n   Function called once an item is removed from the DOM. If the Collection has been configured to handle the items\n   automatically, the callback will be called once the collection detects that the item has been removed from the DOM\n   not synchronously with <code>add()</code>.\n   @param {CollectionOnChange} [options.onCollectionChange]\n   Function called after there has been a change in the collection. This allows components to handle state changes\n   after an item(s) has been added or removed. This callback will only be called if the Collection is configured to\n   handle the items automatically.\n   is <code>true</code>.\n   */\n  constructor(options) {\n    options = options || {};\n\n    // we create an unique collection identifier\n    this._id = nextID++;\n\n    this._host = options.host;\n    this._itemTagName = options.itemTagName;\n    this._itemBaseTagName = options.itemBaseTagName;\n\n    this._itemTagNameFilter = [];\n    this._itemBaseTagName && this._itemTagNameFilter.push(this._itemBaseTagName.toUpperCase());\n    this._itemTagName && this._itemTagNameFilter.push(this._itemTagName.toUpperCase());\n\n    this._itemSelector = options.itemSelector || getTagSelector(this._itemTagName, this._itemBaseTagName);\n\n    // the container where the new items are added\n    this._container = options.container || this._host;\n    this._filter = options.filter;\n\n    this._onlyHandleChildren = typeof options.onlyHandleChildren === 'boolean' ? options.onlyHandleChildren : false;\n\n    // internal variable to determine if collection events will be handled internally\n    this._handleItems = false;\n\n    // we provide support for the :scope selector and swap it for an id\n    if (this._itemSelector && this._itemSelector.indexOf(SCOPE_SELECTOR) === 0) {\n      this._container.id = this._container.id || COLLECTION_ID + this._id;\n      // we create a special selector to make sure that the items are direct children of the container. given that\n      // :scope is not fully supported by all browsers, we use an id to query\n      this._allItemsSelector = this._itemSelector.replace(SCOPE_SELECTOR, `#${this._container.id} > `);\n\n      // we remove the :scope from the selector to be able to use it to determine if the item matches the collection\n      this._itemSelector = this._itemSelector.replace(SCOPE_SELECTOR, '');\n      // in case they match, we enable this optimization\n      if (this._itemSelector === this._itemTagName) {\n        this._useItemTagName = this._itemSelector.toUpperCase();\n      }\n    }\n    // live collections are not supported when nested items is used\n    else {\n      this._allItemsSelector = this._itemSelector;\n\n      // live collections can only be used when a tagname is used to query the items\n      if (this._container && this._allItemsSelector === this._itemTagName) {\n        this._liveCollection = true;\n        this._useItemTagName = this._allItemsSelector.toUpperCase();\n      }\n    }\n\n    this._onItemAdded = options.onItemAdded;\n    this._onItemRemoved = options.onItemRemoved;\n    this._onCollectionChange = options.onCollectionChange;\n  }\n\n  /**\n   Number of items inside the Collection.\n\n   @type {Number}\n   @default 0\n   */\n  get length() {\n    return this.getAll().length;\n  }\n\n  /**\n   Adds an item to the Collection. The item can be either a <code>HTMLElement</code> or an Object with the item\n   properties. If the index is not provided the element appended to the end. If <code>options.onItemAdded</code> was\n   provided, it will be called after the element is added from the DOM.\n\n   @param {HTMLElement|Object} item\n   The item to add to the Collection.\n   @param {HTMLElement} [insertBefore]\n   Existing item used as a reference to insert the new item before. If the value is <code>null</code>, then the new\n   item will be added at the end.\n\n   @emits {coral-collection:add}\n\n   @returns {HTMLElement} the item added.\n   */\n  add(item, insertBefore) {\n    // container and itemtagname are the minimum options that need to be provided to automatically handle this function\n    if (this._container && this._itemTagName) {\n      if (!(item instanceof HTMLElement)) {\n        // creates an instance of an item from the object\n        if (this._itemBaseTagName) {\n          item = document.createElement(this._itemBaseTagName, {is: this._itemTagName}).set(item, true);\n        } else {\n          item = document.createElement(this._itemTagName).set(item, true);\n        }\n      }\n\n      // inserts the element in the specified container\n      this._container.insertBefore(item, insertBefore || null);\n\n      // when items are handled automatically there is no need to call this immediately\n      if (!this._handleItems && typeof this._onItemAdded === 'function' && this._host && filterItem(item, this._filter)) {\n        this._onItemAdded.call(this._host, item);\n      }\n\n      return item;\n    }\n\n    throw new Error('Please provide host and itemTagName or override add() to provide your own implementation.');\n  }\n\n  /**\n   Removes all the items from the Collection.\n\n   @returns {Array.<HTMLElement>} an Array with all the removed items.\n   */\n  clear() {\n    const items = this.getAll();\n\n    const removed = [];\n\n    for (let i = items.length - 1 ; i > -1 ; i--) {\n      removed.push(this.remove(items[i]));\n    }\n\n    return removed;\n  }\n\n  /**\n   Returns an array with all the items inside the Collection. Each element is of type <code>HTMLElement</code>.\n\n   @returns {Array.<HTMLElement>} an Array with all the items inside the collection.\n   */\n  getAll() {\n    // in order to perform the automatic getAll query, the _host and _allItemsSelector must be provided\n    if (this._container && this._allItemsSelector) {\n      let items = this._liveCollection ?\n        // instead of querying the DOM, we just convert the live collection to an array, this way we obtain a\n        // \"snapshot\" of the DOM\n        Array.from(this._container.getElementsByTagName(this._allItemsSelector)) :\n        Array.from(this._container.querySelectorAll(this._allItemsSelector));\n\n      if (this._filter) {\n        items = items.filter(this._filter);\n      }\n\n      return items;\n    }\n\n    throw new Error('Please provide host and itemTagName or override getAll() to provide your own implementation.');\n  }\n\n  /**\n   Removes the given item from the Collection. If <code>options.onItemRemoved</code> was provided, it will be called\n   after the element is removed from the DOM.\n\n   @param {HTMLElement} item\n   The item to add to the Collection.\n\n   @emits {coral-collection:remove}\n\n   @returns {HTMLElement} the item removed.\n   */\n  remove(item) {\n    if (item.parentNode) {\n      item.parentNode.removeChild(item);\n\n      // when items are handled automatically there is no need to call this immediatelly\n      if (!this._handleItems && typeof this._onItemRemoved === 'function' && this._host && filterItem(item, this._filter)) {\n        this._onItemRemoved.call(this._host, item);\n      }\n    }\n\n    return item;\n  }\n\n  /**\n   Returns the first item of the collection.\n\n   @returns {?HTMLElement} the first item of the collection.\n   */\n  first() {\n    // Use getAll() so filter() is applied\n    return this.getAll()[0] || null;\n  }\n\n  /**\n   Returns the last item of the collection.\n\n   @returns {?HTMLElement} the last item of the collection.\n   */\n  last() {\n    // Use getAll() so filter() is applied\n    const all = this.getAll();\n    return all[all.length - 1] || null;\n  }\n\n  /**\n   Checks if the given Node belongs to the current collection. It is said that a Node belongs to a given collection\n   if it passes <code>options.filter</code> and it matches <code>options.itemSelector</code>.\n\n   @param {Node} node\n   The node to check if it belongs to the collection.\n\n   @returns {Boolean} true if the node is part of the collection, otherwise false.\n\n   @protected\n   */\n  _isPartOfCollection(node) {\n    // Only element nodes are allowed\n    let tagName = node.tagName;\n\n    return node.nodeType === Node.ELEMENT_NODE &&\n      (this._itemTagNameFilter.length === 0 || this._itemTagNameFilter.includes(tagName)) &&\n      filterItem(node, this._filter) &&\n      // this is an optimization to avoid using matches\n      (this._useItemTagName ? this._useItemTagName === tagName : node.matches(this._itemSelector));\n  }\n\n  /**\n   Handles the attachment of an item to the collection. It triggers automatically the collection event.\n\n   @param {HTMLElement} item\n   The item that was attached to the collection.\n\n   @emits {coral-collection:add}\n\n   @protected\n   */\n  _onItemAttached(item) {\n    // if options.onItemAdded was provided, we call the function\n    if (typeof this._onItemAdded === 'function') {\n      this._onItemAdded.call(this._host, item);\n    }\n\n    // the usage of trigger assumes that the host is a coral component\n    this._host.trigger('coral-collection:add', {item});\n  }\n\n  /**\n   Handles the detachment of a item to the collection. It triggers automatically the collection event.\n\n   @param {HTMLElement} item\n   The item that was detached of the collection\n\n   @emits {coral-collection:remove}\n\n   @protected\n   */\n  _onItemDetached(item) {\n    // if options.onItemRemoved was provided, we call the function\n    if (typeof this._onItemRemoved === 'function') {\n      this._onItemRemoved.call(this._host, item);\n    }\n\n    // the usage of trigger assumes that the host is a coral component\n    this._host.trigger('coral-collection:remove', {item});\n  }\n\n  /**\n   Handles the collection changes. It automatically triggers the collection change event.\n   @param {Array<HTMLElement>} addedNodes The items that was added to the collection\n   @param {Array<HTMLElement>} removedNodes The items that was removed from the collection\n   @emits {coral-collection:change}\n   @protected\n   */\n  _onCollectionMutation(addedNodes, removedNodes) {\n    // if options.onCollectionChange was provided, we call the function\n    if (typeof this._onCollectionChange === 'function') {\n      this._onCollectionChange.call(this._host, addedNodes, removedNodes);\n    }\n\n    // the usage of trigger assumes that the host is a coral component\n    this._host.trigger('coral-collection:change', {\n      addedItems: addedNodes,\n      removedItems: removedNodes\n    });\n  }\n\n  /**\n   Enables the automatic detection of collection items. The collection will take care of triggering the appropriate\n   collection event when an item is added or removed, as well the related callbacks. Components can decide to skip the\n   initialization of the starting items by providing <code>skipInitialItems</code> as <code>false</code>.\n\n   @param {Boolean} [skipInitialItems=false]\n   If <code>true</code>, <code>onItemAdded</code> will be called for every starting item. A collection event will not\n   be triggered for these items.\n\n   @protected\n   */\n  _startHandlingItems(skipInitialItems) {\n    if (this._host && this._container) {\n      // we reuse the observer if it already exists, this way we do not need to disconnect it if this function is called\n      // again\n      this._observer = this._observer || new MutationObserver(this._handleMutation.bind(this));\n\n      // this changes the way that _onItemAdded and _onItemRemoved behave, since they well be delayed until a mutation\n      // detects them\n      this._handleItems = true;\n\n      if (this._onlyHandleChildren) {\n        this._observer.observe(this._container, {\n          // we only need to observe for items that were added and removed, no need to check attributes and contents\n          childList: true,\n        });\n      } else {\n        this._observer.observe(this._container, {\n          // we only need to observe for items that were added and removed, no need to check attributes and contents\n          childList: true,\n          // we need to listen to subtree mutations as items may not be direct children\n          subtree: true\n        });\n      }\n\n      // by default we handle the initial items unless otherwise indicated\n      if (skipInitialItems !== true) {\n        // since we are handling the items for the component, we need to make sure the _onItemAdded is called for the\n        // initial items. collection events will not be triggered for these items as they represent the initial state\n        let items;\n        let itemCount = 0;\n\n        if (typeof this._onItemAdded === 'function' || typeof this._onCollectionChange === 'function') {\n          items = this.getAll();\n          itemCount = items.length;\n        }\n\n        if (typeof this._onItemAdded === 'function') {\n          for (let i = 0 ; i < itemCount ; i++) {\n            this._onItemAdded.call(this._host, items[i]);\n          }\n        }\n\n        // we only call the _onCollectionChange callback if there are items inside the collection\n        if (itemCount > 0 && typeof this._onCollectionChange === 'function') {\n          this._onCollectionChange.call(this._host, items, []);\n        }\n      }\n    } else {\n      throw new Error('Please provide options.host and/or options.container to enable handling the items.');\n    }\n  }\n\n  /**\n   Stops handling the items.\n\n   @protected\n   */\n  _stopHandlingItems() {\n    if (this._observer) {\n      this._observer.disconnect();\n    }\n  }\n\n  /**\n   Handles every time that an element is added or removed from the <code>options.container</code>. By default the\n   collection events will be triggered. If <code>options.onItemAdded</code> or <code>options.onItemRemoved</code> were\n   provided, they will be called where it applies.\n\n   @param Array.<Object> mutations\n   Array that contains the <code>MutationRecord> relevant to every registered mutation.\n\n   @protected\n   */\n  _handleMutation(mutations) {\n    let mutation;\n    const mutationsCount = mutations.length;\n    let item;\n    let addedNodes;\n    let addedNodesCount;\n    let removedNodes;\n    let removedNodesCount;\n    const validAddedNodes = [];\n    const validRemovedNodes = [];\n\n    // we need to count every addition and removal to notify the component that the collection changed\n    let itemChanges = 0;\n    for (let i = 0 ; i < mutationsCount ; i++) {\n      mutation = mutations[i];\n\n      addedNodes = mutation.addedNodes;\n      addedNodesCount = addedNodes.length;\n      for (let j = 0 ; j < addedNodesCount ; j++) {\n        item = addedNodes[j];\n\n        // filters the item\n        if (this._isPartOfCollection(item)) {\n          itemChanges++;\n          validAddedNodes.push(item);\n          this._onItemAttached(item);\n        }\n      }\n\n      removedNodes = mutation.removedNodes;\n      removedNodesCount = removedNodes.length;\n      for (let k = 0 ; k < removedNodesCount ; k++) {\n        item = removedNodes[k];\n\n        // filters the item\n        if (this._isPartOfCollection(item)) {\n          itemChanges++;\n          validRemovedNodes.push(item);\n          this._onItemDetached(item);\n        }\n      }\n    }\n\n    // if changes were done to the collection we need to notify the component. we do this after all the mutations were\n    // processed to make sure we only do it once\n    if (itemChanges !== 0 && this._host) {\n      this._onCollectionMutation(validAddedNodes, validRemovedNodes);\n    }\n  }\n\n  /**\n   Triggered when an item is added to the {@link Collection}. {@link Collection} events are not synchronous so the DOM\n   may reflect a different reality although every addition or removal will be reported.\n\n   @typedef {CustomEvent} coral-collection:add\n\n   @property {HTMLElement} detail.item\n   The item that was added.\n   */\n\n  /**\n   Triggered when an item is removed from a {@link Collection}. {@link Collection} events are not synchronous so the DOM\n   may reflect a different reality although every addition or removal will be reported.\n\n   @typedef {CustomEvent} coral-collection:remove\n\n   @property {HTMLElement} detail.item\n   The item that was removed.\n   */\n\n  /**\n   * Triggered when either items are added or removed from {@link Collection}. {@link Collection} events are not synchronous so the DOM\n   * may reflect a different reality although every addition or removal will be reported. This event describes that {@link Collection} has\n   * changed or modified.\n   *\n   * @event coral-collection:change\n   * @type {Object}\n   * @property {Array<HTMLElement>} detail.addedItems - Items that are added to collection\n   * @property {Array<HTMLElement>} detail.removedItems - Items that are removed from collection\n   */\n\n  /**\n   Signature of the function called to determine if an element should be included in the {@link Collection}. If the function\n   returns <code>true</code> for the given element it will be part of the collection, otherwise it will be excluded.\n\n   @typedef {function} CollectionFilter\n\n   @param {HTMLElement} element\n   The item to check whether it should be part of the collection.\n\n   @returns {Boolean} true if should be part of the collection, otherwise false.\n   */\n\n  /**\n   Signature of the function called when ever an item is added to the {@link Collection}.\n\n   @typedef {function} CollectionOnItemAdded\n\n   @param {HTMLElement} item\n   The item that was added to the collection.\n   */\n\n  /**\n   Signature of the function called when ever an item is removed from the {@link Collection}.\n\n   @typedef {function} CollectionOnItemRemoved\n\n   @param {HTMLElement} item\n   The item that was added to the collection.\n   */\n\n  /**\n   Signature of the function called when there is a change in the {@link Collection}. The items that where added and removed\n   will be provided.\n\n   @typedef {function} CollectionOnChange\n\n   @param {Array.<HTMLElement>} addedNodes\n   An array that contains the items that were added to the collection.\n   @param {Array.<HTMLElement>} removedNodes\n   An array that contains the items that were removed from the collection.\n   */\n}\n\nexport default Collection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-collection/src/scripts/Collection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 325,
    "kind": "variable",
    "name": "nextID",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~nextID",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Unique id used to idenfity the collection.",
    "lineNumber": 20,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 326,
    "kind": "variable",
    "name": "COLLECTION_ID",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~COLLECTION_ID",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Attribute used to identify the items of a collection.",
    "lineNumber": 27,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 327,
    "kind": "variable",
    "name": "SCOPE_SELECTOR",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~SCOPE_SELECTOR",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Selector used to determine if nested items should be allowed.",
    "lineNumber": 34,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 328,
    "kind": "function",
    "name": "getTagSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~getTagSelector",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 37,
    "ignore": true,
    "params": [
      {
        "name": "tag",
        "types": [
          "*"
        ]
      },
      {
        "name": "nativeTag",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 329,
    "kind": "function",
    "name": "filterItem",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~filterItem",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Helper function used to determine if the item should be filtered. If the filter is <code>undefined</code>, then the\nitem will pass the filter.",
    "lineNumber": 54,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} true if the item passes the filter, otherwise false."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item that should be filtered."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "filter",
        "description": "Function used to filter the item"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "true if the item passes the filter, otherwise false."
    },
    "ignore": true
  },
  {
    "__docId__": 330,
    "kind": "class",
    "name": "Collection",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Collection}",
    "description": "Collection provides a standardized way to manipulate items in a component.",
    "lineNumber": 61,
    "interface": false
  },
  {
    "__docId__": 331,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#constructor",
    "access": "public",
    "description": "",
    "lineNumber": 92,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "options.host",
        "description": "The element that hosts the collection."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "options.itemTagName",
        "description": "The tag name of the elements that constitute a collection item."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "options.itemBaseTagName",
        "description": "The optional base tag name of the elements that constitute a collection item. This is required for elements that\nextend native elements, like Button."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "options.itemSelector",
        "description": "Optional, derived from itemTagName and itemBaseTagName by default. Used to query the host element for its\ncollection items."
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": true,
        "name": "options.container",
        "description": "Optional element that wraps the collection. Defines where the new items will be added when <code>add</code> method\nis called. Is the same as options.host by default."
      },
      {
        "nullable": null,
        "types": [
          "CollectionFilter"
        ],
        "spread": false,
        "optional": true,
        "name": "options.filter",
        "description": "Optional function used to filter the results."
      },
      {
        "nullable": null,
        "types": [
          "CollectionOnItemAdded"
        ],
        "spread": false,
        "optional": true,
        "name": "options.onItemAdded",
        "description": "Function called once an item is added to the DOM. If the Collection has been configured to handle the items\nautomatically, the callback will be called once the collection detects that the item has been added to the DOM and\nnot synchronously with <code>add()</code>."
      },
      {
        "nullable": null,
        "types": [
          "CollectionOnItemRemoved"
        ],
        "spread": false,
        "optional": true,
        "name": "options.onItemRemoved",
        "description": "Function called once an item is removed from the DOM. If the Collection has been configured to handle the items\nautomatically, the callback will be called once the collection detects that the item has been removed from the DOM\nnot synchronously with <code>add()</code>."
      },
      {
        "nullable": null,
        "types": [
          "CollectionOnChange"
        ],
        "spread": false,
        "optional": true,
        "name": "options.onCollectionChange",
        "description": "Function called after there has been a change in the collection. This allows components to handle state changes\nafter an item(s) has been added or removed. This callback will only be called if the Collection is configured to\nhandle the items automatically.\nis <code>true</code>."
      }
    ]
  },
  {
    "__docId__": 332,
    "kind": "member",
    "name": "_id",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_id",
    "access": "private",
    "description": null,
    "lineNumber": 96,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 333,
    "kind": "member",
    "name": "_host",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_host",
    "access": "private",
    "description": null,
    "lineNumber": 98,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 334,
    "kind": "member",
    "name": "_itemTagName",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_itemTagName",
    "access": "private",
    "description": null,
    "lineNumber": 99,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 335,
    "kind": "member",
    "name": "_itemBaseTagName",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_itemBaseTagName",
    "access": "private",
    "description": null,
    "lineNumber": 100,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 336,
    "kind": "member",
    "name": "_itemTagNameFilter",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_itemTagNameFilter",
    "access": "private",
    "description": null,
    "lineNumber": 102,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 339,
    "kind": "member",
    "name": "_itemSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_itemSelector",
    "access": "private",
    "description": null,
    "lineNumber": 106,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 340,
    "kind": "member",
    "name": "_container",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_container",
    "access": "private",
    "description": null,
    "lineNumber": 109,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 341,
    "kind": "member",
    "name": "_filter",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_filter",
    "access": "private",
    "description": null,
    "lineNumber": 110,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 342,
    "kind": "member",
    "name": "_onlyHandleChildren",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onlyHandleChildren",
    "access": "private",
    "description": null,
    "lineNumber": 112,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 343,
    "kind": "member",
    "name": "_handleItems",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_handleItems",
    "access": "private",
    "description": null,
    "lineNumber": 115,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 344,
    "kind": "member",
    "name": "_allItemsSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_allItemsSelector",
    "access": "private",
    "description": null,
    "lineNumber": 122,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 346,
    "kind": "member",
    "name": "_useItemTagName",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_useItemTagName",
    "access": "private",
    "description": null,
    "lineNumber": 128,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 348,
    "kind": "member",
    "name": "_liveCollection",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_liveCollection",
    "access": "private",
    "description": null,
    "lineNumber": 137,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 350,
    "kind": "member",
    "name": "_onItemAdded",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onItemAdded",
    "access": "private",
    "description": null,
    "lineNumber": 142,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 351,
    "kind": "member",
    "name": "_onItemRemoved",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onItemRemoved",
    "access": "private",
    "description": null,
    "lineNumber": 143,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 352,
    "kind": "member",
    "name": "_onCollectionChange",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onCollectionChange",
    "access": "private",
    "description": null,
    "lineNumber": 144,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 353,
    "kind": "member",
    "name": "length",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#length",
    "access": "public",
    "description": "Number of items inside the Collection.\n<ul><li><code>0</code> by default.</li></ul>",
    "lineNumber": 153,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "0"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 354,
    "kind": "method",
    "name": "add",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#add",
    "access": "public",
    "description": "Adds an item to the Collection. The item can be either a <code>HTMLElement</code> or an Object with the item\nproperties. If the index is not provided the element appended to the end. If <code>options.onItemAdded</code> was\nprovided, it will be called after the element is added from the DOM.",
    "lineNumber": 172,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement} the item added."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement",
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item to add to the Collection."
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": true,
        "name": "insertBefore",
        "description": "Existing item used as a reference to insert the new item before. If the value is <code>null</code>, then the new\nitem will be added at the end."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the item added."
    },
    "emits": [
      {
        "types": [
          "coral-collection:add"
        ],
        "description": ""
      }
    ]
  },
  {
    "__docId__": 355,
    "kind": "method",
    "name": "clear",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#clear",
    "access": "public",
    "description": "Removes all the items from the Collection.",
    "lineNumber": 203,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array.<HTMLElement>} an Array with all the removed items."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array.<HTMLElement>"
      ],
      "spread": false,
      "description": "an Array with all the removed items."
    },
    "params": []
  },
  {
    "__docId__": 356,
    "kind": "method",
    "name": "getAll",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#getAll",
    "access": "public",
    "description": "Returns an array with all the items inside the Collection. Each element is of type <code>HTMLElement</code>.",
    "lineNumber": 220,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array.<HTMLElement>} an Array with all the items inside the collection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array.<HTMLElement>"
      ],
      "spread": false,
      "description": "an Array with all the items inside the collection."
    },
    "params": []
  },
  {
    "__docId__": 357,
    "kind": "method",
    "name": "remove",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#remove",
    "access": "public",
    "description": "Removes the given item from the Collection. If <code>options.onItemRemoved</code> was provided, it will be called\nafter the element is removed from the DOM.",
    "lineNumber": 250,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement} the item removed."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item to add to the Collection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the item removed."
    },
    "emits": [
      {
        "types": [
          "coral-collection:remove"
        ],
        "description": ""
      }
    ]
  },
  {
    "__docId__": 358,
    "kind": "method",
    "name": "first",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#first",
    "access": "public",
    "description": "Returns the first item of the collection.",
    "lineNumber": 268,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{?HTMLElement} the first item of the collection."
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the first item of the collection."
    },
    "params": []
  },
  {
    "__docId__": 359,
    "kind": "method",
    "name": "last",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#last",
    "access": "public",
    "description": "Returns the last item of the collection.",
    "lineNumber": 278,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{?HTMLElement} the last item of the collection."
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "the last item of the collection."
    },
    "params": []
  },
  {
    "__docId__": 360,
    "kind": "method",
    "name": "_isPartOfCollection",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_isPartOfCollection",
    "access": "protected",
    "description": "Checks if the given Node belongs to the current collection. It is said that a Node belongs to a given collection\nif it passes <code>options.filter</code> and it matches <code>options.itemSelector</code>.",
    "lineNumber": 295,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} true if the node is part of the collection, otherwise false."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Node"
        ],
        "spread": false,
        "optional": false,
        "name": "node",
        "description": "The node to check if it belongs to the collection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "true if the node is part of the collection, otherwise false."
    },
    "ignore": true
  },
  {
    "__docId__": 361,
    "kind": "method",
    "name": "_onItemAttached",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onItemAttached",
    "access": "protected",
    "description": "Handles the attachment of an item to the collection. It triggers automatically the collection event.",
    "lineNumber": 316,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item that was attached to the collection."
      }
    ],
    "emits": [
      {
        "types": [
          "coral-collection:add"
        ],
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 362,
    "kind": "method",
    "name": "_onItemDetached",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onItemDetached",
    "access": "protected",
    "description": "Handles the detachment of a item to the collection. It triggers automatically the collection event.",
    "lineNumber": 336,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item that was detached of the collection"
      }
    ],
    "emits": [
      {
        "types": [
          "coral-collection:remove"
        ],
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 363,
    "kind": "method",
    "name": "_onCollectionMutation",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_onCollectionMutation",
    "access": "protected",
    "description": "Handles the collection changes. It automatically triggers the collection change event.",
    "lineNumber": 353,
    "params": [
      {
        "nullable": null,
        "types": [
          "Array<HTMLElement>"
        ],
        "spread": false,
        "optional": false,
        "name": "addedNodes",
        "description": "The items that was added to the collection"
      },
      {
        "nullable": null,
        "types": [
          "Array<HTMLElement>"
        ],
        "spread": false,
        "optional": false,
        "name": "removedNodes",
        "description": "The items that was removed from the collection"
      }
    ],
    "emits": [
      {
        "types": [
          "coral-collection:change"
        ],
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 364,
    "kind": "method",
    "name": "_startHandlingItems",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_startHandlingItems",
    "access": "protected",
    "description": "Enables the automatic detection of collection items. The collection will take care of triggering the appropriate\ncollection event when an item is added or removed, as well the related callbacks. Components can decide to skip the\ninitialization of the starting items by providing <code>skipInitialItems</code> as <code>false</code>.",
    "lineNumber": 377,
    "params": [
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "false",
        "defaultRaw": false,
        "name": "skipInitialItems",
        "description": "If <code>true</code>, <code>onItemAdded</code> will be called for every starting item. A collection event will not\nbe triggered for these items."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 365,
    "kind": "member",
    "name": "_observer",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_observer",
    "access": "private",
    "description": null,
    "lineNumber": 381,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 367,
    "kind": "method",
    "name": "_stopHandlingItems",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_stopHandlingItems",
    "access": "protected",
    "description": "Stops handling the items.",
    "lineNumber": 434,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 368,
    "kind": "method",
    "name": "_handleMutation",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection#_handleMutation",
    "access": "protected",
    "description": "Handles every time that an element is added or removed from the <code>options.container</code>. By default the\ncollection events will be triggered. If <code>options.onItemAdded</code> or <code>options.onItemRemoved</code> were\nprovided, they will be called where it applies.",
    "lineNumber": 450,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "Array.<Object>",
        "description": "mutations\nArray that contains the <code>MutationRecord> relevant to every registered mutation."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 369,
    "kind": "typedef",
    "name": "coral-collection:add",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.coral-collection:add",
    "access": "public",
    "description": "Triggered when an item is added to the {@link Collection}. {@link Collection} events are not synchronous so the DOM\nmay reflect a different reality although every addition or removal will be reported.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The item that was added."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-collection:add"
    }
  },
  {
    "__docId__": 370,
    "kind": "typedef",
    "name": "coral-collection:remove",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.coral-collection:remove",
    "access": "public",
    "description": "Triggered when an item is removed from a {@link Collection}. {@link Collection} events are not synchronous so the DOM\nmay reflect a different reality although every addition or removal will be reported.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The item that was removed."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-collection:remove"
    }
  },
  {
    "__docId__": 371,
    "kind": "typedef",
    "name": "CollectionFilter",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.CollectionFilter",
    "access": "public",
    "description": "Signature of the function called to determine if an element should be included in the {@link Collection}. If the function\nreturns <code>true</code> for the given element it will be part of the collection, otherwise it will be excluded.",
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} true if should be part of the collection, otherwise false."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The item to check whether it should be part of the collection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "true if should be part of the collection, otherwise false."
    },
    "type": {
      "types": [
        "function"
      ],
      "optional": false,
      "name": "CollectionFilter"
    }
  },
  {
    "__docId__": 372,
    "kind": "typedef",
    "name": "CollectionOnItemAdded",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.CollectionOnItemAdded",
    "access": "public",
    "description": "Signature of the function called when ever an item is added to the {@link Collection}.",
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item that was added to the collection."
      }
    ],
    "type": {
      "types": [
        "function"
      ],
      "optional": false,
      "name": "CollectionOnItemAdded"
    }
  },
  {
    "__docId__": 373,
    "kind": "typedef",
    "name": "CollectionOnItemRemoved",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.CollectionOnItemRemoved",
    "access": "public",
    "description": "Signature of the function called when ever an item is removed from the {@link Collection}.",
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The item that was added to the collection."
      }
    ],
    "type": {
      "types": [
        "function"
      ],
      "optional": false,
      "name": "CollectionOnItemRemoved"
    }
  },
  {
    "__docId__": 374,
    "kind": "typedef",
    "name": "CollectionOnChange",
    "memberof": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection.CollectionOnChange",
    "access": "public",
    "description": "Signature of the function called when there is a change in the {@link Collection}. The items that where added and removed\nwill be provided.",
    "params": [
      {
        "nullable": null,
        "types": [
          "Array.<HTMLElement>"
        ],
        "spread": false,
        "optional": false,
        "name": "addedNodes",
        "description": "An array that contains the items that were added to the collection."
      },
      {
        "nullable": null,
        "types": [
          "Array.<HTMLElement>"
        ],
        "spread": false,
        "optional": false,
        "name": "removedNodes",
        "description": "An array that contains the items that were removed from the collection."
      }
    ],
    "type": {
      "types": [
        "function"
      ],
      "optional": false,
      "name": "CollectionOnChange"
    }
  },
  {
    "__docId__": 375,
    "kind": "file",
    "name": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\nimport Collection from './Collection';\nimport listToArray from './listToArray';\n\n/**\n Collection capable of handling non-nested items with a selected attribute. It is useful to manage the\n internal state of selection. It currently does not support options.filter for the selection related functions.\n */\nclass SelectableCollection extends Collection {\n  constructor(options) {\n    super(options);\n\n    if (this._filter) {\n      commons._log('warn', 'Coral.SelectableCollection does not support the options.filter');\n    }\n\n    // disabled items will not be a selection candicate although hidden items might\n    this._selectableItemSelector = this._allItemsSelector.split(',').map(selector => `${selector}:not([disabled])`).join(',');\n    this._selectedItemSelector = this._allItemsSelector.split(',').map(selector => `${selector}[selected]`).join(',');\n    this._deselectAllExceptSelector = this._selectedItemSelector;\n  }\n\n  /**\n   Returns the selectable items. Items that are disabled quality for selection. On the other hand, hidden items\n   can be selected as this is the default behavior in HTML. Please note that an already selected item could be\n   returned, since the selection could be toggled.\n\n   @returns {Array.<HTMLElement>}\n   an array of items whose selection could be toggled.\n\n   @protected\n   */\n  _getSelectableItems() {\n    return Array.from(this._container.querySelectorAll(this._selectableItemSelector));\n  }\n\n  /**\n   Returns the first selectable item. Items that are disabled quality for selection. On the other hand, hidden items\n   can be selected as this is the default behavior in HTML. Please note that an already selected item could be\n   returned, since the selection could be toggled.\n\n   @returns {HTMLElement}\n   an item whose selection could be toggled.\n\n   @protected\n   */\n  _getFirstSelectable() {\n    return this._container.querySelector(this._selectableItemSelector) || null;\n  }\n\n  /**\n   Returns the last selectable item. Items that are disabled quality for selection. On the other hand, hidden items\n   can be selected as this is the default behavior in HTML. Please note that an already selected item could be\n   returned, since the selection could be toggled.\n\n   @returns {HTMLElement}\n   an item whose selection could be toggled.\n\n   @protected\n   */\n  _getLastSelectable() {\n    const items = this._container.querySelectorAll(this._selectableItemSelector);\n    return items[items.length - 1] || null;\n  }\n\n  /**\n   Returns the previous selectable item.\n\n   @param {HTMLElement} item\n   The reference item.\n\n   @returns {HTMLElement}\n   an item whose selection could be toggled.\n\n   @protected\n   */\n  _getPreviousSelectable(item) {\n    const items = this.getAll();\n    let index = items.indexOf(item);\n    let sibling = index > 0 ? items[index - 1] : null;\n\n    while (sibling) {\n      if (sibling.matches(this._selectableItemSelector)) {\n        break;\n      } else {\n        index--;\n        sibling = index > 0 ? items[index - 1] : null;\n      }\n    }\n\n    // in case the item is not specified, or it is not inside the collection, we need to return the first selectable\n    return sibling || (item.matches(this._selectableItemSelector) ? item : this._getFirstSelectable());\n  }\n\n  /**\n   Returns the next selectable item.\n\n   @param {HTMLElement} item\n   The reference item.\n\n   @returns {HTMLElement}\n   an item whose selection could be toggled.\n\n   @protected\n   */\n  _getNextSelectable(item) {\n    const items = this.getAll();\n    let index = items.indexOf(item);\n    let sibling = index < items.length - 1 ? items[index + 1] : null;\n\n    while (sibling) {\n      if (sibling.matches(this._selectableItemSelector)) {\n        break;\n      } else {\n        index++;\n        sibling = index < items.length - 1 ? items[index + 1] : null;\n      }\n    }\n\n    return sibling || item;\n  }\n\n  /**\n   Returns the first item that is selected in the Collection. It allows to configure the attribute used for selection\n   so that components that use 'selected' and 'active' can share the same implementation.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection.\n\n   @returns HTMLElement the first selected item.\n\n   @protected\n   */\n  _getFirstSelected(selectedAttribute) {\n    let selector = this._selectedItemSelector;\n\n    if (typeof selectedAttribute === 'string') {\n      selector = selector.replace('[selected]', `[${selectedAttribute}]`);\n    }\n\n    return this._container.querySelector(selector) || null;\n  }\n\n  /**\n   Returns the last item that is selected in the Collection. It allows to configure the attribute used for selection\n   so that components that use 'selected' and 'active' can share the same implementation.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection.\n\n   @returns HTMLElment the last selected item.\n\n   @protected\n   */\n  _getLastSelected(selectedAttribute) {\n    let selector = this._selectedItemSelector;\n\n    if (typeof selectedAttribute === 'string') {\n      selector = selector.replace('[selected]', `[${selectedAttribute}]`);\n    }\n\n    // last-of-type did not work so we need to query all\n    const items = this._container.querySelectorAll(selector);\n    return items[items.length - 1] || null;\n  }\n\n  /**\n   Returns an array that contains all the items that are selected.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection.\n\n   @protected\n\n   @returns Array.<HTMLElement> an array with all the selected items.\n   */\n  _getAllSelected(selectedAttribute) {\n    let selector = this._selectedItemSelector;\n\n    if (typeof selectedAttribute === 'string') {\n      selector = selector.replace('[selected]', `[${selectedAttribute}]`);\n    }\n    return Array.from(this._container.querySelectorAll(selector));\n  }\n\n  /**\n   Deselects all the items except the first selected item in the Collection. By default the <code>selected</code>\n   attribute will be removed. The attribute to remove is configurable via the <code>selectedAttribute</code> parameter.\n   The selected attribute will be removed no matter if the item is <code>disabled</code> or <code>hidden</code>.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection. This attribute will be removed from the matching elements.\n\n   @protected\n   */\n  _deselectAllExceptFirst(selectedAttribute) {\n    let selector = this._deselectAllExceptSelector;\n    const attributeToRemove = selectedAttribute || 'selected';\n\n    if (typeof selectedAttribute === 'string') {\n      selector = selector.replace('[selected]', `[${selectedAttribute}]`);\n    }\n\n    // we select all the selected attributes except the last one\n    const items = this._container.querySelectorAll(selector);\n    const itemsCount = items.length;\n\n    // ignores the first item of the list, everything else is deselected\n    for (let i = 1 ; i < itemsCount ; i++) {\n      // we use remoteAttribute since we do not know if the element is upgraded\n      items[i].removeAttribute(attributeToRemove);\n    }\n  }\n\n  /**\n   Deselects all the items except the last selected item in the Collecton. By default the <code>selected</code>\n   attribute will be removed. The attribute to remove is configurable via the <code>selectedAttribute</code> parameter.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection. This attribute will be removed from the matching elements.\n\n   @protected\n   */\n  _deselectAllExceptLast(selectedAttribute) {\n    let selector = this._deselectAllExceptSelector;\n    const attributeToRemove = selectedAttribute || 'selected';\n\n    if (typeof selectedAttribute === 'string') {\n      selector = selector.replace('[selected]', `[${selectedAttribute}]`);\n    }\n\n    // we query for all matching items with the given attribute\n    const items = this._container.querySelectorAll(selector);\n    // we ignore the last item\n    const itemsCount = items.length - 1;\n\n    for (let i = 0 ; i < itemsCount ; i++) {\n      // we use remoteAttribute since we do not know if the element is upgraded\n      items[i].removeAttribute(attributeToRemove);\n    }\n  }\n\n  /**\n   Deselects all the items except the given item. The provided attribute will be remove from all matching items. By\n   default the <code>selected</code> attribute will be removed. The attribute to remove is configurable via the\n   <code>selectedAttribute</code> parameter.\n\n   @name Coral.SelectableCollection#_deselectAllExcept\n   @function\n\n   @param {HTMLElement} [itemOrSelectedAttribute]\n   The item to keep selected. If the item is not provided, all elements will be deselected.\n\n   @param {String} [selectedAttribute=selected]\n   the attribute that will be used to check for selection. This attribute will be removed from the matching elements.\n\n   @protected\n   */\n  _deselectAllExcept(itemOrSelectedAttribute, selectedAttribute) {\n    // if no selectedAttribute we use the unmodified selector as default\n    let selector = this._deselectAllExceptSelector;\n\n    let item;\n    let attributeToRemove;\n    // an item was not provided so we use it as 'selectedAttribute'\n    if (typeof itemOrSelectedAttribute === 'string') {\n      item = null;\n      attributeToRemove = itemOrSelectedAttribute || 'selected';\n      selector = selector.replace('[selected]', `[${attributeToRemove}]`);\n    } else {\n      item = itemOrSelectedAttribute;\n      attributeToRemove = selectedAttribute || 'selected';\n\n      if (typeof selectedAttribute === 'string') {\n        selector = selector.replace('[selected]', `[${attributeToRemove}]`);\n      }\n    }\n\n    // we query for all matching items with the given attribute\n    const items = this._container.querySelectorAll(selector);\n    const itemsCount = items.length;\n\n    for (let i = 0 ; i < itemsCount ; i++) {\n      // we use remoteAttribute since we do not know if the element is upgraded\n      if (item !== items[i]) {\n        items[i].removeAttribute(attributeToRemove);\n      }\n    }\n  }\n}\n\nexport default SelectableCollection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-collection/src/scripts/SelectableCollection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 376,
    "kind": "class",
    "name": "SelectableCollection",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SelectableCollection}",
    "description": "Collection capable of handling non-nested items with a selected attribute. It is useful to manage the\ninternal state of selection. It currently does not support options.filter for the selection related functions.",
    "lineNumber": 21,
    "interface": false,
    "extends": [
      "coral-spectrum/coral-collection/src/scripts/Collection.js~Collection"
    ]
  },
  {
    "__docId__": 377,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 22,
    "undocument": true
  },
  {
    "__docId__": 378,
    "kind": "member",
    "name": "_selectableItemSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_selectableItemSelector",
    "access": "private",
    "description": null,
    "lineNumber": 30,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 379,
    "kind": "member",
    "name": "_selectedItemSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_selectedItemSelector",
    "access": "private",
    "description": null,
    "lineNumber": 31,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 380,
    "kind": "member",
    "name": "_deselectAllExceptSelector",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_deselectAllExceptSelector",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 381,
    "kind": "method",
    "name": "_getSelectableItems",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getSelectableItems",
    "access": "protected",
    "description": "Returns the selectable items. Items that are disabled quality for selection. On the other hand, hidden items\ncan be selected as this is the default behavior in HTML. Please note that an already selected item could be\nreturned, since the selection could be toggled.",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array.<HTMLElement>}\nan array of items whose selection could be toggled."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array.<HTMLElement>"
      ],
      "spread": false,
      "description": "an array of items whose selection could be toggled."
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 382,
    "kind": "method",
    "name": "_getFirstSelectable",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getFirstSelectable",
    "access": "protected",
    "description": "Returns the first selectable item. Items that are disabled quality for selection. On the other hand, hidden items\ncan be selected as this is the default behavior in HTML. Please note that an already selected item could be\nreturned, since the selection could be toggled.",
    "lineNumber": 59,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nan item whose selection could be toggled."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "an item whose selection could be toggled."
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 383,
    "kind": "method",
    "name": "_getLastSelectable",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getLastSelectable",
    "access": "protected",
    "description": "Returns the last selectable item. Items that are disabled quality for selection. On the other hand, hidden items\ncan be selected as this is the default behavior in HTML. Please note that an already selected item could be\nreturned, since the selection could be toggled.",
    "lineNumber": 73,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nan item whose selection could be toggled."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "an item whose selection could be toggled."
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 384,
    "kind": "method",
    "name": "_getPreviousSelectable",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getPreviousSelectable",
    "access": "protected",
    "description": "Returns the previous selectable item.",
    "lineNumber": 89,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nan item whose selection could be toggled."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The reference item."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "an item whose selection could be toggled."
    },
    "ignore": true
  },
  {
    "__docId__": 385,
    "kind": "method",
    "name": "_getNextSelectable",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getNextSelectable",
    "access": "protected",
    "description": "Returns the next selectable item.",
    "lineNumber": 118,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nan item whose selection could be toggled."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "The reference item."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "an item whose selection could be toggled."
    },
    "ignore": true
  },
  {
    "__docId__": 386,
    "kind": "method",
    "name": "_getFirstSelected",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getFirstSelected",
    "access": "protected",
    "description": "Returns the first item that is selected in the Collection. It allows to configure the attribute used for selection\nso that components that use 'selected' and 'active' can share the same implementation.",
    "lineNumber": 146,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "HTMLElement the first selected item."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "HTMLElement the first selected item."
    },
    "ignore": true
  },
  {
    "__docId__": 387,
    "kind": "method",
    "name": "_getLastSelected",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getLastSelected",
    "access": "protected",
    "description": "Returns the last item that is selected in the Collection. It allows to configure the attribute used for selection\nso that components that use 'selected' and 'active' can share the same implementation.",
    "lineNumber": 167,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "HTMLElment the last selected item."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "HTMLElment the last selected item."
    },
    "ignore": true
  },
  {
    "__docId__": 388,
    "kind": "method",
    "name": "_getAllSelected",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_getAllSelected",
    "access": "protected",
    "description": "Returns an array that contains all the items that are selected.",
    "lineNumber": 189,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "Array.<HTMLElement> an array with all the selected items."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "Array.<HTMLElement> an array with all the selected items."
    },
    "ignore": true
  },
  {
    "__docId__": 389,
    "kind": "method",
    "name": "_deselectAllExceptFirst",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_deselectAllExceptFirst",
    "access": "protected",
    "description": "Deselects all the items except the first selected item in the Collection. By default the <code>selected</code>\nattribute will be removed. The attribute to remove is configurable via the <code>selectedAttribute</code> parameter.\nThe selected attribute will be removed no matter if the item is <code>disabled</code> or <code>hidden</code>.",
    "lineNumber": 208,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection. This attribute will be removed from the matching elements."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 390,
    "kind": "method",
    "name": "_deselectAllExceptLast",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_deselectAllExceptLast",
    "access": "protected",
    "description": "Deselects all the items except the last selected item in the Collecton. By default the <code>selected</code>\nattribute will be removed. The attribute to remove is configurable via the <code>selectedAttribute</code> parameter.",
    "lineNumber": 236,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection. This attribute will be removed from the matching elements."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 391,
    "kind": "method",
    "name": "_deselectAllExcept",
    "memberof": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-collection/src/scripts/SelectableCollection.js~SelectableCollection#_deselectAllExcept",
    "access": "protected",
    "description": "Deselects all the items except the given item. The provided attribute will be remove from all matching items. By\ndefault the <code>selected</code> attribute will be removed. The attribute to remove is configurable via the\n<code>selectedAttribute</code> parameter.",
    "lineNumber": 271,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": true,
        "name": "itemOrSelectedAttribute",
        "description": "The item to keep selected. If the item is not provided, all elements will be deselected."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "selected",
        "defaultRaw": "selected",
        "name": "selectedAttribute",
        "description": "the attribute that will be used to check for selection. This attribute will be removed from the matching elements."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 392,
    "kind": "file",
    "name": "coral-spectrum/coral-collection/src/scripts/listToArray.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/** @private */\nexport default function listToArray(list) {\n  const res = [];\n  for (let i = 0, listCount = res.length = list.length ; i < listCount ; i++) {\n    res[i] = list[i];\n  }\n  return res;\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-collection/src/scripts/listToArray.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 393,
    "kind": "function",
    "name": "listToArray",
    "memberof": "coral-spectrum/coral-collection/src/scripts/listToArray.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-collection/src/scripts/listToArray.js~listToArray",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{listToArray}",
    "description": null,
    "lineNumber": 14,
    "ignore": true,
    "params": [
      {
        "name": "list",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 394,
    "kind": "file",
    "name": "coral-spectrum/coral-compat/src/scripts/CustomElements.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/* eslint-disable-next-line no-empty-function */\nconst f = () => {\n};\n\n// Mostly empty functions to avoid breaking code\nif (!window.CustomElements) {\n  window.CustomElements = {\n    flags: {}\n  };\n  window.CustomElements.upgrade = f;\n  window.CustomElements.upgradeAll = f;\n  window.CustomElements.instanceof = (el, ins) => el instanceof ins;\n  window.CustomElements.upgradeDocumentTree = f;\n  window.CustomElements.upgradeSubtree = f;\n  window.CustomElements.addModule = f;\n  window.CustomElements.initializeModules = f;\n  window.CustomElements.takeRecords = f;\n  window.CustomElements.takeRecords = f;\n  window.CustomElements.watchShadow = f;\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-compat/src/scripts/CustomElements.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 395,
    "kind": "function",
    "name": "f",
    "memberof": "coral-spectrum/coral-compat/src/scripts/CustomElements.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-compat/src/scripts/CustomElements.js~f",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Copyright 2019 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 14,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 396,
    "kind": "file",
    "name": "coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Patch to be able to use document.createElement(tagName, customElement) from custom elements v0\nconst documentCreateElement = document.createElement;\ndocument.createElement = function createElement() {\n  if (typeof arguments[1] === 'string') {\n    arguments[1] = {is: arguments[1]};\n  }\n  return documentCreateElement.apply(this, arguments);\n};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 397,
    "kind": "variable",
    "name": "documentCreateElement",
    "memberof": "coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js",
    "static": true,
    "longname": "coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js~documentCreateElement",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Copyright 2019 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 14,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 398,
    "kind": "function",
    "name": "createElement",
    "memberof": "coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-compat/src/scripts/document.createElement-patch.js~createElement",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 399,
    "kind": "file",
    "name": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate, Keys} from '../../../coral-utils';\n\n// Key codes\nconst PAGE_UP = 33;\nconst PAGE_DOWN = 34;\nconst LEFT_ARROW = 37;\nconst UP_ARROW = 38;\n\n/**\n Enumeration for {@link Accordion} variants.\n\n @typedef {Object} AccordionVariantEnum\n\n @property {String} DEFAULT\n Default look and feel.\n @property {String} QUIET\n Not supported. Falls back to DEFAULT.\n @property {String} LARGE\n Not supported. Falls back to DEFAULT.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet',\n  LARGE: 'large'\n};\n\n// the accordions's base classname\nconst CLASSNAME = '_coral-Accordion';\n\n/**\n @class Coral.Accordion\n @classdesc An Accordion component consisting of multiple collapsible items.\n @htmltag coral-accordion\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Accordion = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      'click coral-accordion-item:not([disabled]) ._coral-Accordion-itemHeader': '_onItemClick',\n\n      'key:space ._coral-Accordion-itemHeader': '_onToggleItemKey',\n      'key:return ._coral-Accordion-itemHeader': '_onToggleItemKey',\n      'key:pageup ._coral-Accordion-itemHeader': '_focusPreviousItem',\n      'key:left ._coral-Accordion-itemHeader': '_focusPreviousItem',\n      'key:up ._coral-Accordion-itemHeader': '_focusPreviousItem',\n      'key:pagedown ._coral-Accordion-itemHeader': '_focusNextItem',\n      'key:right ._coral-Accordion-itemHeader': '_focusNextItem',\n      'key:down ._coral-Accordion-itemHeader': '_focusNextItem',\n      'key:home ._coral-Accordion-itemHeader': '_onHomeKey',\n      'key:end ._coral-Accordion-itemHeader': '_onEndKey',\n      'keydown ._coral-Accordion-itemHeader': '_onItemContentKeyDown',\n\n      // private\n      'coral-accordion-item:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    // Used for eventing\n    this._oldSelection = [];\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Accordion's variant. See {@link AccordionVariantEnum}.\n\n   @type {String}\n   @default AccordionVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-accordion-item',\n        // allows accordions to be nested\n        itemSelector: ':scope > coral-accordion-item',\n        onlyHandleChildren: true,\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Indicates whether the accordion accepts multiple selected items.\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this._validateSelection();\n  }\n\n  /**\n   Returns an Array containing the set selected items.\n   @type {Array.<AccordionItem>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Returns the first selected item in the Accordion. The value <code>null</code> is returned if no element is\n   selected.\n   @type {AccordionItem}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected();\n  }\n\n  /**\n   The heading level for Accordion items within the Accordion\n\n   @type {Number}\n   @default 3\n   @htmlattribute level\n   @htmlattributereflected\n   */\n  get level() {\n    return this._level || 3;\n  }\n\n  set level(value) {\n    value = transform.number(value);\n    if (validate.valueMustChange(value, this._level) && value > 0 && value < 7) {\n      this._level = value;\n      this._reflectAttribute('level', this._level);\n      this.items.getAll().forEach(item => item.setAttribute('level', this._level));\n    }\n  }\n\n  /** @private **/\n  get _tabTarget() {\n    return this.__tabTarget || null;\n  }\n\n  set _tabTarget(value) {\n    this.__tabTarget = value;\n\n    // Set all but the current set _tabTarget to not be a tab target:\n    this.items.getAll().forEach((item) => {\n      item._isTabTarget = item === value;\n    });\n  }\n\n  /** @private */\n  _onHomeKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusItem(this.items._getFirstSelectable());\n  }\n\n  /** @private */\n  _onEndKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusItem(this.items._getLastSelectable());\n  }\n\n  /**\n   References:\n   http://www.w3.org/WAI/PF/aria-practices/#accordion &\n\n   Handlers for when focus is on an element inside of the panel:\n   http://test.cita.illinois.edu/aria/tabpanel/tabpanel2.php\n\n   @private\n   */\n  _onItemContentKeyDown(event) {\n    // Required since sometimes the value is a number\n    const key = parseFloat(event.keyCode);\n    const item = event.matchedTarget.parentNode;\n\n    switch (key) {\n      case UP_ARROW:\n      case LEFT_ARROW:\n        // Set focus on the tab button for the currently displayed tab.\n        if ((event.metaKey || event.ctrlKey) && Keys.filterInputs(event)) {\n          event.preventDefault();\n          event.stopPropagation();\n\n          this._focusItem(item);\n        }\n        break;\n      case PAGE_UP:\n        // Show the previous tab and set focus on its corresponding tab button. Shows the last tab in the panel if\n        // current tab is the first one.\n        if (event.metaKey || event.ctrlKey) {\n          event.preventDefault();\n          event.stopPropagation();\n\n          const prevItem = this.items._getPreviousSelectable(item);\n          this._toggleItemSelection(prevItem);\n          this._focusItem(prevItem);\n        }\n        break;\n      case PAGE_DOWN:\n        // Show the next tab and set focus on its corresponding tab button. Shows the first tab in the panel if current\n        // tab is the last one.\n        if (event.metaKey || event.ctrlKey) {\n          event.preventDefault();\n          event.stopPropagation();\n\n          const nextItem = this.items._getNextSelectable(item);\n          this._toggleItemSelection(nextItem);\n          this._focusItem(nextItem);\n        }\n        break;\n    }\n  }\n\n  /** @private */\n  _focusPreviousItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusItem(this.items._getPreviousSelectable(event.target.closest('coral-accordion-item')));\n  }\n\n  /** @private */\n  _focusNextItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusItem(this.items._getNextSelectable(event.target.closest('coral-accordion-item')));\n  }\n\n  /** @private */\n  _onItemClick(event) {\n    // Clickable elements included in an item header shouldn't automatically trigger the selection of that item\n    if (event.target.hasAttribute('coral-interactive') || event.target.closest('[coral-interactive]')) {\n      return;\n    }\n\n    // The click was performed on the header so we select the item (parentNode) the selection is toggled\n    const item = event.target.closest('coral-accordion-item');\n    if (item) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      this._toggleItemSelection(item);\n      this._focusItem(item);\n    }\n  }\n\n  /** @private */\n  _onToggleItemKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const item = event.target.closest('coral-accordion-item');\n    this._toggleItemSelection(item);\n    this._focusItem(item);\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.selectedItems;\n\n    if (!this.multiple) {\n      // Last selected item wins if multiple selection while not allowed\n      item = item || selectedItems[selectedItems.length - 1];\n\n      if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    }\n\n    // set items level appropriately\n    if (item && item.getAttribute('level') !== this.level) {\n      item.setAttribute('level', this.level);\n    }\n\n    this._resetTabTarget();\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItems = this.selectedItems;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && this._arraysAreDifferent(selectedItems, oldSelection)) {\n      // We differentiate whether multiple is on or off and return an array or HTMLElement respectively\n      if (this.multiple) {\n        this.trigger('coral-accordion:change', {\n          oldSelection: oldSelection,\n          selection: selectedItems\n        });\n      } else {\n        // Return all items if we just switched from multiple=true to multiple=false and we had >1 selected items\n        this.trigger('coral-accordion:change', {\n          oldSelection: oldSelection.length > 1 ? oldSelection : oldSelection[0] || null,\n          selection: selectedItems[0] || null\n        });\n      }\n\n      this._oldSelection = selectedItems;\n    }\n  }\n\n  /** @private */\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  /**\n   Determine what item should get focus (if any) when the user tries to tab into the accordion. This should be the\n   first selected panel, or the first selectable panel otherwise. When neither is available, to Accordion cannot be\n   tabbed into.\n\n   @private\n   */\n  _resetTabTarget() {\n    if (!this._resetTabTargetScheduled) {\n      this._resetTabTargetScheduled = true;\n\n      window.requestAnimationFrame(() => {\n        this._resetTabTargetScheduled = false;\n\n        // since hidden items cannot have focus, we need to make sure the tabTarget is not hidden\n        const selectedItems = this.items._getAllSelected();\n\n        this._tabTarget = selectedItems.length ? selectedItems[0] : this.items._getFirstSelectable();\n      });\n    }\n  }\n\n  /** @private */\n  _toggleItemSelection(item) {\n    if (item) {\n      item[item.hasAttribute('selected') ? 'removeAttribute' : 'setAttribute']('selected', '');\n    }\n  }\n\n  /** @private */\n  _focusItem(item) {\n    if (item) {\n      item._elements.button.focus();\n    }\n\n    this._tabTarget = item;\n  }\n\n  /**\n   Returns {@link Accordion} variants.\n\n   @return {AccordionVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'multiple', 'level']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // WAI-ARIA 1.1\n    this.setAttribute('role', 'region');\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItems;\n\n    // Don't trigger animations on rendering\n    window.requestAnimationFrame(() => {\n      this.classList.add(`${CLASSNAME}--animated`);\n    });\n  }\n\n  /**\n   Triggered when {@link Accordion} selected item has changed.\n\n   @typedef {CustomEvent} coral-accordion:change\n\n   @property {AccordionItem} detail.oldSelection\n   The prior selected item(s).\n   @property {AccordionItem} detail.selection\n   The newly selected item(s).\n   */\n});\n\nexport default Accordion;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 400,
    "kind": "variable",
    "name": "PAGE_UP",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~PAGE_UP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 401,
    "kind": "variable",
    "name": "PAGE_DOWN",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~PAGE_DOWN",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 402,
    "kind": "variable",
    "name": "LEFT_ARROW",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~LEFT_ARROW",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 403,
    "kind": "variable",
    "name": "UP_ARROW",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~UP_ARROW",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 404,
    "kind": "typedef",
    "name": "AccordionVariantEnum",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~AccordionVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Accordion} variants.",
    "lineNumber": 36,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Default look and feel."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "Not supported. Falls back to DEFAULT."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "Not supported. Falls back to DEFAULT."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AccordionVariantEnum"
    }
  },
  {
    "__docId__": 405,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 406,
    "kind": "variable",
    "name": "Accordion",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~Accordion",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Accordion}",
    "description": "An Accordion component consisting of multiple collapsible items.",
    "lineNumber": 52,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Accordion"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An Accordion component consisting of multiple collapsible items."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-accordion"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-accordion></coral-accordion>",
      "<caption>JS constructor</caption>\nnew Coral.Accordion();"
    ],
    "see": [
      "../examples/#accordion"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 407,
    "kind": "typedef",
    "name": "coral-accordion:change",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/Accordion.js~coral-accordion:change",
    "access": "public",
    "description": "Triggered when {@link Accordion} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "AccordionItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected item(s)."
      },
      {
        "nullable": null,
        "types": [
          "AccordionItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected item(s)."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-accordion:change"
    }
  },
  {
    "__docId__": 408,
    "kind": "file",
    "name": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport base from '../templates/base';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Icon} from '../../../coral-component-icon';\n\nconst CLASSNAME = '_coral-Accordion-item';\n\n/**\n @class Coral.Accordion.Item\n @classdesc A Accordion item component\n @htmltag coral-accordion-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst AccordionItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Create or fetch the content zones\n      label: this.querySelector('coral-accordion-item-label') || document.createElement('coral-accordion-item-label'),\n      content: this.querySelector('coral-accordion-item-content') || document.createElement('coral-accordion-item-content')\n    };\n\n    base.call(this._elements, {Icon});\n  }\n\n  /**\n   The label of this accordion item.\n\n   @type {AccordionItemLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-accordion-item-label',\n      insert: function (label) {\n        this._setAria(this._elements.button, this._elements.content);\n\n        this._elements.button.appendChild(label);\n      }\n    });\n  }\n\n  /**\n   The content of this accordion item.\n\n   @type {AccordionItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-accordion-item-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}Content`);\n\n        // WAI-ARIA 1.1\n        content.setAttribute('role', 'region');\n\n        this._setAria(this._elements.button, content);\n\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Whether the item is selected. If the item has an element with the `coral-interactive` attribute and is clicked,\n   then the toggling of the accordion item will not occur.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    let _value = transform.booleanAttr(value);\n    let _selected = this.hasAttribute('disabled') ? false : _value;\n\n    if(this._selected === _selected) {\n      return;\n    }\n\n    this._selected = _selected;\n    this._reflectAttribute('selected', this._selected);\n\n    // Read it before applying is-open which adds additional padding\n    const scrollHeight = this._elements.content.scrollHeight;\n\n    this.classList.toggle('is-open', this._selected);\n    this._elements.button.setAttribute('aria-expanded', this._selected);\n\n    if (!this._selected) {\n      this._elements.content.style.height = `${scrollHeight}px`;\n      // We read the offset height to force a reflow, this is needed to start the transition between absolute values\n      // https://blog.alexmaccaw.com/css-transitions under Redrawing\n      // eslint-disable-next-line no-unused-vars\n      const offsetHeight = this._elements.content.offsetHeight;\n    }\n\n    this._elements.content.style.height = this._selected ? `${scrollHeight}px` : '0';\n\n    if (this._selected) {\n      commons.transitionEnd(this._elements.content, () => {\n        this._elements.content.style.height = '';\n      });\n    }\n\n    if(!this._selected) {\n      this._elements.content.setAttribute('aria-hidden', 'true');\n      this._elements.content.style.visibility = 'hidden';\n    } else {\n      this._elements.content.setAttribute('aria-hidden', 'false');\n      this._elements.content.style.visibility = 'visible';\n    }\n\n    this.trigger('coral-accordion-item:_selectedchanged');\n  }\n\n  /**\n   Whether this item is disabled.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.button[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', '');\n\n    this.selected = this.selected;\n  }\n\n\n  /**\n   The heading level for the Accordion item\n\n   @type {Number}\n   @default 3\n   @htmlattribute level\n   @htmlattributereflected\n   */\n  get level() {\n    return this._level || 3;\n  }\n\n  set level(value) {\n    value = transform.number(value);\n    // If the value has changed,\n    if (!validate.valueMustChange(value, this._level)) {\n      return;\n    }\n    // and the value is greater than 0\n    if (value > 0) {\n      // set the value and reflect the attribute.\n      this._level = value;\n      this._reflectAttribute('level', this._level);\n\n      // If the new value is not equal to the default,\n      if (value !== 3) {\n        // override the aria-level on the h3 element.\n        this._elements.heading.setAttribute('aria-level', this._level);\n        return;\n      }\n    }\n\n    // If the value is the default or invalid, remove the aria-level override from the h3 element.\n    this._elements.heading.removeAttribute('aria-level');\n  }\n\n  /** @private **/\n  get _isTabTarget() {\n    return this.__isTabTarget || false;\n  }\n\n  set _isTabTarget(value) {\n    this.__isTabTarget = value;\n\n    if (this.disabled) {\n      this._elements.button.removeAttribute('tabindex');\n    } else {\n      this._elements.button.setAttribute('tabindex', '0');\n    }\n  }\n\n  _setAria(button, content) {\n    button.id = button.id || commons.getUID();\n    content.id = content.id || commons.getUID();\n\n    button.setAttribute('aria-controls', content.id);\n    content.setAttribute('aria-labelledby', button.id);\n  }\n\n  /**\n   Handles the focus of the item.\n\n   @ignore\n   */\n  focus() {\n    this._elements.label.focus();\n  }\n\n  get _contentZones() {\n    return {'coral-accordion-item-label': 'label', 'coral-accordion-item-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'level']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'presentation');\n\n    // Support cloneNode\n    const template = this.querySelector('._coral-Accordion-itemHeading');\n    if (template) {\n      template.remove();\n    }\n\n    // Move content into the content zone if not specified\n    if (!this._elements.content.parentNode) {\n      while (this.firstChild) {\n        this._elements.content.appendChild(this.firstChild);\n      }\n    }\n\n    this.appendChild(this._elements.heading);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = this._elements.label;\n    this.content = this._elements.content;\n\n    // Defaults\n    this.selected = this.selected;\n  }\n});\n\nexport default AccordionItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 409,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 410,
    "kind": "variable",
    "name": "AccordionItem",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItem.js~AccordionItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Accordion}",
    "description": "A Accordion item component",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Accordion.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Accordion item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-accordion-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-accordion-item></coral-accordion-item>",
      "<caption>JS constructor</caption>\nnew Coral.Accordion.Item();"
    ],
    "see": [
      "../examples/#accordion"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 411,
    "kind": "file",
    "name": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Accordion.Item.Content\n @classdesc Accordion item's content component\n @htmltag coral-accordion-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-accordion-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-accordion/src/scripts/AccordionItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 412,
    "kind": "function",
    "name": "AccordionItemContent",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemContent.js~AccordionItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Accordion}",
    "description": "Accordion item's content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Accordion.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Accordion item's content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-accordion-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-accordion-item-content></coral-accordion-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.Accordion.Item.Content();"
    ],
    "see": [
      "../examples/#accordion"
    ],
    "params": []
  },
  {
    "__docId__": 413,
    "kind": "file",
    "name": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Accordion.Item.Label\n @classdesc Accordion item's label component\n @htmltag coral-accordion-item-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-accordion-item-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-accordion/src/scripts/AccordionItemLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 414,
    "kind": "function",
    "name": "AccordionItemLabel",
    "memberof": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-accordion/src/scripts/AccordionItemLabel.js~AccordionItemLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Accordion}",
    "description": "Accordion item's label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Accordion.Item.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Accordion item's label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-accordion-item-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-accordion-item-label></coral-accordion-item-label>",
      "<caption>JS constructor</caption>\nnew Coral.Accordion.Item.Label();"
    ],
    "see": [
      "../examples/#accordion"
    ],
    "params": []
  },
  {
    "__docId__": 415,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport '../../../coral-component-popover';\nimport getFirstSelectableWrappedItem from './getFirstSelectableWrappedItem';\nimport {commons} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-ActionBar';\n\n/**\n @class Coral.ActionBar\n @classdesc An ActionBar component containing arbitrary items. An item can either be added to the left or the right side\n of the bar. All items that do not fit into the bar are hidden but still accessible.\n @htmltag coral-actionbar\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ActionBar = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      'key:up': '_onFocusPreviousItem',\n      'key:left': '_onFocusPreviousItem',\n      'key:down': '_onFocusNextItem',\n      'key:right': '_onFocusNextItem',\n      'global:resize': '_onResizeWindow'\n    });\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      primary: this.querySelector('coral-actionbar-primary') || document.createElement('coral-actionbar-primary'),\n      secondary: this.querySelector('coral-actionbar-secondary') || document.createElement('coral-actionbar-secondary')\n    };\n\n    // Reference on all items\n    this._items = this.getElementsByTagName('coral-actionbar-item');\n\n    // Debounce wait time in milliseconds\n    this._wait = 50;\n\n    // bind this._onLayout so it can be removed again\n    this._onLayout = this._onLayout.bind(this);\n    this._debounceOnLayout = this._debounceOnLayout.bind(this);\n\n    // use the smart strategy instead of re-rendering every frame\n    this._recalculateLayoutOnMutation();\n  }\n\n  /**\n   The primary (left) container of the ActionBar.\n\n   @type {ActionBarPrimary}\n   @contentzone\n   */\n  get primary() {\n    return this._getContentZone(this._elements.primary);\n  }\n\n  set primary(value) {\n    this._setContentZone('primary', value, {\n      handle: 'primary',\n      tagName: 'coral-actionbar-primary',\n      insert: function (content) {\n        // primary has to be before secondary if available\n        this.insertBefore(content, this.secondary);\n      }\n    });\n  }\n\n  /**\n   The secondary (right) container of the ActionBar.\n\n   @type {ActionBarSecondary}\n   @contentzone\n   */\n  get secondary() {\n    return this._getContentZone(this._elements.secondary);\n  }\n\n  set secondary(value) {\n    this._setContentZone('secondary', value, {\n      handle: 'secondary',\n      tagName: 'coral-actionbar-secondary',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /** @ignore */\n  _recalculateLayoutOnMutation() {\n    // recalculate layout on dom element size change + on dom mutation\n    // http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/\n\n    // relayout any time the dom changes\n    this._observer = new MutationObserver(() => {\n      this._debounceOnLayout();\n    });\n\n    // Watch for changes\n    this._observer.observe(this, {\n      attributes: true,\n      childList: true,\n      characterData: true,\n      subtree: true\n    });\n  }\n\n  /** @ignore */\n  _onFocusPreviousItem(event) {\n    // stops the page from scrolling\n    event.preventDefault();\n\n    const previousItem = this._getPreviousSelectableWrappedItem(event.target);\n    if (previousItem !== null) {\n      previousItem.focus();\n    }\n  }\n\n  /** @ignore */\n  _onFocusNextItem(event) {\n    // stops the page from scrolling\n    event.preventDefault();\n\n    const nextWrappedItem = this._getNextSelectableWrappedItem(event.target);\n    if (nextWrappedItem !== null) {\n      nextWrappedItem.focus();\n    }\n  }\n\n  /** @ignore */\n  _onResizeWindow() {\n    // just close all popovers for now when screen is resized\n    // there might be more popovers, then the 'more' popovers\n    const popovers = this.getElementsByTagName('coral-popover');\n    for (let i = 0 ; i < popovers.length ; i++) {\n      popovers[i].removeAttribute('open');\n    }\n\n    // force a relayout (needed especially if framerate during resize drops e.g.: in FF)\n    this._debounceOnLayout();\n  }\n\n  /** @ignore */\n  _onLayout() {\n    if (!this.primary || !this.primary._elements || !this.primary._elements.overlay ||\n      !this.secondary || !this.secondary._elements || !this.secondary._elements.overlay) {\n      // while containers are not cached or no items are rendered do nothing\n      return;\n    }\n\n    if (this.primary._elements.overlay.open === true || this.secondary._elements.overlay.open === true) {\n      // while popovers are open do not relayout\n      return;\n    }\n\n    const ERROR_MARGIN = 78;\n\n    const primaryMore = this.primary._elements.moreButton;\n    const secondaryMore = this.secondary._elements.moreButton;\n    const leftItems = this.primary.items.getAll();\n    const rightItems = this.secondary.items.getAll().reverse();\n    let itemLeft = null;\n    let itemRight = null;\n    const widthCache = this._newWidthCache();\n    const leftMoreButtonWidth = leftItems.length > 0 ? widthCache.getOuterWidth(primaryMore) : 0;\n    const rightMoreButtonWidth = rightItems.length > 0 ? widthCache.getOuterWidth(secondaryMore) : 0;\n\n    // Make it possible to set left/right padding to the containers\n    const borderWidthLeftContainer = this.primary.offsetWidth - this.primary.getBoundingClientRect().width;\n    const borderWidthRightContainer = this.secondary.offsetWidth - this.secondary.getBoundingClientRect().width;\n\n    const primaryLeftOffset = this.primary.offsetLeft;\n    const secondaryRightOffset = this.offsetWidth - (this.secondary.offsetLeft + this.secondary.offsetWidth);\n\n    let availableWidth = this.offsetWidth - primaryLeftOffset - secondaryRightOffset - leftMoreButtonWidth -\n      rightMoreButtonWidth - borderWidthLeftContainer - borderWidthRightContainer - ERROR_MARGIN;\n    let currentUsedWidth = 0;\n    let leftVisibleItems = 0;\n    let rightVisibleItems = 0;\n    let moreButtonLeftVisible = false;\n    let moreButtonRightVisible = false;\n    let showItem = false;\n    let itemWidth = 0;\n\n    for (let i = 0 ; i < leftItems.length || i < rightItems.length ; i++) {\n      itemLeft = i < leftItems.length ? leftItems[i] : null;\n      itemRight = i < rightItems.length ? rightItems[i] : null;\n\n      // first calculate visibility of left item\n      showItem = false;\n      if (itemLeft !== null) {\n        if (itemLeft.hidden || itemLeft.style.display === 'none') {\n          // item is hidden on purpose (we don't use it for layouting but do also not move offscreen) needed as it\n          // might already have been moved offscreen before\n          this._moveToScreen(itemLeft);\n        } else {\n          // if item is not hidden on purpose (hiding by actionBar due to space problems does not count) => layout\n          // element\n          if (!moreButtonLeftVisible && (this.primary.threshold <= 0 || leftVisibleItems < this.primary.threshold)) {\n            // if threshold is not reached so far\n            itemWidth = widthCache.getOuterWidth(itemLeft);\n\n            if (currentUsedWidth + itemWidth < availableWidth) {\n              // if there is still enough space to show another item\n              showItem = true;\n            } else if (leftVisibleItems === leftItems.length - 1 &&\n              currentUsedWidth + itemWidth < availableWidth + leftMoreButtonWidth\n            ) {\n              // if this is the last item and so far there have been no items hidden => don't show more button\n              showItem = true;\n            }\n          }\n\n          if (showItem) {\n            leftVisibleItems += 1;\n            currentUsedWidth += itemWidth;\n            this._moveToScreen(itemLeft);\n          } else {\n            this._hideItem(itemLeft);\n            moreButtonLeftVisible = true;\n          }\n\n          if (leftVisibleItems === leftItems.length) {\n            // left more button not needed => more free space available\n            availableWidth += leftMoreButtonWidth;\n            moreButtonLeftVisible = false;\n          }\n        }\n      }\n\n      // then calculate visibility of right item\n      showItem = false;\n      if (itemRight !== null) {\n        if (itemRight.hidden || itemRight.style.display === 'none') {\n          // item is hidden on purpose (we don't use it for layouting but do also not move offscreen) needed as it\n          // might already have been moved offscreen before\n          this._moveToScreen(itemRight);\n        } else {\n          // if item is not hidden on purpose (hiding by actionBar due to space problems does not count) => layout\n          // element\n          if (!moreButtonRightVisible && (this.secondary.threshold <= 0 || rightVisibleItems < this.secondary.threshold)) {\n            // if threshold is not reached so far\n            itemWidth = widthCache.getOuterWidth(itemRight);\n\n            if (currentUsedWidth + itemWidth < availableWidth) {\n              // if there is still enough space to show another item\n              showItem = true;\n            } else if (rightVisibleItems === rightItems.length - 1 &&\n              currentUsedWidth + itemWidth < availableWidth + rightMoreButtonWidth\n            ) {\n              // if this is the last item and so far there have been no items hidden => don't show more button\n              showItem = true;\n            }\n          }\n\n          if (showItem) {\n            rightVisibleItems += 1;\n            currentUsedWidth += itemWidth;\n            this._moveToScreen(itemRight);\n          } else {\n            this._hideItem(itemRight);\n            moreButtonRightVisible = true;\n          }\n\n          if (rightVisibleItems === rightItems.length) {\n            // left more button not needed => more free space available\n            availableWidth += rightMoreButtonWidth;\n            moreButtonRightVisible = false;\n          }\n        }\n      }\n    }\n\n    // Handle tabs\n    const primarySelectable = this.primary.items._getAllSelectable();\n    const secondarySelectable = this.secondary.items._getAllSelectable();\n    for (let i = 0 ; i < this._items.length ; i++) {\n      this._toggleItemTabbable(this._items[i], false);\n    }\n\n    // LEFT: Show or hide more buttons\n    if (moreButtonLeftVisible) {\n      this._moveToScreen(primaryMore, true);\n\n      if (primarySelectable.length === 0) {\n        this._toggleItemTabbable(primaryMore, true);\n      } else {\n        this._toggleItemTabbable(primaryMore, false);\n        this._toggleItemTabbable(primarySelectable[0], true);\n      }\n    } else {\n      this._moveToScreen(primaryMore, false);\n      this._toggleItemTabbable(primaryMore, false);\n      this._toggleItemTabbable(primarySelectable[0], true);\n    }\n\n    // RIGHT: Show or hide more buttons\n    if (moreButtonRightVisible) {\n      this._moveToScreen(secondaryMore, true);\n\n      if (secondarySelectable.length === 0) {\n        this._toggleItemTabbable(secondaryMore, true);\n      } else {\n        this._toggleItemTabbable(secondaryMore, false);\n        this._toggleItemTabbable(secondarySelectable[0], true);\n      }\n    } else {\n      this._moveToScreen(secondaryMore, false);\n      this._toggleItemTabbable(secondaryMore, false);\n\n      const tabbableItem = this.secondary.items._getAllSelectable()[0];\n      if (tabbableItem) {\n        this._toggleItemTabbable(tabbableItem, true);\n      }\n    }\n\n    // re-calculate layout on element resize\n    if (!this._resizeListenerAttached) {\n      commons.addResizeListener(this, this._debounceOnLayout);\n      commons.addResizeListener(this.primary, this._debounceOnLayout);\n      commons.addResizeListener(this.secondary, this._debounceOnLayout);\n\n      this._resizeListenerAttached = true;\n    }\n  }\n\n  /** @ignore */\n  _getNextSelectableWrappedItem(currentItem) {\n    if (currentItem.parentNode.tagName === 'CORAL-ACTIONBAR-ITEM') {\n      // currentItem is wrapped\n      currentItem = currentItem.parentNode;\n    }\n\n    const selectableItems = this._getAllSelectableItems(currentItem);\n    const length = selectableItems.length;\n    const index = selectableItems.indexOf(currentItem);\n\n    if (index >= 0 && length > index + 1) {\n      // if there is a next selectable element return it\n      return getFirstSelectableWrappedItem(selectableItems[index + 1]);\n    } else {\n      for (let i = 0 ; i < length ; i++) {\n        if (selectableItems[i].contains(currentItem) && length > i + 1) {\n          return getFirstSelectableWrappedItem(selectableItems[i + 1]);\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /** @ignore */\n  _getPreviousSelectableWrappedItem(currentItem) {\n    if (currentItem.parentNode.tagName === 'CORAL-ACTIONBAR-ITEM') {\n      // currentItem is wrapped\n      currentItem = currentItem.parentNode;\n    }\n\n    const selectableItems = this._getAllSelectableItems(currentItem);\n    const index = selectableItems.indexOf(currentItem);\n\n    if (index > 0) {\n      // if there is a previous selectable element return it\n      return getFirstSelectableWrappedItem(selectableItems[index - 1]);\n    } else {\n      for (let i = 1 ; i < selectableItems.length ; i++) {\n        if (selectableItems[i].contains(currentItem)) {\n          return getFirstSelectableWrappedItem(selectableItems[i - 1]);\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /** @ignore */\n  _getAllSelectableItems(currentItem) {\n    let selectableItems = [];\n\n    if (this.primary._elements.overlay.open === true || this.secondary._elements.overlay.open === true) {\n      // if popover is open only items in popover can be selected\n      const popoverItems = this.primary._elements.overlay.open === true ? this.primary._itemsInPopover :\n        this.secondary._itemsInPopover;\n      let item = null;\n\n      for (let i = 0 ; i < popoverItems.length ; i++) {\n        item = popoverItems[i];\n        if (!item.hasAttribute('disabled') &&\n          !item.hasAttribute('hidden') &&\n          item.style.display !== 'none' &&\n          getFirstSelectableWrappedItem(item)\n        ) {\n          selectableItems.push(item);\n        }\n      }\n    } else {\n      // concat selectable items from left side of the bar and right side of the bar\n      const leftSelectableItems = this.primary.items._getAllSelectable();\n      const rightSelectableItems = this.secondary.items._getAllSelectable();\n      if (currentItem) {\n        if (this.primary.contains(currentItem)) {\n          selectableItems = leftSelectableItems;\n        } else if (this.secondary.contains(currentItem)) {\n          selectableItems = rightSelectableItems;\n        }\n      } else {\n        selectableItems = leftSelectableItems.concat(rightSelectableItems);\n      }\n    }\n\n    return selectableItems;\n  }\n\n  /** @ignore */\n  _newWidthCache() {\n    return {\n      _items: [],\n      _outerWidth: [],\n      getOuterWidth: function (item) {\n        let index = this._items.indexOf(item);\n        if (index < 0) {\n          // if item was not cached in current frame => cache it\n          this._items.push(item);\n\n          const width = item.offsetWidth;\n          this._outerWidth.push(width);\n          index = this._outerWidth.length - 1;\n        }\n\n        return this._outerWidth[index];\n      }\n    };\n  }\n\n  /** @ignore */\n  _forceWebkitRedraw(el) {\n    const isWebkit = 'WebkitAppearance' in document.documentElement.style;\n\n    if (isWebkit && el.style.display !== 'none') {\n      el.style.display = 'none';\n\n      // no need to store this anywhere, the reference would be enough\n      this._cachedOffsetHeight = el.offsetHeight;\n\n      el.style.display = '';\n    }\n  }\n\n  /** @ignore */\n  _hideItem(item, hide) {\n    if (hide === false) {\n      this._moveToScreen(item);\n    } else if (!item.hasAttribute('coral-actionbar-offscreen')) {\n      // actually just move element offscreen to be able to measure the size while calculating the layout\n      item.setAttribute('coral-actionbar-offscreen', '');\n      item.style.visibility = 'hidden';\n      // if I do not force a browser redraw webkit has layouting problems\n      this._forceWebkitRedraw(item);\n    }\n  }\n\n  /** @ignore */\n  _moveToScreen(item, show) {\n    if (show === false) {\n      this._hideItem(item);\n    } else if (item.hasAttribute('coral-actionbar-offscreen')) {\n      // actually just move element onscreen again (see _hideItem)\n      item.removeAttribute('coral-actionbar-offscreen');\n      item.style.visibility = '';\n      // if I do not force a browser redraw webkit has layouting problems\n      this._forceWebkitRedraw(item);\n    }\n  }\n\n  /** @ignore */\n  _toggleItemTabbable(item, tabbable) {\n    this._ignoreLayout = true;\n    // item might be wrapped (for now remove/add tabindex only on the first wrapped item)\n    item = getFirstSelectableWrappedItem(item);\n\n    if (item !== null) {\n      item.setAttribute('tabindex', tabbable ? 0 : -1);\n    }\n  }\n\n  /** @ignore */\n  _debounceOnLayout() {\n    if (this._ignoreLayout) {\n      this._ignoreLayout = false;\n      return;\n    }\n\n    // Debounce\n    if (this._timeout !== null) {\n      window.clearTimeout(this._timeout);\n    }\n\n    this._timeout = window.setTimeout(() => {\n      this._timeout = null;\n      this._onLayout();\n    }, this._wait);\n  }\n\n  _moveDirectItemChildren() {\n    const items = Array.prototype.filter.call(this.children, child => child.nodeName === 'CORAL-ACTIONBAR-ITEM');\n    const frag = document.createDocumentFragment();\n\n    // Move them to the frag\n    items.forEach((item) => {\n      frag.appendChild(item);\n    });\n\n    // Add the frag to primary content zone\n    this._elements.primary.appendChild(frag);\n  }\n\n  get _contentZones() {\n    return {\n      'coral-actionbar-primary': 'primary',\n      'coral-actionbar-secondary': 'secondary'\n    };\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Move direct items into primary content zone\n    this._moveDirectItemChildren();\n\n    // Cleanup resize helpers object (cloneNode support)\n    const resizeHelpers = this.querySelectorAll('object');\n    for (let i = 0 ; i < resizeHelpers.length ; ++i) {\n      const resizeElement = resizeHelpers[i];\n      if (resizeElement.parentNode === this) {\n        this.removeChild(resizeElement);\n      }\n    }\n\n    const primary = this._elements.primary;\n    const secondary = this._elements.secondary;\n\n    if (!primary.hasAttribute('role')) {\n      primary.setAttribute('role', 'toolbar');\n    }\n    if (!secondary.hasAttribute('role')) {\n      secondary.setAttribute('role', 'toolbar');\n    }\n\n    // we need to know if the content zone was provided to stop the voracious behavior\n    let primaryProvided = primary.parentNode === this;\n\n    // as a way to transition to the new content zones, we need to provide support for the old container tag. we copy\n    // everything from these containers into the corresponding content zones, including the configurations\n    const containers = Array.prototype.slice.call(this.getElementsByTagName('coral-actionbar-container'));\n\n    let legacyContainer;\n    let targetContainer;\n    for (let j = 0, containersCount = containers.length ; j < containersCount ; j++) {\n      legacyContainer = containers[j];\n\n      // move first container content to new primary element\n      if (j === 0) {\n        targetContainer = primary;\n        // overrides the previous configuration as we support older containers\n        primaryProvided = true;\n      } else if (j === 1) {\n        targetContainer = secondary;\n      }\n\n      // it may happen that more than 2 containers were provided, in such case we simply ignore it\n      if (targetContainer) {\n        // we need to copy the existing configuration to the new content zone\n        if (legacyContainer.hasAttribute('threshold')) {\n          targetContainer.setAttribute('threshold', legacyContainer.getAttribute('threshold'));\n        }\n        if (legacyContainer.hasAttribute('morebuttontext')) {\n          targetContainer.setAttribute('morebuttontext', legacyContainer.getAttribute('morebuttontext'));\n        }\n\n        // @todo: are we copying the more button?\n        while (legacyContainer.firstChild) {\n          targetContainer.appendChild(legacyContainer.firstChild);\n        }\n      }\n\n      this.removeChild(legacyContainer);\n    }\n\n    // to prevent the content zone being voracious, we only move the children if primary was not explicitely provided\n    if (!primaryProvided) {\n      while (this.firstChild) {\n        primary.appendChild(this.firstChild);\n      }\n    }\n\n    // Call content zone inserts\n    this.primary = this._elements.primary;\n    this.secondary = this._elements.secondary;\n\n    // force one layout\n    this._onLayout();\n  }\n});\n\nexport default ActionBar;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 416,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 417,
    "kind": "variable",
    "name": "ActionBar",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBar.js~ActionBar",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "An ActionBar component containing arbitrary items. An item can either be added to the left or the right side\nof the bar. All items that do not fit into the bar are hidden but still accessible.",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ActionBar component containing arbitrary items. An item can either be added to the left or the right side\nof the bar. All items that do not fit into the bar are hidden but still accessible."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-actionbar"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-actionbar></coral-actionbar>",
      "<caption>JS constructor</caption>\nnew Coral.ActionBar();"
    ],
    "see": [
      "../examples/#actionbar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 418,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseActionBarContainer from './BaseActionBarContainer';\nimport '../../../coral-component-list';\n\nconst CLASSNAME = '_coral-ActionBar-container';\n\n/**\n Enumeration for {@link ActionBarContainer} positions.\n\n @typedef {Object} ActionBarContainerPositionEnum\n\n @property {String} PRIMARY\n Primary (left) ActionBar container.\n @property {String} SECONDARY\n Secondary (right) ActionBar container.\n @property {String} INVALID\n Invalid ActionBar container.\n */\nconst position = {\n  PRIMARY: 'primary',\n  SECONDARY: 'secondary',\n  INVALID: 'invalid'\n};\n\n/**\n @class Coral.ActionBar.Container\n @classdesc An ActionBar container component\n @htmltag coral-actionbar-container\n @extends {HTMLElement}\n @extends {BaseComponent}\n\n @deprecated\n */\nconst ActionBarContainer = Decorator(class extends BaseActionBarContainer(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    commons._log('warn', `Coral.ActionBar.Container: coral-actionbar-container has been deprecated.\n    Please use coral-actionbar-primary and coral-actionbar-secondary instead`);\n  }\n\n  /**\n   The container position inside the actionbar.\n\n   @private\n   @type {String}\n   @readonly\n   @default ActionBarContainerPositionEnum.INVALID\n   */\n  get _position() {\n    if (this.parentNode) {\n      const containers = this.parentNode.getElementsByTagName('coral-actionbar-container');\n\n      if (containers.length > 0 && containers[0] === this) {\n        return position.PRIMARY;\n      } else if (containers.length > 1 && containers[1] === this) {\n        return position.SECONDARY;\n      }\n    }\n\n    return position.INVALID;\n  }\n\n  /** @ignore */\n  _attachMoreButtonToContainer() {\n    if (this.parentNode && this.parentNode.secondary === this) {\n      this.insertBefore(this._elements.moreButton, this.firstChild);\n    } else {\n      // add the button to the left/primary contentzone\n      this.appendChild(this._elements.moreButton);\n    }\n  }\n\n  /**\n   Returns {@link ActionBarContainer} positions.\n\n   @return {ActionBarContainerPositionEnum}\n   */\n  static get position() {\n    return position;\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Cleanup resize helpers object (cloneNode support)\n    const resizeHelpers = this.getElementsByTagName('object');\n    for (let i = 0 ; i < resizeHelpers.length ; ++i) {\n      const resizeElement = resizeHelpers[i];\n      if (resizeElement.parentNode === this) {\n        this.removeChild(resizeElement);\n      }\n    }\n\n    // Cleanup 'More' button\n    this._elements.moreButton = this.querySelector('[coral-actionbar-more]');\n    if (this._elements.moreButton) {\n      this.removeChild(this._elements.moreButton);\n    }\n\n    // Cleanup 'More' popover\n    this._elements.overlay = this.querySelector('[coral-actionbar-popover]');\n    if (this._elements.overlay) {\n      this.removeChild(this._elements.overlay);\n    }\n\n    // Init 'More' button\n    this._elements.moreButton.label.textContent = this.moreButtonText;\n    // 'More' button might be moved later in dom when Container is attached to parent\n    this.appendChild(this._elements.moreButton);\n\n    // Init 'More' popover\n    this._elements.overlay.target = this._elements.moreButton;\n\n    // Insert popover always as firstChild to ensure element order (cloneNode support)\n    this.insertBefore(this._elements.overlay, this.firstChild);\n\n    this._attachMoreButtonToContainer();\n  }\n});\n\nexport default ActionBarContainer;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 419,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 420,
    "kind": "typedef",
    "name": "ActionBarContainerPositionEnum",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js~ActionBarContainerPositionEnum",
    "access": "public",
    "description": "Enumeration for {@link ActionBarContainer} positions.",
    "lineNumber": 33,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PRIMARY",
        "description": "Primary (left) ActionBar container."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SECONDARY",
        "description": "Secondary (right) ActionBar container."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INVALID",
        "description": "Invalid ActionBar container."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ActionBarContainerPositionEnum"
    }
  },
  {
    "__docId__": 421,
    "kind": "variable",
    "name": "ActionBarContainer",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainer.js~ActionBarContainer",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "An ActionBar container component",
    "lineNumber": 48,
    "deprecated": true,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar.Container"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ActionBar container component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-actionbar-container"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-actionbar-container></coral-actionbar-container>",
      "<caption>JS constructor</caption>\nnew Coral.ActionBar.Container();"
    ],
    "see": [
      "../examples/#actionbar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 422,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {SelectableCollection} from '../../../coral-collection';\nimport getFirstSelectableWrappedItem from './getFirstSelectableWrappedItem';\n\n/**\n @class Coral.ActionBar.Container.Collection\n @classdesc The ActionBar container collection\n @extends {SelectableCollection}\n */\nclass ActionBarContainerCollection extends SelectableCollection {\n  add(item, before) {\n    // in the left actionBar container always insert elements before the 'more' button in right actionBar always append\n    // at the end\n    if (!before && this._host.tagName === 'CORAL-ACTIONBAR-PRIMARY') {\n      const moreButton = this._host._elements.moreButton;\n      before = this._host.contains(moreButton) ? moreButton : null;\n    }\n\n    return super.add(item, before);\n  }\n\n  clear() {\n    const items = super.clear();\n\n    this._host._itemsInPopover = [];\n\n    return items;\n  }\n\n  _getAllSelectable() {\n    const selectableItems = [];\n\n    let child = null;\n    for (let i = 0 ; i < this._host.children.length ; i++) {\n      child = this._host.children[i];\n      if (\n        !child.hasAttribute('disabled') &&\n        !child.hasAttribute('hidden') &&\n        !child.hasAttribute('coral-actionbar-offscreen') &&\n        child !== this._host._elements.overlay &&\n        getFirstSelectableWrappedItem(child)\n      ) {\n        selectableItems.push(child);\n      }\n    }\n\n    return selectableItems;\n  }\n\n  _getAllOffScreen() {\n    return Array.prototype.slice.call(this._host.querySelectorAll(`${this._itemTagName}[coral-actionbar-offscreen]`));\n  }\n}\n\nexport default ActionBarContainerCollection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 423,
    "kind": "class",
    "name": "ActionBarContainerCollection",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "The ActionBar container collection",
    "lineNumber": 21,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar.Container.Collection"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The ActionBar container collection"
      }
    ],
    "interface": false,
    "extends": [
      "SelectableCollection"
    ],
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.ActionBar.Container.Collection();"
    ],
    "see": [
      "../examples/#actionbar"
    ]
  },
  {
    "__docId__": 424,
    "kind": "method",
    "name": "add",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection#add",
    "access": "public",
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      },
      {
        "name": "before",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 425,
    "kind": "method",
    "name": "clear",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection#clear",
    "access": "public",
    "description": null,
    "lineNumber": 33,
    "undocument": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 426,
    "kind": "method",
    "name": "_getAllSelectable",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection#_getAllSelectable",
    "access": "private",
    "description": null,
    "lineNumber": 41,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 427,
    "kind": "method",
    "name": "_getAllOffScreen",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarContainerCollection.js~ActionBarContainerCollection#_getAllOffScreen",
    "access": "private",
    "description": null,
    "lineNumber": 61,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 428,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ActionBar-item';\n\n/**\n @class Coral.ActionBar.Item\n @classdesc An ActionBar item component\n @htmltag coral-actionbar-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ActionBarItem = Decorator(class extends BaseComponent(HTMLElement) {\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default ActionBarItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 429,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 430,
    "kind": "variable",
    "name": "ActionBarItem",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarItem.js~ActionBarItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "An ActionBar item component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ActionBar item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-actionbar-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-actionbar-item></coral-actionbar-item>",
      "<caption>JS constructor</caption>\nnew Coral.ActionBar.Item();"
    ],
    "see": [
      "../examples/#actionbar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 431,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport getFirstSelectableWrappedItem from './getFirstSelectableWrappedItem';\nimport ActionBarContainer from './BaseActionBarContainer';\n\nconst CLASSNAME = '_coral-ActionBar-primary';\n\n/**\n @class Coral.ActionBar.Primary\n @classdesc An ActionBar primary component\n @htmltag coral-actionbar-primary\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ActionBarPrimary = Decorator(class extends ActionBarContainer(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  _returnElementsFromPopover() {\n    let item = null;\n    let wrappedItem = null;\n\n    for (let i = 0 ; i < this._itemsInPopover.length ; i++) {\n      item = this._itemsInPopover[i];\n\n      item.style.visibility = 'hidden';\n\n      // remove tabindex again\n      wrappedItem = getFirstSelectableWrappedItem(item);\n      if (wrappedItem && wrappedItem.hasAttribute('tabindex')) {\n        wrappedItem.setAttribute('tabindex', -1);\n      }\n\n      this.insertBefore(item, this._elements.moreButton);\n\n      // Reset popover id, target\n      if (item._button && item._popover) {\n        item._popover.id = item._popoverId;\n        if (item._popover.target) {\n          item._popover.target = item._button;\n        }\n      }\n    }\n  }\n\n  /** @ignore */\n  _attachMoreButtonToContainer() {\n    // add the button to the left/primary contentzone\n    this.appendChild(this._elements.moreButton);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this._attachMoreButtonToContainer();\n  }\n});\n\nexport default ActionBarPrimary;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 432,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 433,
    "kind": "variable",
    "name": "ActionBarPrimary",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarPrimary.js~ActionBarPrimary",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "An ActionBar primary component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar.Primary"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ActionBar primary component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-actionbar-primary"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-actionbar-primary></coral-actionbar-primary>",
      "<caption>JS constructor</caption>\nnew Coral.ActionBar.Primary();"
    ],
    "see": [
      "../examples/#actionbar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 434,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport getFirstSelectableWrappedItem from './getFirstSelectableWrappedItem';\nimport ActionBarContainer from './BaseActionBarContainer';\n\nconst CLASSNAME = '_coral-ActionBar-secondary';\n\n/**\n @class Coral.ActionBar.Secondary\n @classdesc An ActionBar secondary component\n @htmltag coral-actionbar-secondary\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ActionBarSecondary = Decorator(class extends ActionBarContainer(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  _returnElementsFromPopover() {\n    let item = null;\n    let wrappedItem = null;\n\n    for (let i = this._itemsInPopover.length - 1 ; i >= 0 ; i--) {\n      item = this._itemsInPopover[i];\n\n      item.style.visibility = 'hidden';\n\n      // remove tabindex again\n      wrappedItem = getFirstSelectableWrappedItem(item);\n      if (wrappedItem && wrappedItem.hasAttribute('tabindex')) {\n        wrappedItem.setAttribute('tabindex', -1);\n      }\n\n      this.insertBefore(item, this.firstChild.nextSibling);\n\n      // Reset popover id, target\n      if (item._button && item._popover) {\n        item._popover.id = item._popoverId;\n        if (item._popover.target) {\n          item._popover.target = item._button;\n        }\n      }\n    }\n  }\n\n  /** @ignore */\n  _attachMoreButtonToContainer() {\n    this.insertBefore(this._elements.moreButton, this.firstChild);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this._attachMoreButtonToContainer();\n  }\n});\n\nexport default ActionBarSecondary;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 435,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 436,
    "kind": "variable",
    "name": "ActionBarSecondary",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/ActionBarSecondary.js~ActionBarSecondary",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ActionBar}",
    "description": "An ActionBar secondary component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ActionBar.Secondary"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ActionBar secondary component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-actionbar-secondary"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-actionbar-secondary></coral-actionbar-secondary>",
      "<caption>JS constructor</caption>\nnew Coral.ActionBar.Secondary();"
    ],
    "see": [
      "../examples/#actionbar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 437,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport ActionBarContainerCollection from './ActionBarContainerCollection';\nimport {Button} from '../../../coral-component-button';\nimport '../../../coral-component-anchorbutton';\nimport moreOverlay from '../templates/moreOverlay';\nimport moreButton from '../templates/moreButton';\nimport overlayContent from '../templates/overlayContent';\nimport {commons, transform, i18n} from '../../../coral-utils';\n\n// Matches private Coral classes in class attribute\nconst REG_EXP = /_coral([^\\s]+)/g;\n\nconst copyAttributes = (from, to) => {\n  const excludedAttributes = ['is', 'id', 'variant', 'size'];\n\n  for (let i = 0 ; i < from.attributes.length ; i++) {\n    const attr = from.attributes[i];\n\n    if (excludedAttributes.indexOf(attr.nodeName) === -1) {\n      if (attr.nodeName === 'class') {\n        // Filter out private Coral classes\n        to.setAttribute(attr.nodeName, `${to.className} ${attr.nodeValue.replace(REG_EXP, '')}`);\n      } else {\n        to.setAttribute(attr.nodeName, attr.nodeValue);\n      }\n    }\n  }\n};\n\n/**\n @base BaseActionBarContainer\n @classdesc The base element for action bar containers\n */\nclass BaseActionBarContainer extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    this._itemsInPopover = [];\n    moreButton.call(this._elements, {i18n});\n    moreOverlay.call(this._elements, {commons});\n    overlayContent.call(this._elements, {\n      items: this._itemsInPopover,\n      copyAttributes\n    });\n\n    // Return focus to overlay by default\n    this._elements.overlay.focusOnShow = this._elements.overlay;\n\n    const overlayId = this._elements.overlay.id;\n    const events = {};\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_onOverlayBeforeOpen';\n    events[`global:capture:coral-overlay:beforeclose #${overlayId}`] = '_onOverlayBeforeClose';\n    // Keyboard interaction\n    events[`global:key:down #${overlayId}`] = '_onOverlayKeyDown';\n    events[`global:key:up #${overlayId}`] = '_onOverlayKeyUp';\n\n    // Events\n    this._delegateEvents(events);\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {ActionBarContainerCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new ActionBarContainerCollection({\n        host: this,\n        itemTagName: 'coral-actionbar-item',\n        onItemAdded: this._styleItem\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   The amount of items that are maximally visible inside the container. Using a value <= 0 will disable this\n   feature and show as many items as possible.\n\n   @type {Number}\n   @default -1\n   @htmlattribute threshold\n   @htmlattributereflected\n   */\n  get threshold() {\n    return typeof this._threshold === 'number' ? this._threshold : -1;\n  }\n\n  set threshold(value) {\n    this._threshold = transform.number(value);\n    this._reflectAttribute('threshold', this._threshold);\n  }\n\n  /**\n   If there are more ActionBarItems inside the ActionBar than currently can be shown, then a \"more\" Button with the\n   following text will be rendered (and some ActionBarItems will be hidden inside of a Popover).\n\n   @type {String}\n   @default \"\"\n   @htmlattribute morebuttontext\n   */\n  get moreButtonText() {\n    return this._moreButtonText || '';\n  }\n\n  set moreButtonText(value) {\n    this._moreButtonText = transform.string(value);\n\n    if (this._elements.moreButton) {\n      // moreButton might not have been created so far\n      this._elements.moreButtonLabel.innerHTML = this._moreButtonText;\n      this._elements.moreButton[this._moreButtonText.trim() === '' ? 'setAttribute' : 'removeAttribute']('title', i18n.get('More'));\n    }\n  }\n\n  /**\n   Style item content\n   */\n  _styleItem(item) {\n    const button = item.querySelector('button[is=\"coral-button\"]') || item.querySelector('a[is=\"coral-anchorbutton\"]');\n    if (button) {\n      button.classList.add('_coral-ActionBar-button');\n\n      const oldVariant = button.getAttribute('variant');\n      if (oldVariant === Button.variant.ACTION || oldVariant === Button.variant.QUIET_ACTION) {\n        return;\n      }\n\n      button.setAttribute('variant', oldVariant === Button.variant.QUIET ? Button.variant.QUIET_ACTION : Button.variant.ACTION);\n    }\n  }\n\n  /**\n   Called after popover.open is set to true, but before the transition of the popover is done. Show elements inside\n   the actionbar, that are hidden due to space problems.\n\n   @ignore\n   */\n  _onOverlayBeforeOpen(event) {\n    // there might be popovers in popover => ignore them\n    if (event.target !== this._elements.overlay) {\n      return;\n    }\n\n    this._itemsInPopover = this.items._getAllOffScreen();\n\n    if (this._itemsInPopover.length < 1) {\n      return;\n    }\n\n    // Set focus to first focusable descendant of the overlay by default\n    this._elements.overlay.focusOnShow = 'on';\n\n    this._itemsInPopover.forEach((item) => {\n      item.style.visibility = '';\n      // Store the button and popover on the item\n      item._button = item.querySelector(':scope > button[is=\"coral-button\"]') || item.querySelector(':scope > a[is=\"coral-anchorbutton\"]');\n      item._popover = item.querySelector('coral-popover');\n      if (item._popover) {\n        item._popoverId = item._popover.id;\n      }\n    });\n\n    // Whether a ButtonList or AnchorList should be rendered\n    this._itemsInPopover.isButtonList = this._itemsInPopover.every(item => item._button && item._button.tagName === 'BUTTON');\n    this._itemsInPopover.isAnchorList = this._itemsInPopover.every(item => item._button && item._button.tagName === 'A');\n\n    // show the current popover (hidden needed to disable fade time of popover)\n    this._elements.overlay.hidden = false;\n\n    // render popover content\n    const popover = this._elements.overlay;\n    popover.content.innerHTML = '';\n    popover.content.appendChild(overlayContent.call(this._elements, {\n      items: this._itemsInPopover,\n      copyAttributes\n    }));\n  }\n\n  /**\n   Called after popover.open is set to false, but before the transition of the popover is done.\n   Make items visible again, that now do fit into the actionbar.\n   @ignore\n   */\n  _onOverlayBeforeClose(event) {\n    // there might be popovers in popover => ignore them\n    if (event.target !== this._elements.overlay) {\n      return;\n    }\n\n    const focusedItem = document.activeElement.parentNode;\n\n    // we need to check if item has 'hasAttribute' because it is not present on the document\n    const isFocusedItemInsideActionBar = this.parentNode.contains(focusedItem);\n    const isFocusedItemOffscreen = focusedItem.hasAttribute && focusedItem.hasAttribute('coral-actionbar-offscreen');\n    if (isFocusedItemInsideActionBar && isFocusedItemOffscreen) {\n      // if currently an element is focused, that should not be visible (or is no actionbar-item) => select 'more'\n      // button\n      this._elements.moreButton.focus();\n    }\n\n    // hide the popover(needed to disable fade time of popover)\n    this._elements.overlay.hidden = true;\n    this._elements.overlay.focusOnShow = this._elements.overlay;\n\n    // close any popovers, that might be inside the 'more' popover\n    const childPopovers = this._elements.overlay.getElementsByTagName('coral-popover');\n    for (let i = 0 ; i < childPopovers.length ; i++) {\n      childPopovers[i].open = false;\n    }\n\n    // return all elements from popover\n    this._returnElementsFromPopover();\n\n    // clear cached items from popover\n    this._itemsInPopover = [];\n\n    // clear overlay\n    this._elements.overlay.content.innerHTML = '';\n  }\n\n  _onOverlayKeyDown(event) {\n    event.preventDefault();\n\n    // Focus first item\n    this._elements.anchorList && this._elements.anchorList._focusFirstItem(event);\n    this._elements.buttonList && this._elements.buttonList._focusFirstItem(event);\n  }\n\n  _onOverlayKeyUp(event) {\n    event.preventDefault();\n\n    // Focus last item\n    this._elements.anchorList && this._elements.anchorList._focusLastItem(event);\n    this._elements.buttonList && this._elements.buttonList._focusLastItem(event);\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      morebuttontext: 'moreButtonText'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['morebuttontext', 'threshold']);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // Cleanup resize helpers object (cloneNode support)\n    const resizeHelpers = this.getElementsByTagName('object');\n    for (let i = 0 ; i < resizeHelpers.length ; ++i) {\n      const resizeElement = resizeHelpers[i];\n      if (resizeElement.parentNode === this) {\n        this.removeChild(resizeElement);\n      }\n    }\n\n    // Cleanup 'More' button\n    const more = this.querySelector('[coral-actionbar-more]');\n    if (more) {\n      this.removeChild(more);\n    }\n\n    // Cleanup 'More' popover\n    const popover = this.querySelector('[coral-actionbar-popover]');\n    if (popover) {\n      this.removeChild(popover);\n    }\n\n    // Copy more text\n    this._elements.moreButton.label.textContent = this.moreButtonText;\n\n    // Init 'More' popover\n    this._elements.overlay.target = this._elements.moreButton;\n\n    // Create empty frag\n    const frag = document.createDocumentFragment();\n\n    // 'More' button might be moved later in dom when Container is attached to parent\n    frag.appendChild(this._elements.moreButton);\n    frag.appendChild(this._elements.overlay);\n\n    // Render template\n    this.appendChild(frag);\n\n    // Style the items to match action items\n    this.items.getAll().forEach(item => this._styleItem(item));\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n};\n\nexport default BaseActionBarContainer;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 438,
    "kind": "variable",
    "name": "REG_EXP",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~REG_EXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 439,
    "kind": "function",
    "name": "copyAttributes",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~copyAttributes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "params": [
      {
        "name": "from",
        "types": [
          "*"
        ]
      },
      {
        "name": "to",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 440,
    "kind": "class",
    "name": "BaseActionBarContainer",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for action bar containers",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseActionBarContainer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for action bar containers"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 441,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 47,
    "ignore": true
  },
  {
    "__docId__": 442,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 51,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 443,
    "kind": "member",
    "name": "_itemsInPopover",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_itemsInPopover",
    "access": "private",
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 444,
    "kind": "member",
    "name": "overlay",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#overlay",
    "access": "public",
    "description": "Returns the inner overlay to allow customization.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 84,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Popover"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 445,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#items",
    "access": "public",
    "description": "The Collection Interface that allows interacting with the items that the component contains.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 94,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ActionBarContainerCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 446,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_items",
    "access": "private",
    "description": null,
    "lineNumber": 97,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 447,
    "kind": "member",
    "name": "threshold",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#threshold",
    "access": "public",
    "description": "The amount of items that are maximally visible inside the container. Using a value <= 0 will disable this\nfeature and show as many items as possible.\n<ul><li><code>-1</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 116,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "-1"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "threshold"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 449,
    "kind": "member",
    "name": "_threshold",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_threshold",
    "access": "private",
    "description": null,
    "lineNumber": 121,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 450,
    "kind": "member",
    "name": "moreButtonText",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#moreButtonText",
    "access": "public",
    "description": "If there are more ActionBarItems inside the ActionBar than currently can be shown, then a \"more\" Button with the\nfollowing text will be rendered (and some ActionBarItems will be hidden inside of a Popover).\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 133,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "morebuttontext"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 452,
    "kind": "member",
    "name": "_moreButtonText",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_moreButtonText",
    "access": "private",
    "description": null,
    "lineNumber": 138,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 453,
    "kind": "method",
    "name": "_styleItem",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_styleItem",
    "access": "private",
    "description": "Style item content",
    "lineNumber": 150,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 454,
    "kind": "method",
    "name": "_onOverlayBeforeOpen",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_onOverlayBeforeOpen",
    "access": "private",
    "description": "Called after popover.open is set to true, but before the transition of the popover is done. Show elements inside\nthe actionbar, that are hidden due to space problems.",
    "lineNumber": 170,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 456,
    "kind": "method",
    "name": "_onOverlayBeforeClose",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_onOverlayBeforeClose",
    "access": "private",
    "description": "Called after popover.open is set to false, but before the transition of the popover is done.\nMake items visible again, that now do fit into the actionbar.",
    "lineNumber": 216,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 458,
    "kind": "method",
    "name": "_onOverlayKeyDown",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_onOverlayKeyDown",
    "access": "private",
    "description": null,
    "lineNumber": 253,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 459,
    "kind": "method",
    "name": "_onOverlayKeyUp",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#_onOverlayKeyUp",
    "access": "private",
    "description": null,
    "lineNumber": 261,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 460,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 269,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 461,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 276,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 462,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 281,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 463,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#render",
    "access": "public",
    "description": null,
    "lineNumber": 294,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 464,
    "kind": "method",
    "name": "disconnectedCallback",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/BaseActionBarContainer.js~BaseActionBarContainer#disconnectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 339,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 465,
    "kind": "file",
    "name": "coral-spectrum/coral-component-actionbar/src/scripts/getFirstSelectableWrappedItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\n\n/** @ignore */\nexport default function getFirstSelectableWrappedItem(wrapperItem) {\n  // util method to get first selectable item inside a wrapper item\n  if (!wrapperItem) {\n    return null;\n  }\n\n  if (wrapperItem.hasAttribute('coral-actionbar-more')) {\n    // more buttons are no 'real' actionbar items => not wrapped\n    return wrapperItem;\n  }\n\n  let child = null;\n  for (let i = 0 ; i < wrapperItem.children.length ; i++) {\n    child = wrapperItem.children[i];\n\n    // maybe filter even more elements? (opacity, display='none', position='absolute' ...)\n    if (child.offsetParent && (child.matches(commons.FOCUSABLE_ELEMENT_SELECTOR) || child.matches('a:not([href])')) && !child.hasAttribute('disabled')) {\n      return child;\n    }\n  }\n\n  // search at 2nd level, some elements like coral-fileupload has selectable items inside them\n  for (let i = 0 ; i < wrapperItem.children.length ; i++) {\n    child = wrapperItem.children[i];\n    for (let j = 0 ; j < child.children.length ; j++) {\n      let subChild = child.children[j];\n      // maybe filter even more elements? (opacity, display='none', position='absolute' ...)\n      if (subChild.offsetParent && (subChild.matches(commons.FOCUSABLE_ELEMENT_SELECTOR) || child.matches('a:not([href])'))) {\n        return subChild;\n      }\n    }\n  }\n\n  return null;\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-actionbar/src/scripts/getFirstSelectableWrappedItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 466,
    "kind": "function",
    "name": "getFirstSelectableWrappedItem",
    "memberof": "coral-spectrum/coral-component-actionbar/src/scripts/getFirstSelectableWrappedItem.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-actionbar/src/scripts/getFirstSelectableWrappedItem.js~getFirstSelectableWrappedItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getFirstSelectableWrappedItem}",
    "description": null,
    "lineNumber": 16,
    "ignore": true,
    "params": [
      {
        "name": "wrapperItem",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 467,
    "kind": "file",
    "name": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Icon} from '../../../coral-component-icon';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Alert} variants.\n\n @typedef {Object} AlertVariantEnum\n\n @property {String} ERROR\n An alert with a warning icon to indicate that an error has occurred.\n @property {String} WARNING\n An alert with a warning icon to warn the user of something important.\n @property {String} SUCCESS\n An alert with a question mark icon to notify the user of a successful operation.\n @property {String} HELP\n A neutral alert with a question icon to help the user with non-critical information.\n @property {String} INFO\n An alert with an info icon to inform the user of non-critical information.\n */\nconst variant = {\n  ERROR: 'error',\n  WARNING: 'warning',\n  SUCCESS: 'success',\n  HELP: 'help',\n  INFO: 'info'\n};\n\n/**\n Enumeration for {@link Alert} sizes.\n\n @typedef {Object} AlertSizeEnum\n\n @property {String} SMALL\n A small alert, usually employed for single line alerts without headers.\n @property {String} LARGE\n Not supported. Falls back to SMALL.\n */\nconst size = {\n  SMALL: 'S',\n  LARGE: 'L'\n};\n\nconst CLASSNAME = '_coral-Alert';\n\n// An array of all possible variant classnames\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n// Used to map icon with variant\nconst capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);\n\n/**\n @class Coral.Alert\n @classdesc An Alert component used as static indicators of an operation's result, or as messages to highlight\n information to the user. It does not include a close button by default, but you can add it manually by adding the\n <code>coral-close</code> attribute on an element contained by the Alert.\n @htmltag coral-alert\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Alert = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      header: this.querySelector('coral-alert-header') || document.createElement('coral-alert-header'),\n      content: this.querySelector('coral-alert-content') || document.createElement('coral-alert-content'),\n      footer: this.querySelector('coral-alert-footer') || document.createElement('coral-alert-footer')\n    };\n\n    // Events\n    this._delegateEvents({\n      'click [coral-close]': '_onCloseClick'\n    });\n  }\n\n  /**\n   The alert variant style to use. See {@link AlertVariantEnum}.\n\n   @type {String}\n   @default AlertVariantEnum.INFO\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.INFO;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.INFO;\n    this._reflectAttribute('variant', this._variant);\n\n    this._insertTemplate();\n\n    // Remove all variant classes\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    // Set new variant class\n    // Don't use this._className; use the constant\n    // This lets popover get our styles for free\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n  }\n\n  /**\n   The size of the alert. It accepts both lower and upper case sizes. See {@link AlertVariantEnum}.\n\n   @type {String}\n   @default AlertSizeEnum.SMALL\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.SMALL;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.SMALL;\n    this._reflectAttribute('size', this._size);\n  }\n\n  /**\n   The alert header element.\n\n   @type {AlertHeader}\n   @contentzone\n   */\n  get header() {\n    return this._getContentZone(this._elements.header);\n  }\n\n  set header(value) {\n    this._setContentZone('header', value, {\n      handle: 'header',\n      tagName: 'coral-alert-header',\n      insert: function (header) {\n        header.classList.add(`${CLASSNAME}-header`);\n        this.insertBefore(header, this.firstChild);\n      }\n    });\n  }\n\n  /**\n   The alert content element.\n\n   @type {AlertContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-alert-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}-content`);\n        // After the header\n        this.insertBefore(content, this.header.nextElementSibling);\n      }\n    });\n  }\n\n  /**\n   The alert footer element.\n\n   @type {AlertFooter}\n   @contentzone\n   */\n  get footer() {\n    return this._getContentZone(this._elements.footer);\n  }\n\n  set footer(value) {\n    this._setContentZone('footer', value, {\n      handle: 'footer',\n      tagName: 'coral-alert-footer',\n      insert: function (footer) {\n        footer.classList.add(`${CLASSNAME}-footer`);\n        // After the content\n        this.insertBefore(footer, this.content.nextElementSibling);\n      }\n    });\n  }\n\n  /**\n   @ignore\n   @todo maybe this should be base or something\n   */\n  _onCloseClick(event) {\n    const dismissTarget = event.matchedTarget;\n    const dismissValue = dismissTarget.getAttribute('coral-close');\n    if (!dismissValue || this.matches(dismissValue)) {\n      this.hidden = true;\n      event.stopPropagation();\n    }\n\n    this._trackEvent('close', 'coral-alert', event);\n  }\n\n  _insertTemplate() {\n    if (this._elements.icon) {\n      this._elements.icon.remove();\n    }\n\n    let variantValue = this.variant;\n\n    // Warning icon is same as ERROR icon\n    if (variantValue === variant.WARNING || variantValue === variant.ERROR) {\n      variantValue = 'alert';\n    }\n\n    // Inject the SVG icon\n    const iconName = capitalize(variantValue);\n    this.insertAdjacentHTML('afterbegin', Icon._renderSVG(`spectrum-css-icon-${iconName}Medium`, ['_coral-Alert-icon', `_coral-UIIcon-${iconName}Medium`]));\n    this._elements.icon = this.querySelector('._coral-Alert-icon');\n  }\n\n  get _contentZones() {\n    return {\n      'coral-alert-header': 'header',\n      'coral-alert-content': 'content',\n      'coral-alert-footer': 'footer'\n    };\n  }\n\n  /**\n   Returns {@link Alert} variants.\n\n   @return {AlertVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link Alert} sizes.\n\n   @return {AlertSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'size']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'alert');\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.INFO;\n    }\n    if (!this._size) {\n      this.size = size.SMALL;\n    }\n\n    for (const contentZone in this._contentZones) {\n      const element = this._elements[this._contentZones[contentZone]];\n      // Remove it so we can process children\n      if (element.parentNode) {\n        element.parentNode.removeChild(element);\n      }\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && !child.classList.contains('_coral-Alert-icon')) {\n        // Add non-template elements to the content\n        this._elements.content.appendChild(child);\n      } else {\n        // Remove anything else element\n        this.removeChild(child);\n      }\n    }\n\n    this._insertTemplate();\n\n    // Assign the content zones so the insert functions will be called\n    for (const contentZone in this._contentZones) {\n      const contentZoneName = this._contentZones[contentZone];\n\n      /** @ignore */\n      this[contentZoneName] = this._elements[contentZoneName];\n    }\n  }\n});\n\nexport default Alert;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 468,
    "kind": "typedef",
    "name": "AlertVariantEnum",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~AlertVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Alert} variants.",
    "lineNumber": 34,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "An alert with a warning icon to indicate that an error has occurred."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "An alert with a warning icon to warn the user of something important."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "An alert with a question mark icon to notify the user of a successful operation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HELP",
        "description": "A neutral alert with a question icon to help the user with non-critical information."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "An alert with an info icon to inform the user of non-critical information."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AlertVariantEnum"
    }
  },
  {
    "__docId__": 469,
    "kind": "typedef",
    "name": "AlertSizeEnum",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~AlertSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Alert} sizes.",
    "lineNumber": 52,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small alert, usually employed for single line alerts without headers."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "Not supported. Falls back to SMALL."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AlertSizeEnum"
    }
  },
  {
    "__docId__": 470,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 471,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 60,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 472,
    "kind": "function",
    "name": "capitalize",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~capitalize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 66,
    "undocument": true,
    "params": [
      {
        "name": "s",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 473,
    "kind": "variable",
    "name": "Alert",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/Alert.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/Alert.js~Alert",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Alert}",
    "description": "An Alert component used as static indicators of an operation's result, or as messages to highlight\ninformation to the user. It does not include a close button by default, but you can add it manually by adding the\n<code>coral-close</code> attribute on an element contained by the Alert.",
    "lineNumber": 77,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Alert"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An Alert component used as static indicators of an operation's result, or as messages to highlight\ninformation to the user. It does not include a close button by default, but you can add it manually by adding the\n<code>coral-close</code> attribute on an element contained by the Alert."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-alert"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-alert></coral-alert>",
      "<caption>JS constructor</caption>\nnew Coral.Alert();"
    ],
    "see": [
      "../examples/#alert"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 474,
    "kind": "file",
    "name": "coral-spectrum/coral-component-alert/src/scripts/AlertContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Alert.Content\n @classdesc The Alert default content\n @htmltag coral-alert-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-alert-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-alert/src/scripts/AlertContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 475,
    "kind": "function",
    "name": "AlertContent",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/AlertContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/AlertContent.js~AlertContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Alert}",
    "description": "The Alert default content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Alert.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Alert default content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-alert-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-alert-content></coral-alert-content>",
      "<caption>JS constructor</caption>\nnew Coral.Alert.Content();"
    ],
    "see": [
      "../examples/#alert"
    ],
    "params": []
  },
  {
    "__docId__": 476,
    "kind": "file",
    "name": "coral-spectrum/coral-component-alert/src/scripts/AlertFooter.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Alert.Footer\n @classdesc The Alert footer content\n @htmltag coral-alert-footer\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-alert-footer');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-alert/src/scripts/AlertFooter.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 477,
    "kind": "function",
    "name": "AlertFooter",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/AlertFooter.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/AlertFooter.js~AlertFooter",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Alert}",
    "description": "The Alert footer content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Alert.Footer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Alert footer content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-alert-footer"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-alert-footer></coral-alert-footer>",
      "<caption>JS constructor</caption>\nnew Coral.Alert.Footer();"
    ],
    "see": [
      "../examples/#alert"
    ],
    "params": []
  },
  {
    "__docId__": 478,
    "kind": "file",
    "name": "coral-spectrum/coral-component-alert/src/scripts/AlertHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Alert.Header\n @classdesc The Alert header content\n @htmltag coral-alert-header\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-alert-header');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-alert/src/scripts/AlertHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 479,
    "kind": "function",
    "name": "AlertHeader",
    "memberof": "coral-spectrum/coral-component-alert/src/scripts/AlertHeader.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-alert/src/scripts/AlertHeader.js~AlertHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Alert}",
    "description": "The Alert header content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Alert.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Alert header content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-alert-header"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-alert-header></coral-alert-header>",
      "<caption>JS constructor</caption>\nnew Coral.Alert.Header();"
    ],
    "see": [
      "../examples/#alert"
    ],
    "params": []
  },
  {
    "__docId__": 480,
    "kind": "file",
    "name": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseButton} from '../../../coral-base-button';\nimport {transform, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n// Key code\nconst SPACE = 32;\n\n/**\n @class Coral.AnchorButton\n @classdesc A Link component rendering as a button allowing us to style an anchor element that both looks and behaves\n like a button rather than a link. It can receive keyboard focus regardless of whether or not it has an <code>href</code>\n attribute, can be activated using either the <code>SPACE</code> key or the <code>ENTER</code> key, and is identified to\n assistive technology as a button element.\n @htmltag coral-anchorbutton\n @htmlbasetag a\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n @extends {BaseButton}\n */\nconst AnchorButton = Decorator(class extends BaseButton(BaseComponent(HTMLAnchorElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      keydown: '_onKeyDown',\n      keyup: '_onKeyUp'\n    }));\n\n    // cannot use the events hash because events on disabled items are not reported\n    this.addEventListener('click', this._onDisabledClick.bind(this));\n  }\n\n  /**\n   Disables the button from user interaction.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this.setAttribute('tabindex', this._disabled ? '-1' : '0');\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n  }\n\n  /**\n   Keyboard handling per the WAI-ARIA button widget design pattern:\n   https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role\n\n   @ignore\n   */\n  _onKeyDown(event) {\n    if (event.keyCode === SPACE) {\n      event.preventDefault();\n      this.click();\n      this.classList.add('is-selected');\n    }\n  }\n\n  /** @ignore */\n  _onKeyUp(event) {\n    if (event.keyCode === SPACE) {\n      event.preventDefault();\n      this.classList.remove('is-selected');\n    }\n  }\n\n  /** @ignore */\n  _onDisabledClick(event) {\n    if (this.disabled) {\n      event.preventDefault();\n    }\n  }\n\n  // Override content zone name\n  get _contentZones() {\n    return {'coral-anchorbutton-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['disabled']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // a11y\n    this.setAttribute('role', 'button');\n    if (!this.disabled) {\n      // Force tabindex and aria-disabled attribute reflection\n      this.setAttribute('tabindex', '0');\n      this.removeAttribute('aria-disabled');\n    }\n  }\n});\n\nexport default AnchorButton;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 481,
    "kind": "variable",
    "name": "SPACE",
    "memberof": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js~SPACE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 482,
    "kind": "variable",
    "name": "AnchorButton",
    "memberof": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButton.js~AnchorButton",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{AnchorButton}",
    "description": "A Link component rendering as a button allowing us to style an anchor element that both looks and behaves\nlike a button rather than a link. It can receive keyboard focus regardless of whether or not it has an <code>href</code>\nattribute, can be activated using either the <code>SPACE</code> key or the <code>ENTER</code> key, and is identified to\nassistive technology as a button element.",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.AnchorButton"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Link component rendering as a button allowing us to style an anchor element that both looks and behaves\nlike a button rather than a link. It can receive keyboard focus regardless of whether or not it has an <code>href</code>\nattribute, can be activated using either the <code>SPACE</code> key or the <code>ENTER</code> key, and is identified to\nassistive technology as a button element."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-anchorbutton"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "a"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLAnchorElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseButton}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<a is=\"coral-anchorbutton\"></a>",
      "<caption>JS constructor</caption>\nnew Coral.AnchorButton();"
    ],
    "see": [
      "../examples/#anchorbutton"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 483,
    "kind": "file",
    "name": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButtonLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.AnchorButton.Label\n @classdesc The AnchorButton label content\n @htmltag coral-anchorbutton-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-anchorbutton-label');\n\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButtonLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 484,
    "kind": "function",
    "name": "AnchorButtonLabel",
    "memberof": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButtonLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-anchorbutton/src/scripts/AnchorButtonLabel.js~AnchorButtonLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{AnchorButton}",
    "description": "The AnchorButton label content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.AnchorButton.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The AnchorButton label content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-anchorbutton-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-anchorbutton-label></coral-anchorbutton-label>",
      "<caption>JS constructor</caption>\nnew Coral.AnchorButton.Label();"
    ],
    "see": [
      "../examples/#anchorbutton"
    ],
    "params": []
  },
  {
    "__docId__": 485,
    "kind": "file",
    "name": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {Tag} from '../../../coral-component-taglist';\nimport {SelectableCollection} from '../../../coral-collection';\nimport AutocompleteItem from './AutocompleteItem';\nimport {Textfield} from '../../../coral-component-textfield';\nimport {Icon} from '../../../coral-component-icon';\nimport '../../../coral-component-button';\nimport '../../../coral-component-list';\nimport '../../../coral-component-popover';\nimport '../../../coral-component-wait';\nimport base from '../templates/base';\nimport loadIndicator from '../templates/loadIndicator';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Autocomplete';\n\n/**\n The distance, in pixels, from the bottom of the List at which we assume the user has scrolled\n to the bottom of the list.\n @type {Number}\n @ignore\n */\nconst SCROLL_BOTTOM_THRESHOLD = 50;\n\n/**\n The number of milliseconds for which scroll events should be debounced.\n @type {Number}\n @ignore\n */\nconst SCROLL_DEBOUNCE = 100;\n\n/**\n Enumeration for {@link Autocomplete} variants.\n\n @typedef {Object} AutocompleteVariantEnum\n\n @property {String} DEFAULT\n A default, gray Autocomplete.\n @property {String} QUIET\n An Autocomplete with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\n/**\n Enumeration for {@link Autocomplete} match options.\n\n @typedef {Object} AutocompleteMatchEnum\n\n @property {String} STARTSWITH\n Include only matches that start with the user provided value.\n @property {String} CONTAINS\n Include only matches that contain the user provided value.\n */\nconst match = {\n  STARTSWITH: 'startswith',\n  CONTAINS: 'contains'\n};\n\n/**\n @class Coral.Autocomplete\n @classdesc An Autocomplete component that allows users to search and select from a list of options.\n @htmltag coral-autocomplete\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Autocomplete = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Template\n    this._elements = {};\n    base.call(this._elements, {Icon, commons, i18n});\n\n    this._elements.tagList.reset = () => {\n      // Kill inner tagList reset so it doesn't interfer with the autocomplete reset\n    };\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    const overlayId = this._elements.overlay.id;\n    const events = {\n      // ARIA Autocomplete role keyboard interaction\n      // http://www.w3.org/TR/wai-aria-practices/#autocomplete\n      'key:up [handle=\"input\"]': '_handleInputUpKeypress',\n      'key:alt+up [handle=\"input\"]': '_handleInputUpKeypress',\n      'key:down [handle=\"input\"]': '_handleInputDownKeypress',\n      'key:alt+down [handle=\"input\"]': '_handleInputDownKeypress',\n      'key:tab [handle=\"input\"]': '_handleInputTabKeypress',\n      'key:shift+tab [handle=\"input\"]': '_handleListFocusShift',\n      'capture:change [handle=\"input\"]': '_handleInput',\n      'input [handle=\"input\"]': '_handleInputEvent',\n\n      // Manually listen to keydown event due to CUI-3973\n      'keydown': '_handleInputKeypressEnter',\n\n      // Interaction\n      'click [handle=\"trigger\"]': '_handleTriggerClick',\n      'mousedown [handle=\"trigger\"]': '_handleTriggerMousedown',\n\n      // Focus\n      'capture:blur': '_handleFocusOut',\n      'global:click': '_onGlobalClick',\n      'global:touchstart': '_onGlobalClick',\n\n      // Taglist\n      'coral-collection:add [handle=\"tagList\"]': '_handleTagAdded',\n      'coral-collection:remove [handle=\"tagList\"]': '_handleTagRemoved',\n      'change [handle=\"tagList\"]': '_preventTagListChangeEvent',\n\n      // Items\n      'coral-autocomplete-item:_valuechanged': '_handleItemValueChange',\n      'coral-autocomplete-item:_selectedchanged': '_handleItemSelectedChange',\n      'coral-autocomplete-item:_contentchanged': '_handleItemContentChange'\n    };\n\n    // Interaction\n    events[`global:key:shift+tab #${overlayId} [is=\"coral-buttonlist-item\"]`] = '_handleListFocusShift';\n    events[`global:key:esc`] = '_handleListFocusShift';\n\n    // Overlay\n    events[`global:capture:coral-overlay:positioned #${overlayId}`] = '_onOverlayPositioned';\n    events[`global:capture:coral-overlay:open #${overlayId}`] = '_onOverlayOpenOrClose';\n    events[`global:capture:coral-overlay:close #${overlayId}`] = '_onOverlayOpenOrClose';\n\n    // SelectList\n    events[`global:key:enter #${overlayId} button[is=\"coral-buttonlist-item\"]`] = '_handleSelect';\n    events[`global:capture:mousedown #${overlayId} button[is=\"coral-buttonlist-item\"]`] = '_handleSelect';\n    events[`global:capture:scroll #${overlayId} [handle=\"selectList\"]`] = '_onScroll';\n    events[`global:capture:mousewheel #${overlayId} [handle=\"selectList\"]`] = '_onMouseWheel';\n    events[`global:capture:mousedown #${overlayId} [handle=\"selectList\"]`] = '_onMouseDown';\n\n    // Events\n    this._delegateEvents(events);\n\n    // A map of values to tags\n    this._tagMap = {};\n\n    // A list of selected values\n    this._values = [];\n\n    // A list of options objects\n    this._options = [];\n\n    // A map of option values to their content\n    this._optionsMap = {};\n\n    // Used for reset\n    this._initialSelectedValues = [];\n\n    // Bind the debounced scroll method\n    this._handleScrollBottom = this._handleScrollBottom.bind(this);\n\n    // Listen for mutations\n    this._observer = new MutationObserver(this._handleMutation.bind(this));\n    this._startObserving();\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The item collection.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        itemTagName: 'coral-autocomplete-item',\n        host: this\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Indicates if the autocomplete is a single or multiple mode. In multiple mode, the user can select multiple\n   values.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this._setName(this.name);\n\n    if (this._multiple) {\n      this._elements.tagList.hidden = false;\n    } else {\n      this._elements.tagList.hidden = true;\n      this._elements.tagList.items.clear();\n    }\n\n    this.labelledBy = this.labelledBy;\n  }\n\n  /**\n   Amount of time, in milliseconds, to wait after typing a character before the suggestion is shown.\n\n   @type {Number}\n   @default 200\n   @htmlattribute delay\n   */\n  get delay() {\n    return typeof this._delay === 'number' ? this._delay : 200;\n  }\n\n  set delay(value) {\n    value = transform.number(value);\n\n    if (typeof value === 'number' && value >= 0) {\n      this._delay = transform.number(value);\n    }\n  }\n\n  /**\n   Set to <code>true</code> to restrict the selected value to one of the given options from the suggestions.\n   When set to <code>false</code>, users can enter anything.\n\n   <strong>NOTE:</strong> This API is under review and may be removed or changed in a subsequent release.\n   @ignore\n\n   @type {Boolean}\n   @default false\n   @htmlattribute forceselection\n   @htmlattributereflected\n   */\n  get forceSelection() {\n    return this._forceSelection || false;\n  }\n\n  set forceSelection(value) {\n    this._forceSelection = transform.booleanAttr(value);\n    this._reflectAttribute('forceselection', this._forceSelection);\n  }\n\n  /**\n   A hint to the user of what can be entered.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  get placeholder() {\n    return this._elements.input.placeholder;\n  }\n\n  set placeholder(value) {\n    this._elements.input.placeholder = value;\n    this._reflectAttribute('placeholder', this.placeholder);\n  }\n\n  /**\n   Max length for the Input field\n\n   @type {Number}\n   @htmlattribute maxlength\n   @htmlattributereflected\n   */\n  get maxLength() {\n    return this._elements.input.maxLength;\n  }\n\n  set maxLength(value) {\n    this._elements.input.maxLength = value;\n    this._reflectAttribute('maxlength', this._elements.input.maxLength);\n  }\n\n  /**\n   The Autocomplete's variant. See {@link AutocompleteVariantEnum}.\n\n   @type {AutocompleteVariantEnum}\n   @default AutocompleteVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    if (this._variant === variant.QUIET) {\n      this._elements.inputGroup.classList.add('_coral-InputGroup--quiet');\n      this._elements.input.variant = Textfield.variant.QUIET;\n      this._elements.trigger.classList.add('_coral-FieldButton--quiet');\n    } else {\n      this._elements.inputGroup.classList.remove('_coral-InputGroup--quiet');\n      this._elements.input.variant = Textfield.variant.DEFAULT;\n      this._elements.trigger.classList.remove('_coral-FieldButton--quiet');\n    }\n  }\n\n  /**\n   The match mode. See {@link AutocompleteMatchEnum}.\n\n   @type {String}\n   @default AutocompleteMatchEnum.CONTAINS\n   @htmlattribute match\n   */\n  get match() {\n    return this._match || match.CONTAINS;\n  }\n\n  set match(value) {\n    if (typeof value === 'function') {\n      this._match = value;\n      this._matchFunction = value;\n    } else {\n      value = transform.string(value).toLowerCase();\n      this._match = validate.enumeration(match)(value) && value || match.CONTAINS;\n\n      if (this._match === match.STARTSWITH) {\n        this._matchFunction = this._optionStartsWithValue;\n      } else if (this._match === match.CONTAINS) {\n        this._matchFunction = this._optionContainsValue;\n      }\n    }\n  }\n\n  /**\n   Indicates that the component is currently loading remote data. This will set the wait indicator inside the list.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute loading\n   */\n  get loading() {\n    return this._loading || false;\n  }\n\n  set loading(value) {\n    this._loading = transform.booleanAttr(value);\n\n    if (this._loading) {\n      const overlay = this._elements.overlay;\n\n      // we decide first if we need to scroll to the bottom since adding the load will change the dimensions\n      const scrollToBottom = overlay.scrollTop >= overlay.scrollHeight - overlay.clientHeight;\n\n      // if it does not exist we create it\n      if (!this._elements.loadIndicator) {\n        loadIndicator.call(this._elements);\n      }\n\n      // inserts the item at the end\n      this._elements.selectList.appendChild(this._elements.loadIndicator);\n\n      // we make the load indicator visible\n      if (scrollToBottom) {\n        overlay.scrollTop = overlay.scrollHeight;\n      }\n    } else if (this._elements.loadIndicator) {\n      this._elements.loadIndicator.remove();\n    }\n  }\n\n  /**\n   Returns an Array containing the set selected items.\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Returns the first selected item in the Autocomplete. The value <code>null</code> is returned if no element is\n   selected.\n   @type {?HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getAllSelected()[0] || null;\n  }\n\n  /**\n   The current value, as submitted during form submission.\n   When {@link Coral.Autocomplete#multiple} is <code>true</code>, the first selected value will be returned.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    // Get the first value (or empty string)\n    const values = this.values;\n    return values && values.length > 0 ? values[0] : '';\n  }\n\n  set value(value) {\n    this.values = [transform.string(value)];\n  }\n\n  /**\n   The current values, as submitted during form submission.\n   When {@link Coral.Autocomplete#multiple} is <code>false</code>, this will be an array of length 1.\n\n   @type {Array.<String>}\n   */\n  get values() {\n    return this._values;\n  }\n\n  set values(values) {\n    if (values === undefined || values === null) {\n      values = [];\n    }\n\n    if (Array.isArray(values)) {\n      // if value was set to empty string\n      if (values.length === 1 && values[0] === '') {\n        values = [];\n      }\n\n      let i;\n      let value;\n      const selectedValues = [];\n\n      // Valid values only\n      if (this.forceSelection) {\n        // Add each valid value\n        for (i = 0 ; i < values.length ; i++) {\n          value = values[i];\n          if (this._optionsMap[value] !== undefined) {\n            selectedValues.push(value);\n          }\n        }\n      }\n      // Any value goes\n      else {\n        for (i = 0 ; i < values.length ; i++) {\n          value = values[i];\n          selectedValues.push(value);\n        }\n      }\n\n      if (this.multiple) {\n        // Remove existing tags, DOM selection, etc\n        // This is a full override\n        this._clearValues();\n\n        // Add each tag\n        for (i = 0 ; i < selectedValues.length ; i++) {\n          value = selectedValues[i];\n\n          // Ensure the item is selected if it's present in the DOM\n          // This keeps the DOM in sync with the JS API and prevents bugs like CUI-5681\n          this._selectItem(value);\n\n          // Add the value to the tag list\n          this._addValue(value, null, true);\n        }\n      } else {\n        // Set value\n        this._values = selectedValues.length > 0 ? [selectedValues[0]] : [];\n        this._reflectCurrentValue();\n      }\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._getName();\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._setName(value);\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    // Add to outer component\n    this._elements.inputGroup.classList.toggle('is-invalid', this.invalid);\n    this._elements.trigger.classList.toggle('is-invalid', this.invalid);\n    this._elements.input.invalid = this.invalid;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.inputGroup.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.input.disabled = this._disabled;\n\n    const disabledOrReadOnly = this._disabled || this.readOnly;\n    this._elements.trigger.disabled = disabledOrReadOnly;\n    this._elements.tagList.disabled = disabledOrReadOnly;\n    // Prevents the overlay to be shown\n    this._elements.inputGroup.disabled = disabledOrReadOnly;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.input.readOnly = this._readOnly;\n\n    const readOnlyOrDisabled = this._readOnly || this.disabled;\n    this._elements.trigger.readOnly = readOnlyOrDisabled;\n    this._elements.tagList.readOnly = readOnlyOrDisabled;\n    // Prevents the overlay to be shown\n    this._elements.inputGroup.disabled = readOnlyOrDisabled;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    this[this.labelled ? 'setAttribute' : 'removeAttribute']('aria-label', this.labelled);\n    this._elements.selectList[this.labelled ? 'setAttribute' : 'removeAttribute']('aria-label', this.labelled);\n\n    if (this.labelled && this.multiple) {\n      this._elements.tagList.setAttribute('aria-label', this.labelled);\n    } else {\n      this._elements.tagList.removeAttribute('aria-label');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    this[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n    this._elements.selectList[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n\n    if (this.labelledBy && this.multiple) {\n      this._elements.tagList.setAttribute('aria-labelledby', this.labelledBy);\n    } else {\n      this._elements.tagList.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /**\n   @ignore\n\n   Not supported anymore.\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    this._icon = transform.string(value);\n    this._reflectAttribute('icon', this._icon);\n  }\n\n  /** @private */\n  _getName() {\n    if (this.multiple) {\n      return this._elements.tagList.name;\n    }\n\n    return this._elements.field.name;\n  }\n\n  /**\n   Set the name accordingly for multiple/single mode so the form submits contain only the right fields.\n\n   @private\n   */\n  _setName(value) {\n    if (this.multiple) {\n      this._elements.tagList.name = value;\n      this._elements.field.name = '';\n    } else {\n      this._elements.field.name = value;\n      this._elements.tagList.name = '';\n    }\n  }\n\n  /** @private */\n  _startObserving() {\n    this._observer.observe(this, {\n      // Only watch the childList\n      // Items will tell us if selected/value/content changes\n      childList: true\n    });\n  }\n\n  /**\n   Stop watching for mutations. This should be done before manually updating observed properties.\n\n   @protected\n   */\n  _stopObserving() {\n    this._observer.disconnect();\n  }\n\n  // Override to do nothing\n  _onInputChange(event) {\n    // stops the current event\n    event.stopPropagation();\n\n    if (!this.multiple) {\n      const inputText = this._elements.input.value.toLowerCase();\n\n      if (this.forceSelection || inputText === '') {\n        // We need a way to deselect item in single selection mode\n        // 1) by using an empty string if this.forceSelection === false\n        // 2) by using an invalid string if this.forceSelection === true\n        const items = this.items.getAll();\n        for (let i = 0 ; i < items.length ; i++) {\n          if (items[i].value.toLowerCase() !== inputText) {\n            items[i].selected = false;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   Handle mutations to children and childList. This is used to keep the options in sync with DOM changes.\n\n   @private\n   */\n  _handleMutation(mutations) {\n    for (let i = 0 ; i < mutations.length ; i++) {\n      const mutation = mutations[i];\n      const target = mutation.target;\n\n      if (mutation.type === 'childList' && target === this) {\n        this._setStateFromDOM();\n        return;\n      }\n    }\n  }\n\n  /**\n   Update the option set and selected options from the DOM.\n\n   @private\n   */\n  _setStateFromDOM() {\n    this._createOptionsFromDOM();\n    this._setSelectedFromDOM();\n  }\n\n  /**\n   Create the set of options from nodes in the DOM.\n\n   @private\n   */\n  _createOptionsFromDOM() {\n    // Reset options array and value to content map\n    this._options.length = 0;\n    this._optionsMap = {};\n\n    this.items.getAll().forEach((item) => {\n      // Don't use properties as children may not be initialized yet\n      const itemObj = {\n        value: item.getAttribute('value'),\n        icon: item.getAttribute('icon'),\n        disabled: item.hasAttribute('disabled'),\n        content: item.innerHTML.replace(/\\s{2,}/g, ' ').trim(),\n        text: item.innerText\n      };\n      this._options.push(itemObj);\n      this._optionsMap[itemObj.value] = itemObj;\n    });\n\n    // @todo update value in hidden field if changed value = old value?\n  }\n\n  /** @private */\n  _setInputValues(value, content) {\n    this._elements.field.value = value;\n\n    // Set text into input if in \"multiple selection mode\" or in \"single selection mode and content is not empty\"\n    // otherwise keep the current text for us (should be marked red)\n    if (this.multiple || content !== '') {\n      this._elements.input.value = content.trim();\n    }\n  }\n\n  /** @private */\n  _reflectCurrentValue() {\n    // Use empty string if no values\n    const value = this._values.length > 0 ? this._values[0] : '';\n\n    // Reflect the value in the field for form submit\n    this._elements.field.value = value;\n\n    let content = '';\n    if (value !== '') {\n      // Find the object with the corresponding content\n      const itemObj = this._optionsMap[value];\n\n      if (itemObj) {\n        // Reflect the content in the input\n        /*\n          prefence would be first given to innerText instead of innerHtml\n          as special characters like '&' transformed as ;amp in case of innerHtml.\n        */\n        content = itemObj.text && itemObj.text !== '' ? itemObj.text : itemObj.content;\n      } else {\n        // Just use the provided value\n        content = value;\n      }\n    }\n\n    this._setInputValues(value, content);\n  }\n\n  /**\n   Update the option set and selected options from the DOM\n   @ignore\n   */\n  _setSelectedFromDOM() {\n    const selectedItems = this.selectedItems;\n\n    if (selectedItems.length) {\n      // Use this.hasAttribute('multiple') instead of this.multiple here, as this method is called from _render and element might not be ready\n      if (this.hasAttribute('multiple')) {\n        // Remove current tags\n        this._resetValues();\n\n        // Add new ones\n        for (let i = 0 ; i < selectedItems.length ; i++) {\n          const value = selectedItems[i].getAttribute('value');\n          const content = selectedItems[i].innerHTML;\n          this._addValue(value, content, true);\n        }\n      } else {\n        // Select last\n        const last = selectedItems[selectedItems.length - 1];\n\n        // Deselect others\n        this._deselectExcept(last, selectedItems);\n\n        // Set value from the attribute\n        // We don't want to use the property as the sub-component may not have been upgraded yet\n        this.value = last.getAttribute('value');\n      }\n    } else if (!this.hasAttribute('value')) {\n      if (this.hasAttribute('multiple')) {\n        this._resetValues();\n      } else {\n        this.value = '';\n      }\n    }\n  }\n\n  /**\n   De-select every item except the provided item.\n\n   @param {HTMLElement} exceptItem\n   The item not to select\n   @param {Array.<HTMLElement>} [items]\n   The set of items to consider when deselecting. If not provided, the current set of selected items is used.\n\n   @private\n   */\n  _deselectExcept(exceptItem, items) {\n    const selectedItems = items || this.selectedItems;\n\n    // Deselect others\n    this._stopObserving();\n    for (let i = 0 ; i < selectedItems.length ; i++) {\n      if (selectedItems[i] !== exceptItem) {\n        selectedItems[i].removeAttribute('selected');\n      }\n    }\n    this._startObserving();\n  }\n\n  /**\n   Add a tag to the taglist.\n\n   @private\n   */\n  _addValue(value, content, asHTML) {\n    if (!content) {\n      // Find the content\n      const itemObj = this._optionsMap[value];\n      if (itemObj) {\n        content = itemObj.content;\n      } else {\n        // Just use the value\n        content = value;\n      }\n    }\n\n    // Add to selected values\n    const index = this._values.indexOf(value);\n    if (index === -1) {\n      this._values.push(value);\n    }\n\n    const labelContent = {};\n    if (asHTML) {\n      labelContent.innerHTML = content;\n    } else {\n      labelContent.textContent = content;\n    }\n\n    // Create a new tag\n    const tag = new Tag().set({\n      label: labelContent,\n      value: value\n    });\n\n    // Add to map\n    this._tagMap[value] = tag;\n\n    // Add to taglist\n    this._elements.tagList.items.add(tag);\n\n    // make sure to remove text from input box (to easily choose next item)\n    this._setInputValues('', '');\n  }\n\n  /**\n   Remove a tag from the taglist.\n\n   @private\n   */\n  _removeValue(value) {\n    // Remove from selected values\n    const index = this._values.indexOf(value);\n\n    if (index === -1) {\n      // Get out if we don't have the value\n      return;\n    }\n\n    this._values.splice(index, 1);\n\n    // Select autocomplete item\n    const item = this.querySelector(`coral-autocomplete-item[value=${JSON.stringify(value)}]`);\n\n    if (item) {\n      if (item.hasAttribute('selected')) {\n        this._stopObserving();\n        item.removeAttribute('selected');\n        this._startObserving();\n      }\n    }\n\n    // Look up the tag by value\n    const tag = this._tagMap[value];\n\n    if (tag) {\n      // Remove from map\n      this._tagMap[value] = null;\n\n      // Remove from taglist\n      this._elements.tagList.items.remove(tag);\n    }\n\n    if (index !== -1) {\n      // Emit the change event when a value is removed but only after a user interaction\n      this.trigger('change');\n    }\n  }\n\n  /**\n   Remove all tags from the taglist.\n\n   @private\n   */\n  _clearValues() {\n    this._resetValues();\n\n    // Deselect items\n    this._stopObserving();\n    const items = this.querySelectorAll('coral-autocomplete-item[selected]');\n    for (let i = 0 ; i < items.length ; i++) {\n      items[i].removeAttribute('selected');\n    }\n\n    this._startObserving();\n  }\n\n  /**\n   Reset values without affecting the DOM.\n\n   @private\n   */\n  _resetValues() {\n    // Reset values\n    this._values = [];\n\n    // Drop references to tags\n    this._tagMap = {};\n\n    // Clear taglist\n    this._elements.tagList.items.clear();\n  }\n\n  /** @private */\n  _focusNextItem() {\n    // Display focus on next item in the selectList\n    const selectList = this._elements.selectList;\n    const currentItem = selectList.querySelector('.is-focused');\n    const input = this._elements.input;\n    const items = selectList._getSelectableItems();\n    let index;\n    let item;\n\n    if (currentItem) {\n      index = items.indexOf(currentItem);\n      if (index < items.length - 1) {\n        item = items[index + 1];\n      }\n    } else if (items && items.length > 0) {\n      item = items[0];\n    }\n\n    window.requestAnimationFrame(() => {\n      if (item) {\n        if (currentItem) {\n          currentItem.classList.remove('is-focused');\n        }\n        this._scrollItemIntoView(item);\n        item.classList.add('is-focused');\n        input.setAttribute('aria-activedescendant', item.id);\n      }\n      if (!selectList.querySelector('.is-focused')) {\n        input.removeAttribute('aria-activedescendant');\n      }\n    });\n  }\n\n  /** @private */\n  _focusPreviousItem() {\n    // Display focus on previous item in the selectList\n    const selectList = this._elements.selectList;\n    const currentItem = selectList.querySelector('.is-focused');\n    const input = this._elements.input;\n    const items = selectList._getSelectableItems();\n    let index;\n    let item;\n\n    if (currentItem) {\n      index = items.indexOf(currentItem);\n      if (index > 0) {\n        item = items[index - 1];\n      }\n      currentItem.classList.remove('is-focused');\n    } else if (items && items.length > 0) {\n      item = items[items.length - 1];\n    }\n\n    window.requestAnimationFrame(() => {\n      if (item) {\n        this._scrollItemIntoView(item);\n        item.classList.add('is-focused');\n        input.setAttribute('aria-activedescendant', item.id);\n      }\n      if (!selectList.querySelector('.is-focused')) {\n        input.removeAttribute('aria-activedescendant');\n      }\n    });\n  }\n\n  /** @private */\n  _showSuggestions() {\n    // Get value from the input\n    const inputValue = this._elements.input.value.toLowerCase().trim();\n\n    // Since we're showing fresh suggestions, clear the existing suggestions\n    this.clearSuggestions();\n\n    // Trigger an event\n    const event = this.trigger('coral-autocomplete:showsuggestions', {\n      // Pass user input\n      value: inputValue,\n      // Started at zero here, always\n      start: 0\n    });\n\n    // Flag to indicate that the private method is called before public showSuggestions method\n    this._showSuggestionsCalled = true;\n\n    if (event.defaultPrevented) {\n      // Set loading mode\n      this.loading = true;\n\n      // Show the menu\n      this.showSuggestions();\n    } else {\n      // Show suggestions that match in the DOM\n      this.addSuggestions(this._getMatches(inputValue, this._optionContainsValue));\n      this.showSuggestions();\n    }\n  }\n\n  _onOverlayPositioned(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    if (this._elements.overlay.open) {\n      this._elements.overlay.style.width = `${this.offsetWidth}px`;\n    }\n  }\n\n  _onGlobalClick(event) {\n    if (!this._elements.overlay.open) {\n      return;\n    }\n\n    const eventTargetWithinOverlayTarget = this._elements.inputGroup.contains(event.target);\n    const eventTargetWithinItself = this._elements.overlay.contains(event.target);\n    if (!eventTargetWithinOverlayTarget && !eventTargetWithinItself) {\n      this.hideSuggestions();\n    }\n  }\n\n  /** @private */\n  _onScroll() {\n    this._isOverlayScrolling = true;\n    window.clearTimeout(this._scrollTimeout);\n    this._scrollTimeout = window.setTimeout(this._handleScrollBottom, SCROLL_DEBOUNCE);\n  }\n\n  /** @private */\n  _onMouseWheel(event) {\n    const selectList = this._elements.selectList;\n    // If scrolling with mouse wheel and if it has hit the top or bottom boundary\n    // `SCROLL_BOTTOM_THRESHOLD` is ignored when hitting scroll bottom to allow debounced loading\n    if (event.deltaY < 0 && selectList.scrollTop === 0 || event.deltaY > 0 && selectList.scrollTop >= selectList.scrollHeight - selectList.clientHeight) {\n      event.preventDefault();\n    }\n  }\n\n  _onMouseDown(event) {\n    this._isOverlayScrollBarClicked = event.matchedTarget.clientWidth <= event.offsetX;\n  }\n\n  /** @private */\n  _handleScrollBottom() {\n    const selectList = this._elements.selectList;\n\n    if (selectList.scrollTop >= selectList.scrollHeight - selectList.clientHeight - SCROLL_BOTTOM_THRESHOLD) {\n      const inputValue = this._elements.input.value;\n\n      // Do not clear the suggestions here, instead we'll expect them to append\n\n      // Trigger an event\n      const event = this.trigger('coral-autocomplete:showsuggestions', {\n        // Pass user input\n        value: inputValue,\n        start: selectList.items.length\n      });\n\n      if (event.defaultPrevented) {\n        // Set loading mode\n        this.loading = true;\n      }\n    }\n  }\n\n  /** @private */\n  _handleFocusOut(event) {\n    const selectList = this._elements.selectList;\n    const target = event.target;\n    const inputBlur = target === this._elements.input;\n\n    if (this._blurTimeout) {\n      clearTimeout(this._blurTimeout);\n    }\n\n    // This is to hack around the fact that you cannot determine which element gets focus in a blur event\n    // Firefox doesn't support focusout/focusin, so we're left doing awful things\n    this._blurTimeout = window.setTimeout(() => {\n      const relatedTarget = document.activeElement;\n      const focusOutside = !this.contains(relatedTarget) && !this._elements.overlay.contains(relatedTarget);\n\n      // If focus has moved out of the autocomplete, it's an input event\n      if (inputBlur && focusOutside && !this.multiple) {\n        this._handleInput(event);\n      }\n      // Nothing was focused\n      else if (!relatedTarget || ((inputBlur || relatedTarget !== document.body) &&\n        // Focus is now outside of the autocomplete component\n        focusOutside ||\n        // Focus has shifted from the selectList to another element inside of the autocomplete component\n        selectList.contains(target) && !selectList.contains(relatedTarget))) {\n        this.hideSuggestions();\n      }\n    }, 0);\n  }\n\n  /** @private */\n  _handleListFocusShift(event) {\n    if (this._elements.overlay.open) {\n      // Stop focus shift\n      event.preventDefault();\n      event.stopImmediatePropagation();\n\n      this._hideSuggestionsAndFocus();\n    }\n  }\n\n  /** @private */\n  _hideSuggestionsAndFocus() {\n    // Hide the menu and focus on the input\n    this.hideSuggestions();\n    this._elements.input.focus();\n  }\n\n  /** @private */\n  _handleTriggerClick() {\n    if (this._elements.overlay.classList.contains('is-open')) {\n      this._hideSuggestionsAndFocus();\n    } else {\n      // Focus on the input so down arrow works as expected\n      // Per @mijordan\n      this._showSuggestions();\n      this._elements.input.focus();\n    }\n  }\n\n  /** @private */\n  _handleTriggerMousedown() {\n    this._elements.trigger.focus();\n  }\n\n  /** @private */\n  _handleListItemFocus(event) {\n    const item = event.matchedTarget;\n    const selectList = this._elements.selectList;\n    const currentItem = selectList.querySelector('.is-focused');\n    const input = this._elements.input;\n\n    if (currentItem) {\n      currentItem.classList.remove('is-focused');\n      input.removeAttribute('aria-activedescendant');\n    }\n    if (!item.disabled) {\n      this._scrollItemIntoView(item);\n      item.classList.add('is-focused');\n      input.setAttribute('aria-activedescendant', item.id);\n    }\n  }\n\n  /** @private */\n  _scrollItemIntoView(item) {\n    const itemRect = item.getBoundingClientRect();\n    const selectListRect = this._elements.selectList.getBoundingClientRect();\n    if (itemRect.top < selectListRect.top) {\n      item.scrollIntoView();\n    } else if (itemRect.bottom > selectListRect.bottom) {\n      item.scrollIntoView(false);\n    }\n  }\n\n  /** @private */\n  _getMatches(value, optionMatchesValue) {\n    optionMatchesValue = optionMatchesValue || this._matchFunction;\n\n    const matches = [];\n\n    for (let i = 0 ; i < this._options.length ; i++) {\n      if (optionMatchesValue(this._options[i], value)) {\n        matches.push(this._options[i]);\n      }\n    }\n\n    if (!matches.length) {\n      // If there are no matches in _options,\n      // Check for matches in list, which could have been added after mounting the element\n      const buttons = this._elements.selectList.items.getAll();\n      for (let i = 0 ; i < buttons.length ; i++) {\n        const option = {\n          value: buttons[i].value,\n          content: buttons[i].textContent.trim()\n        };\n        if (optionMatchesValue(option, value)) {\n          matches.push(option);\n        }\n      }\n    }\n\n    return matches;\n  }\n\n  /** @private */\n  _handleInputKeypressEnter(event) {\n    // Sigh, CUI-3973 Hitting enter quickly after typing causes form to submit\n    if (event.which === 13) {\n      this._handleInput(event);\n    }\n  }\n\n  /** @private */\n  _handleInputEvent() {\n    // Any input makes this valid again\n    this.invalid = false;\n\n    if (this.delay) {\n      // Wait until the use has stopped typing for delay milliseconds before getting suggestions\n      window.clearTimeout(this._timeout);\n      this._timeout = window.setTimeout(this._showSuggestions.bind(this), this.delay);\n    } else {\n      // Immediately get suggestions\n      this._showSuggestions();\n    }\n  }\n\n  /** @private */\n  _handleInput(event) {\n    // Don't set value and hide suggestions while scrolling overlay\n    if (this._isOverlayScrolling || this._isOverlayScrollBarClicked) {\n      this._isOverlayScrolling = false;\n      this._isOverlayScrollBarClicked = false;\n      return;\n    }\n\n    // Stop the event\n    event.preventDefault();\n\n    let focusedItemValue;\n\n    // If a selectList item has focus, set the input value to the value of the selected item.\n    if (this._elements.overlay.open && this._elements.input.getAttribute('aria-activedescendant')) {\n      const focusedItem = this._elements.selectList.querySelector('.is-focused');\n      if (focusedItem) {\n        // Use the text content value of the item for comparison\n        focusedItemValue = focusedItem.textContent.trim();\n      }\n    }\n\n    const value = focusedItemValue || this._elements.input.value;\n\n    let isChange = false;\n\n    // Get all exact matches\n    const exactMatches = this._getMatches(value, this._optionEqualsValue);\n\n    if (exactMatches.length) {\n      // Find perfect case sensitive match else defaults to first one\n      const exactMatch = exactMatches.filter((option) => option.content === value)[0] || exactMatches[0];\n\n      isChange = this.value !== exactMatch.value;\n\n      // Select the matched item\n      this._selectItem(exactMatch.value, exactMatch.content, false);\n\n      if (this.multiple) {\n        if (value.trim()) {\n          // Add tag for non-empty values\n          this._addValue(exactMatch.value, exactMatch.content, false);\n        }\n      } else {\n        // Set value\n        this.value = exactMatch.value;\n      }\n\n      // value can't be invalid as an exact match is selected\n      if (this.forceSelection) {\n        this.invalid = false;\n      }\n\n      // Hide the suggestions so the result can be seen\n      this.hideSuggestions();\n\n      // Emit the change event when a selection is made from an exact match\n      if (isChange === true) {\n        this.trigger('change');\n      }\n    } else if (this.forceSelection) {\n      // Invalid\n      if (this.multiple) {\n        this.invalid = value !== '' || (this.values.length === 1 && this.values[0] === '' || this.values.length === 0);\n      } else {\n        this.invalid = true;\n      }\n      // Leave suggestions open if nothing matches\n    } else {\n      // DO NOT select the corresponding item, as this would add an item\n      // This would result in adding items that match what the user typed, resulting in selections\n      // this._selectItem(value);\n\n      isChange = this.value !== value;\n\n      if (this.multiple) {\n        if (value.trim()) {\n          // Add tag for non-empty values\n          this._addValue(value, null, false);\n        }\n      } else {\n        // Set value\n        this.value = value;\n      }\n\n      // Hide the suggestions so the result can be seen\n      this.hideSuggestions();\n\n      // Emit the change event when arbitrary data is entered\n      if (isChange === true) {\n        this.trigger('change');\n      }\n    }\n\n    this._updateButtonAccessibilityLabel();\n  }\n\n  /**\n   This ensures the collection API is up to date with selected items, even if they come from suggestions.\n\n   @private\n   */\n  _selectItem(value, content, asHTML) {\n    // Don't get caught up with internal changes\n    this._stopObserving();\n\n    // Select autocomplete item if it's there\n    const item = this.querySelector(`coral-autocomplete-item[value=${JSON.stringify(value)}]`);\n    if (item) {\n      // Select the existing item\n      item.setAttribute('selected', '');\n    } else {\n      const labelContent = {};\n      content = typeof content === 'undefined' ? value : content;\n      if (asHTML) {\n        labelContent.innerHTML = content;\n      } else {\n        labelContent.textContent = content;\n      }\n\n      // Add a new, selected item\n      this.items.add(new AutocompleteItem().set({\n        value: value,\n        content: labelContent,\n        selected: true\n      }));\n    }\n\n    // Resume watching for changes\n    this._startObserving();\n  }\n\n  /** @private */\n  _handleInputUpKeypress(event) {\n    // Stop any consequences of pressing the key\n    event.preventDefault();\n\n    if (this._elements.overlay.open) {\n      if (event.altKey) {\n        this.hideSuggestions();\n      } else {\n        this._focusPreviousItem();\n      }\n    } else {\n      // Show the menu and do not focus on the first item\n      // Implements behavior of http://www.w3.org/TR/wai-aria-practices/#autocomplete\n      this._showSuggestions();\n    }\n  }\n\n  /** @private */\n  _handleInputDownKeypress(event) {\n    // Stop any consequences of pressing the key\n    event.preventDefault();\n\n    if (this._elements.overlay.open) {\n      this._focusNextItem();\n    } else {\n      // Show the menu and do not focus on the first item\n      // Implements behavior of http://www.w3.org/TR/wai-aria-practices/#autocomplete\n      this._showSuggestions();\n    }\n  }\n\n  /** @private */\n  _handleInputTabKeypress(event) {\n    // if the select list is open and a list item has focus, prevent default to trap focus.\n    if (this._elements.overlay.open && this._elements.input.getAttribute('aria-activedescendant')) {\n      event.preventDefault();\n    }\n  }\n\n  /**\n   Handle selections in the selectList.\n\n   @ignore\n   */\n  _handleSelect(event) {\n    const selectListItem = event.matchedTarget;\n\n    if (!selectListItem || selectListItem.disabled) {\n      // @todo it doesn't seem like this should ever happen, but it does\n      return;\n    }\n\n    // Select the corresponding item, or add one if it doesn't exist\n    this._selectItem(selectListItem.value, selectListItem.content.innerHTML, true);\n\n    if (!this.multiple) {\n      this.value = selectListItem.value;\n\n      // Make sure the value is changed\n      // The setter won't run if we set the same value again\n      // This forces the DOM to update\n      this._setInputValues(this.value, selectListItem.content.textContent, false);\n    } else {\n      // Add to values\n      this._addValue(selectListItem.value, selectListItem.content.innerHTML, true);\n    }\n\n    // Focus on the input element\n    // We have to wait a frame here because the item steals focus when selected\n    window.requestAnimationFrame(() => {\n      this._elements.input.focus();\n    });\n\n    // Hide the options when option is selected in all cases\n    this.hideSuggestions();\n\n    // Emit the change event when a selection is made\n    this.trigger('change');\n  }\n\n  /**\n   Don't let the internal change event bubble and confuse users\n\n   @ignore\n   */\n  _preventTagListChangeEvent(event) {\n    event.stopImmediatePropagation();\n  }\n\n  _handleTagAdded() {\n    // Forces tags to wrap\n    this._elements.tagList.style.width = `${this.offsetWidth}px`;\n  }\n\n  /**\n   Handle tags that are removed by the user.\n\n   @ignore\n   */\n  _handleTagRemoved(event) {\n    // Get the tag from the event\n    const tagValue = event.detail.item.value;\n\n    // Remove from values only if there is no other tags with the same value are attached (as this component constantly adds and removes tags)\n    // this._elements.tagList.values does not seem to work so iterate over the tags to check values\n    let removeValue = true;\n    const tags = this._elements.tagList.items.getAll();\n    for (let i = 0 ; i < tags.length ; i++) {\n      if (tags[i].value === tagValue) {\n        removeValue = false;\n        break;\n      }\n    }\n\n    if (removeValue) {\n      this._removeValue(tagValue);\n    }\n\n    // If all tags were removed, return focus to the input\n    if (this.selectedItems.length === 0) {\n      this._elements.input.focus();\n    }\n\n    this._updateButtonAccessibilityLabel();\n  }\n\n  /**\n   Handles value changes on a child item.\n\n   @private\n   */\n  _handleItemValueChange(event) {\n    // stop event propogation\n    event.stopImmediatePropagation();\n\n    // Update option map from scratch\n    // @todo use attributeOldValue mutationobserver option and update map instead of re-creating\n    this._createOptionsFromDOM();\n  }\n\n  /**\n   Handles content changes on a child item.\n\n   @private\n   */\n  _handleItemContentChange(event) {\n    // stop event propogation\n    event.stopImmediatePropagation();\n\n    // Update option map from scratch with new content\n    this._createOptionsFromDOM();\n  }\n\n  /**\n   Handles selected changes on a child item.\n\n   @private\n   */\n  _handleItemSelectedChange(event) {\n    // stop event propogation\n    event.stopImmediatePropagation();\n\n    const target = event.target;\n    const selected = target.hasAttribute('selected');\n    if (this.multiple) {\n      this[selected ? '_addValue' : '_removeValue'](target.value, target.content.innerHTML, true);\n    } else if (selected) {\n      // Set the input text accordingly\n      this._elements.input.value = target.content.textContent.replace(/\\s{2,}/g, ' ').trim();\n      // Set the value accordingly\n      this.value = target.value;\n      // value can't be invalid as an item is selected\n      this.invalid = false;\n\n      // Deselect the other elements if selected programatically changed\n      this._deselectExcept(target);\n    }\n      // Remove values if deselected\n      // Only do this if we're the current value\n    // If the selected item was changed, this.value will be different\n    else if (this.value === target.value) {\n      this.value = '';\n\n      // CUI-5533 Since checks inside of _handleInput will assume the value hasn't change,\n      // We need to trigger here\n      this.trigger('change');\n    }\n  }\n\n  /**\n   Check if the given option partially matches the given value.\n\n   @param {HTMLElement} option\n   The option to test\n   @param {String} value\n   The value to test\n\n   @returns {Boolean} true if the value matches, false if not.\n\n   @protected\n   */\n  _optionContainsValue(option, value) {\n    value = (typeof value === 'string' ? value : '').toLowerCase();\n    return (option.text || option.content).toLowerCase().indexOf(value) !== -1;\n  }\n\n  /**\n   Check if the given option starts with the given value.\n\n   @param {HTMLElement} option\n   The option to test\n   @param {String} value\n   The value to test\n\n   @returns {Boolean} true if the value matches, false if not.\n\n   @protected\n   */\n  _optionStartsWithValue(option, value) {\n    value = (typeof value === 'string' ? value : '').toLowerCase();\n    return option.content.toLowerCase().trim().indexOf(value) === 0;\n  }\n\n  /**\n   Check if the given option exactly matches the given value.\n\n   @param {HTMLElement} option\n   The option to test\n   @param {String} value\n   The value to test\n\n   @returns {Boolean} true if the value matches, false if not.\n\n   @protected\n   */\n  _optionEqualsValue(option, value) {\n    value = (typeof value === 'string' ? value : '').toLowerCase();\n    return option.content.toLowerCase().trim() === value;\n  }\n\n  /**\n   Updates label on toggle button to communicate number of suggestions in list.\n\n   @param {Number} num\n   The number of suggestions available\n   @private\n   */\n  _updateButtonAccessibilityLabel(num) {\n    let str = i18n.get('Show suggestions');\n\n    if (num === 1) {\n      str = i18n.get('Show suggestion');\n    } else if (num > 1) {\n      str = i18n.get('Show {0} suggestions', num);\n    }\n\n    this._elements.trigger.setAttribute('aria-label', str);\n    this._elements.trigger.setAttribute('title', str);\n  }\n\n  /**\n   Clears the current selected value or items.\n   */\n  clear() {\n    this.value = '';\n    this._elements.input.clear();\n\n    if (this.multiple) {\n      this._clearValues();\n    }\n  }\n\n  /**\n   Clear the list of suggestions.\n   */\n  clearSuggestions() {\n    this._elements.selectList.items.clear();\n    this._updateButtonAccessibilityLabel();\n  }\n\n  /**\n   A suggestion object.\n\n   @typedef {Object} AutocompleteSuggestion\n\n   @property {String} value\n   The form submission value to use when this suggestion is selected.\n   @property {String} [content=value]\n   The content to disable in the suggestion dropdown.\n   */\n\n  /**\n   Add the provided list of suggestions and clear loading status.\n\n   @param {Array.<AutocompleteSuggestion>} suggestions\n   The list of suggestions to show.\n   @param {Boolean} clear\n   If true, existing suggestions will be cleared.\n   */\n  addSuggestions(suggestions, clear) {\n    // Disable loading mode\n    this.loading = false;\n\n    if (clear) {\n      // Remove existing selectList items\n      this.clearSuggestions();\n    }\n\n    // Add items to the selectlist\n    for (let i = 0 ; i < suggestions.length ; i++) {\n      const value = suggestions[i].value;\n      const content = suggestions[i].content;\n      const icon = suggestions[i].icon;\n      const disabled = !!suggestions[i].disabled;\n\n      // Only add the item if it's not a selected value or we're in single mode\n      if (!this.multiple || this.values.indexOf(value) === -1) {\n        this._elements.selectList.items.add({\n          value: value,\n          type: 'button',\n          icon: icon,\n          disabled: disabled,\n          id: commons.getUID(),\n          tabIndex: -1,\n          content: {\n            innerHTML: content\n          }\n        });\n        this._elements.selectList.items.last().setAttribute('role', 'option');\n      }\n    }\n\n    if (!suggestions.length && !this._elements.selectList.items.length) {\n      // Show \"no results\" when no suggestions are found at all\n      this._elements.selectList.items.add({\n        type: 'button',\n        content: {\n          innerHTML: `<em>${i18n.get('No matching results.')}</em>`\n        },\n        disabled: true\n      });\n      this._elements.selectList.items.last().setAttribute('role', 'status');\n      this._elements.selectList.items.last().setAttribute('aria-live', 'polite');\n      this._elements.input.removeAttribute('aria-activedescendant');\n      this._updateButtonAccessibilityLabel();\n    } else {\n      this._updateButtonAccessibilityLabel(this._elements.selectList.items.length);\n    }\n  }\n\n  /**\n   Shows the suggestion UI.\n   */\n  showSuggestions() {\n    if (!this._showSuggestionsCalled) {\n      this._showSuggestions();\n    } else {\n      this._showSuggestionsCalled = false;\n    }\n\n    // Just show\n    this._elements.overlay.open = true;\n\n    // Force overlay repositioning (e.g because of remote loading)\n    requestAnimationFrame(() => {\n      this._elements.overlay._onAnimate();\n      this._elements.overlay.reposition();\n    });\n\n    this._elements.input.setAttribute('aria-expanded', 'true');\n    this._elements.trigger.setAttribute('aria-expanded', 'true');\n  }\n\n  /**\n   Hides the suggestion UI.\n   */\n  hideSuggestions() {\n    this._elements.overlay.open = false;\n\n    this._elements.input.setAttribute('aria-expanded', 'false');\n    this._elements.trigger.setAttribute('aria-expanded', 'false');\n    this._elements.input.removeAttribute('aria-activedescendant');\n\n    // Don't let the suggestions show\n    window.clearTimeout(this._timeout);\n\n    // Trigger an event\n    this.trigger('coral-autocomplete:hidesuggestions');\n  }\n\n  /**\n   Matches the accessibility to the state of the popover.\n\n   @ignore\n   */\n  _onOverlayOpenOrClose(event) {\n    if (this._elements.overlay.open) {\n      this._elements.input.setAttribute('aria-expanded', 'true');\n      this._elements.trigger.setAttribute('aria-expanded', 'true');\n    } else {\n      this._elements.input.setAttribute('aria-expanded', 'false');\n      this._elements.trigger.setAttribute('aria-expanded', 'false');\n      this._elements.input.removeAttribute('aria-activedescendant');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // reset the values to the initial values\n    this.values = this._initialSelectedValues;\n  }\n\n  /**\n   Returns {@link Autocomplete} match options.\n\n   @return {AutocompleteMatchEnum}\n   */\n  static get match() {\n    return match;\n  }\n\n  /**\n   Returns {@link Autocomplete} variants.\n\n   @return {AutocompleteVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      forceselection: 'forceSelection',\n      maxlength: 'maxLength'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'multiple',\n      'delay',\n      'forceselection',\n      'placeholder',\n      'maxlength',\n      'icon',\n      'match',\n      'loading',\n      'variant'\n    ]);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Container role per ARIA Autocomplete\n    this.setAttribute('role', 'group');\n\n    // Input attributes per ARIA Autocomplete\n    this._elements.input.setAttribute('role', 'combobox');\n    this._elements.input.setAttribute('aria-autocomplete', 'list');\n    this._elements.input.setAttribute('aria-haspopup', 'listbox');\n    this._elements.input.setAttribute('aria-expanded', 'false');\n    this._elements.input.setAttribute('aria-controls', this._elements.selectList.id);\n\n    // Trigger button attributes per ARIA Autocomplete\n    this._elements.trigger.setAttribute('aria-haspopup', 'listbox');\n    this._elements.trigger.setAttribute('aria-expanded', 'false');\n    this._elements.trigger.setAttribute('aria-controls', this._elements.selectList.id);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    // Render the template\n    frag.appendChild(this._elements.field);\n    frag.appendChild(this._elements.inputGroup);\n    frag.appendChild(this._elements.tagList);\n    frag.appendChild(this._elements.overlay);\n\n    this._elements.overlay.target = this._elements.trigger;\n\n    // Clean up\n    while (this.firstChild) {\n      const child = this.firstChild;\n      // Only works if all root template elements have a handle attribute\n      if (child.nodeType === Node.TEXT_NODE || child.hasAttribute && !child.hasAttribute('handle')) {\n        // Add non-template elements to the content\n        frag.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Append the fragment to the component\n    this.appendChild(frag);\n\n    // Set the state from the DOM when initialized\n    this._setStateFromDOM();\n\n    // save initial selection (used for reset)\n    this._initialSelectedValues = this.values.slice(0);\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n\n  /**\n   Triggered when the {@link Autocomplete} could accept external data to be loaded by the user.\n   If <code>preventDefault()</code> is called, then a loading indicator will be shown.\n   {@link Autocomplete#loading} should be set to false to indicate that the data has been successfully loaded.\n\n   @typedef {CustomEvent} coral-autocomplete:showsuggestions\n\n   @property {String} detail.value\n   The user input.\n   */\n\n  /**\n   Triggered when the {@link Autocomplete} hides the suggestions.\n   This is typically used to cancel a load request because the suggestions will not be shown anymore.\n\n   @typedef {CustomEvent} coral-autocomplete:hidesuggestions\n   */\n});\n\nexport default Autocomplete;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 486,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 487,
    "kind": "variable",
    "name": "SCROLL_BOTTOM_THRESHOLD",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~SCROLL_BOTTOM_THRESHOLD",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "The distance, in pixels, from the bottom of the List at which we assume the user has scrolled\nto the bottom of the list.",
    "lineNumber": 37,
    "ignore": true,
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 488,
    "kind": "variable",
    "name": "SCROLL_DEBOUNCE",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~SCROLL_DEBOUNCE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "The number of milliseconds for which scroll events should be debounced.",
    "lineNumber": 44,
    "ignore": true,
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 489,
    "kind": "typedef",
    "name": "AutocompleteVariantEnum",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~AutocompleteVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Autocomplete} variants.",
    "lineNumber": 56,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default, gray Autocomplete."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "An Autocomplete with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AutocompleteVariantEnum"
    }
  },
  {
    "__docId__": 490,
    "kind": "typedef",
    "name": "AutocompleteMatchEnum",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~AutocompleteMatchEnum",
    "access": "public",
    "description": "Enumeration for {@link Autocomplete} match options.",
    "lineNumber": 71,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "STARTSWITH",
        "description": "Include only matches that start with the user provided value."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CONTAINS",
        "description": "Include only matches that contain the user provided value."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AutocompleteMatchEnum"
    }
  },
  {
    "__docId__": 491,
    "kind": "variable",
    "name": "Autocomplete",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~Autocomplete",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Autocomplete}",
    "description": "An Autocomplete component that allows users to search and select from a list of options.",
    "lineNumber": 84,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Autocomplete"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An Autocomplete component that allows users to search and select from a list of options."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-autocomplete"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-autocomplete></coral-autocomplete>",
      "<caption>JS constructor</caption>\nnew Coral.Autocomplete();"
    ],
    "see": [
      "../examples/#autocomplete"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 492,
    "kind": "typedef",
    "name": "AutocompleteSuggestion",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~AutocompleteSuggestion",
    "access": "public",
    "description": "A suggestion object.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The form submission value to use when this suggestion is selected."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "value",
        "defaultRaw": "value",
        "name": "content",
        "description": "The content to disable in the suggestion dropdown."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "AutocompleteSuggestion"
    }
  },
  {
    "__docId__": 493,
    "kind": "typedef",
    "name": "coral-autocomplete:showsuggestions",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~coral-autocomplete:showsuggestions",
    "access": "public",
    "description": "Triggered when the {@link Autocomplete} could accept external data to be loaded by the user.\nIf <code>preventDefault()</code> is called, then a loading indicator will be shown.\n{@link Autocomplete#loading} should be set to false to indicate that the data has been successfully loaded.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.value",
        "description": "The user input."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-autocomplete:showsuggestions"
    }
  },
  {
    "__docId__": 494,
    "kind": "typedef",
    "name": "coral-autocomplete:hidesuggestions",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/Autocomplete.js~coral-autocomplete:hidesuggestions",
    "access": "public",
    "description": "Triggered when the {@link Autocomplete} hides the suggestions.\nThis is typically used to cancel a load request because the suggestions will not be shown anymore.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-autocomplete:hidesuggestions"
    }
  },
  {
    "__docId__": 495,
    "kind": "file",
    "name": "coral-spectrum/coral-component-autocomplete/src/scripts/AutocompleteItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.Autocomplete.Item\n @classdesc The Autocomplete Item\n @htmltag coral-autocomplete-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst AutocompleteItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._observer = new MutationObserver(this._handleMutation.bind(this));\n    this._observer.observe(this, {\n      characterData: true,\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   Value of the item. <code>textContent</code> is used if not provided.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    // keep spaces to only 1 max and trim to mimic native select option behavior\n    return typeof this._value === 'undefined' ?\n      this.getAttribute('value') || this.textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._value;\n  }\n\n  set value(value) {\n    let _value = transform.string(value);\n\n    if(this._value === _value) {\n      return;\n    }\n\n    this._value = _value;\n    this._reflectAttribute('value', this._value);\n\n    this.trigger('coral-autocomplete-item:_valuechanged');\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Whether this item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    let _selected = transform.booleanAttr(value);\n\n    if(this._selected === _selected) {\n      return;\n    }\n\n    this._selected = _selected;\n    this._reflectAttribute('selected', this._selected);\n\n    this.trigger('coral-autocomplete-item:_selectedchanged');\n  }\n\n  /**\n   Whether this item is disabled.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n  }\n\n  /** @private */\n  _handleMutation() {\n    this.trigger('coral-autocomplete-item:_contentchanged', {\n      content: this.textContent\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'value']);\n  }\n});\n\nexport default AutocompleteItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-autocomplete/src/scripts/AutocompleteItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 496,
    "kind": "variable",
    "name": "AutocompleteItem",
    "memberof": "coral-spectrum/coral-component-autocomplete/src/scripts/AutocompleteItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-autocomplete/src/scripts/AutocompleteItem.js~AutocompleteItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Autocomplete}",
    "description": "The Autocomplete Item",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Autocomplete.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Autocomplete Item"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-autocomplete-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-autocomplete-item></coral-autocomplete-item>",
      "<caption>JS constructor</caption>\nnew Coral.Autocomplete.Item();"
    ],
    "see": [
      "../examples/#autocomplete"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 497,
    "kind": "file",
    "name": "coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Banner';\n\n/**\n Enumeration for {@link Banner} variants.\n\n @typedef {Object} BannerVariantEnum\n\n @property {String} ERROR\n A banner to indicate that an error has occurred.\n @property {String} WARNING\n A banner to warn the user of something important.\n @property {String} INFO\n A banner to inform the user of non-critical information.\n */\nconst variant = {\n  ERROR: 'error',\n  WARNING: 'warning',\n  INFO: 'info'\n};\n\n// An array of all possible variant classnames\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Banner\n @classdesc A Banner component\n @htmltag coral-banner\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Banner = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Fetch content zones\n    this._elements = {\n      header: this.querySelector('coral-banner-header') || document.createElement('coral-banner-header'),\n      content: this.querySelector('coral-banner-content') || document.createElement('coral-banner-content')\n    };\n  }\n\n  /**\n   The banner variant style to use. See {@link BannerVariantEnum}.\n\n   @type {String}\n   @default BannerVariantEnum.INFO\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.INFO;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.INFO;\n    this._reflectAttribute('variant', this._variant);\n\n    // Remove all variant classes\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    // Set new variant class\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n  }\n\n  /**\n   The banner's header.\n\n   @type {BannerHeader}\n   @contentzone\n   */\n  get header() {\n    return this._getContentZone(this._elements.header);\n  }\n\n  set header(value) {\n    this._setContentZone('header', value, {\n      handle: 'header',\n      tagName: 'coral-banner-header',\n      insert: function (header) {\n        header.classList.add(`${CLASSNAME}-header`);\n        this.insertBefore(header, this.firstChild);\n      }\n    });\n  }\n\n  /**\n   The banner's content.\n\n   @type {BannerContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-banner-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}-content`);\n        this.appendChild(content);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {\n      'coral-banner-header': 'header',\n      'coral-banner-content': 'content'\n    };\n  }\n\n  /**\n   Returns {@link Banner} variants.\n\n   @return {BannerVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return ['variant'];\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.INFO;\n    }\n\n    const header = this._elements.header;\n    const content = this._elements.content;\n\n    // When the content zone was not created, we need to make sure that everything is added inside it as a content.\n    if (!content.parentNode) {\n      while (this.firstChild) {\n        const child = this.firstChild;\n\n        // Don't move header into content\n        if (child === header) {\n          child.remove();\n        } else {\n          content.appendChild(this.firstChild);\n        }\n      }\n    }\n\n    // Assign content zones\n    this.header = this._elements.header;\n    this.content = this._elements.content;\n  }\n});\n\nexport default Banner;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 498,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/Banner.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 499,
    "kind": "typedef",
    "name": "BannerVariantEnum",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/Banner.js~BannerVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Banner} variants.",
    "lineNumber": 31,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A banner to indicate that an error has occurred."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "A banner to warn the user of something important."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "A banner to inform the user of non-critical information."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "BannerVariantEnum"
    }
  },
  {
    "__docId__": 500,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/Banner.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 38,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 501,
    "kind": "variable",
    "name": "Banner",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/Banner.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/Banner.js~Banner",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Banner}",
    "description": "A Banner component",
    "lineNumber": 50,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Banner"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Banner component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-banner"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-banner></coral-banner>",
      "<caption>JS constructor</caption>\nnew Coral.Banner();"
    ],
    "see": [
      "../examples/#banner"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 502,
    "kind": "file",
    "name": "coral-spectrum/coral-component-banner/src/scripts/BannerContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Banner.Content\n @classdesc A Banner Content component\n @htmltag coral-banner-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-banner-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-banner/src/scripts/BannerContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 503,
    "kind": "function",
    "name": "BannerContent",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/BannerContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/BannerContent.js~BannerContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Banner}",
    "description": "A Banner Content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Banner.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Banner Content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-banner-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-banner-content></coral-banner-content>",
      "<caption>JS constructor</caption>\nnew Coral.Banner.Content();"
    ],
    "see": [
      "../examples/#banner"
    ],
    "params": []
  },
  {
    "__docId__": 504,
    "kind": "file",
    "name": "coral-spectrum/coral-component-banner/src/scripts/BannerHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Banner.Header\n @classdesc A Banner Header component\n @htmltag coral-banner-header\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-banner-header');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-banner/src/scripts/BannerHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 505,
    "kind": "function",
    "name": "BannerHeader",
    "memberof": "coral-spectrum/coral-component-banner/src/scripts/BannerHeader.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-banner/src/scripts/BannerHeader.js~BannerHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Banner}",
    "description": "A Banner Header component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Banner.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Banner Header component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-banner-header"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-banner-header></coral-banner-header>",
      "<caption>JS constructor</caption>\nnew Coral.Banner.Header();"
    ],
    "see": [
      "../examples/#banner"
    ],
    "params": []
  },
  {
    "__docId__": 506,
    "kind": "file",
    "name": "coral-spectrum/coral-component-button/src/scripts/Button.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseButton} from '../../../coral-base-button';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.Button\n @classdesc A Button component containing text and/or an icon.\n @htmltag coral-button\n @htmlbasetag button\n @extends {HTMLButtonElement}\n @extends {BaseComponent}\n @extends {BaseButton}\n */\nconst Button = Decorator(class extends BaseButton(BaseComponent(HTMLButtonElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(this._events);\n  }\n});\n\nexport default Button;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-button/src/scripts/Button.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 507,
    "kind": "variable",
    "name": "Button",
    "memberof": "coral-spectrum/coral-component-button/src/scripts/Button.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-button/src/scripts/Button.js~Button",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Button}",
    "description": "A Button component containing text and/or an icon.",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Button"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Button component containing text and/or an icon."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-button"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "button"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLButtonElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseButton}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<button is=\"coral-button\"></button>",
      "<caption>JS constructor</caption>\nnew Coral.Button();"
    ],
    "see": [
      "../examples/#button"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 508,
    "kind": "file",
    "name": "coral-spectrum/coral-component-button/src/scripts/ButtonLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Button.Label\n @classdesc The Button label content\n @htmltag coral-button-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-button-label');\n\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-button/src/scripts/ButtonLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 509,
    "kind": "function",
    "name": "ButtonLabel",
    "memberof": "coral-spectrum/coral-component-button/src/scripts/ButtonLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-button/src/scripts/ButtonLabel.js~ButtonLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Button}",
    "description": "The Button label content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Button.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Button label content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-button-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-button-label></coral-button-label>",
      "<caption>JS constructor</caption>\nnew Coral.Button.Label();"
    ],
    "see": [
      "../examples/#button"
    ],
    "params": []
  },
  {
    "__docId__": 510,
    "kind": "file",
    "name": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {Button} from '../../../coral-component-button';\nimport {SelectableCollection} from '../../../coral-collection';\nimport base from '../templates/base';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link ButtonGroup} selection options.\n\n @typedef {Object} ButtonGroupSelectionModeEnum\n\n @property {String} NONE\n None is default, selection of buttons doesn't happen based on click.\n @property {String} SINGLE\n Single selection mode, button group behaves like radio input elements.\n @property {String} MULTIPLE\n Multiple selection mode, button group behaves like checkbox input elements.\n */\nconst selectionMode = {\n  NONE: 'none',\n  SINGLE: 'single',\n  MULTIPLE: 'multiple'\n};\n\n/** @const Selector used to recognized an item of the ButtonGroup */\nconst ITEM_SELECTOR = 'button[is=\"coral-button\"]';\n\n/**\n Extracts the value from the item in case no explicit value was provided.\n @param {HTMLElement} item\n the item whose value will be extracted.\n @returns {String} the value that will be submitted for this item.\n @private\n */\nconst itemValueFromDOM = function (item) {\n  const attr = item.getAttribute('value');\n  // checking explicitely for null allows to differenciate between non set values and empty strings\n  return attr !== null ? attr : item.textContent.replace(/\\s{2,}/g, ' ').trim();\n};\n\nconst CLASSNAME = '_coral-ButtonGroup';\n\n/**\n @class Coral.ButtonGroup\n @classdesc A ButtonGroup component that can be used as a selection form field.\n @htmltag coral-buttongroup\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst ButtonGroup = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Store template\n    this._elements = {};\n    base.call(this._elements);\n\n    // Pre-define labellable element\n    this._labellableElement = this;\n\n    // save initial selection (used for reset)\n    this._initalSelectedValues = [];\n\n    // Attach events\n    this._delegateEvents(commons.extend(this._events, {\n      'click button[is=\"coral-button\"]': '_onButtonClick',\n\n      'capture:focus button[is=\"coral-button\"]': '_onButtonFocus',\n      'capture:blur button[is=\"coral-button\"]': '_onButtonBlur',\n\n      'key:up button[is=\"coral-button\"]': '_onButtonKeyUpLeft',\n      'key:left button[is=\"coral-button\"]': '_onButtonKeyUpLeft',\n      'key:down button[is=\"coral-button\"]': '_onButtonKeyDownRight',\n      'key:right button[is=\"coral-button\"]': '_onButtonKeyDownRight',\n      'key:home button[is=\"coral-button\"]': '_onButtonKeyHome',\n      'key:end button[is=\"coral-button\"]': '_onButtonKeyEnd',\n\n      'coral-button:_valuechanged button[is=\"coral-button\"]': '_onButtonValueChanged',\n      'coral-button:_selectedchanged button[is=\"coral-button\"]': '_onButtonSelectedChanged'\n    }));\n\n    // Init the mutation observer but we don't handle the initial items in the constructor\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // we do lazy initialization of the collection\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemBaseTagName: 'button',\n        itemTagName: 'coral-button',\n        itemSelector: ITEM_SELECTOR,\n        onlyHandleChildren: true,\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved,\n        onCollectionChange: this._onCollectionChange\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Selection mode of Button group\n\n   @type {String}\n   @default ButtonGroupSelectionModeEnum.NONE\n   @htmlattribute selectionmode\n   @htmlattributereflected\n   */\n  get selectionMode() {\n    return this._selectionMode || selectionMode.NONE;\n  }\n\n  set selectionMode(value) {\n    value = transform.string(value).toLowerCase();\n    this._selectionMode = validate.enumeration(selectionMode)(value) && value || selectionMode.NONE;\n    this._reflectAttribute('selectionmode', this._selectionMode);\n\n    // update select element if multiple\n    // this is required while appplying default selection\n    // if selection mode is single first elem gets selected but for multiple its not\n    this._elements.nativeSelect.multiple = this._selectionMode === selectionMode.MULTIPLE;\n\n    // Sync\n    if (this._selectionMode === selectionMode.SINGLE) {\n      this.setAttribute('role', 'radiogroup');\n\n      // makes sure the internal options are properly initialized\n      this._syncItemOptions();\n\n      // we make sure the selection is valid by explicitly finding a candidate or making sure just 1 item is\n      // selected\n      this._validateSelection();\n    } else if (this._selectionMode === selectionMode.MULTIPLE) {\n      this.setAttribute('role', 'group');\n\n      // makes sure the internal options are properly initialized\n      this._syncItemOptions();\n    } else {\n      this.setAttribute('role', 'group');\n\n      this._removeItemOptions();\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.nativeSelect.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.nativeSelect.name = value;\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.nativeSelect.value;\n  }\n\n  set value(value) {\n    if (this.selectionMode === selectionMode.NONE) {\n      return;\n    }\n\n    // we proceed to select the provided value\n    this._selectItemByValue([value]);\n  }\n\n  /**\n   Returns an Array containing the selected buttons.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    if (this.selectionMode === selectionMode.MULTIPLE) {\n      return this.items._getAllSelected();\n    }\n\n    const item = this.selectedItem;\n    return item ? [item] : [];\n  }\n\n  /**\n   Returns the first selected button in the Button Group. The value <code>null</code> is returned if no button is\n   selected.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.selectionMode === selectionMode.MULTIPLE ?\n      this.items._getFirstSelected() :\n      this.items._getLastSelected();\n  }\n\n  /**\n   Current selected values as submitted during form submission.\n\n   @type {Array.<String>}\n   */\n  get values() {\n    const values = [];\n\n    // uses the nativeSelect since it holds the truth of what will be submitted with the form\n    const selectedOptions = this._elements.nativeSelect.querySelectorAll(':checked');\n    for (let i = 0, selectedOptionsCount = selectedOptions.length ; i < selectedOptionsCount ; i++) {\n      values.push(selectedOptions[i].value);\n    }\n\n    return values;\n  }\n\n  set values(values) {\n    if (Array.isArray(values) && this.selectionMode !== selectionMode.NONE) {\n      // just keeps the first value if selectionMode is not multiple\n      if (this.selectionMode !== selectionMode.MULTIPLE && values.length > 1) {\n        values = [values[0]];\n      }\n\n      // we proceed to select the provided values\n      this._selectItemByValue(values);\n    }\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    const isDisabled = this.disabled || this.readOnly;\n    this._elements.nativeSelect.disabled = isDisabled;\n    // Also update for all the items the disabled property so it matches the native select.\n    this.items.getAll().forEach((item) => {\n      item.disabled = isDisabled;\n    });\n    this[isDisabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', isDisabled);\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.nativeSelect.disabled = this.readOnly || this.disabled;\n    // Also update for all the items the disabled property so it matches the native select.\n    this.items.getAll().forEach((item) => {\n      item.disabled = this.disabled || this.readOnly && !item.hasAttribute('selected');\n      item[this.readOnly ? 'setAttribute' : 'removeAttribute']('aria-disabled', true);\n    });\n    // aria-readonly is not permitted on elements with role=\"radiogroup\" or role=\"group\"\n    this.removeAttribute('aria-readonly');\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.nativeSelect.required = this.required;\n    // aria-required is permitted on elements with role=\"radiogroup\" but not with role=\"group\"\n    if (this.selectionMode !== selectionMode.SINGLE) {\n      this.removeAttribute('aria-required');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n    this._elements.nativeSelect.setAttribute('aria-labelledby', this.labelledBy);\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // reset the values to the initial values\n    this.values = this._initalSelectedValues;\n  }\n\n  /** @private */\n  _onButtonClick(event) {\n    // uses matchTarget to make sure the buttons is handled and not an internal component\n    const item = event.matchedTarget;\n\n    this._onButtonFocus(event);\n\n    if (this.readOnly) {\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return;\n    }\n\n    if (this.selectionMode === selectionMode.SINGLE) {\n      // prevent event only if selectionMode is not of type none\n      event.preventDefault();\n\n      // first unselect the other element\n      const selectedItems = this.items._getAllSelected();\n\n      // we deselect the previously selected item\n      if (selectedItems.length !== 0 && selectedItems[0] !== item) {\n        this._toggleItemSelection(selectedItems[0], false);\n      }\n\n      // forces the selection on the clicked item\n      this._toggleItemSelection(item, true);\n\n      // if the same button was clicked we do not need to trigger an event\n      if (selectedItems[0] !== item) {\n        this.trigger('change');\n      }\n    } else if (this.selectionMode === selectionMode.MULTIPLE) {\n      // prevent event only if selectionMode is not of type none\n      event.preventDefault();\n\n      this._toggleItemSelection(item);\n\n      // since we toggle the selection we always trigger a change event\n      this.trigger('change');\n    }\n  }\n\n  /** @private */\n  _onButtonFocus(event) {\n    const item = event.matchedTarget;\n    const buttons = this.items.getAll();\n    const buttonsCount = buttons.length;\n\n    let button;\n    for (let i = 0 ; i < buttonsCount ; i++) {\n      // stores the reference\n      button = buttons[i];\n      button.setAttribute('tabindex', button === item ? 0 : -1);\n    }\n  }\n\n  /** @private */\n  _onButtonBlur(event) {\n    const item = event.matchedTarget;\n    const buttons = this.items.getAll();\n    const buttonsCount = buttons.length;\n\n    let button;\n    let tabindex;\n    const selectedItemsLength = this.selectedItems.length;\n    const firstSelectable = this.items._getFirstSelectable();\n    let isSelected = false;\n    for (let i = 0 ; i < buttonsCount ; i++) {\n      // stores the reference\n      button = buttons[i];\n      isSelected = button.hasAttribute('selected');\n      if (this.selectionMode === selectionMode.SINGLE) {\n        // selected item should be tabbable\n        tabindex = isSelected ? 0 : -1;\n      } else if (this.selectionMode === selectionMode.MULTIPLE) {\n        tabindex =\n          // if no items are selected, first item should be tabbable\n          !selectedItemsLength && i === 0 ||\n          // if the element losing focus is selected, it should be tabbable\n          isSelected && button === item ||\n          // if the element losing focus is not selected, the last selected item should be tabbable\n          !item.hasAttribute('selected') &&\n          button === (this.selectedItems[selectedItemsLength - 1] || firstSelectable) ? 0 : -1;\n      } else {\n        // first item should be tabbable\n        tabindex = button === firstSelectable ? 0 : -1;\n      }\n      button.setAttribute('tabindex', tabindex);\n    }\n  }\n\n  /** @private */\n  _onButtonKeyUpLeft(event) {\n    event.preventDefault();\n\n    const item = event.matchedTarget;\n    let button = item.previousElementSibling;\n\n    // skip disabled items\n    while (!button || (button.disabled || button.nodeName !== 'BUTTON')) {\n      if (!button) {\n        button = this.items._getLastSelectable();\n      } else {\n        button = button.previousElementSibling;\n      }\n    }\n\n    if (button !== item) {\n      if (this.selectionMode === selectionMode.SINGLE) {\n        button.click();\n      }\n      this._setFocusToButton(button);\n    }\n  }\n\n  /** @private */\n  _onButtonKeyDownRight(event) {\n    event.preventDefault();\n\n    const item = event.matchedTarget;\n    let button = item.nextElementSibling;\n\n    // skip disabled items\n    while (!button || (button.disabled || button.nodeName !== 'BUTTON')) {\n      if (!button) {\n        button = this.items._getFirstSelectable();\n      } else {\n        button = button.nextElementSibling;\n      }\n    }\n\n    if (button !== item) {\n      if (this.selectionMode === selectionMode.SINGLE) {\n        button.click();\n      }\n      this._setFocusToButton(button);\n    }\n  }\n\n  /** @private */\n  _onButtonKeyHome(event) {\n    event.preventDefault();\n\n    const item = event.matchedTarget;\n    const button = this.items._getFirstSelectable();\n\n    if (button !== item) {\n      if (this.selectionMode === selectionMode.SINGLE) {\n        button.click();\n      }\n      this._setFocusToButton(button);\n    }\n  }\n\n  /** @private */\n  _onButtonKeyEnd(event) {\n    event.preventDefault();\n\n    const item = event.matchedTarget;\n    const button = this.items._getLastSelectable();\n\n    if (button !== item) {\n      if (this.selectionMode === selectionMode.SINGLE) {\n        button.click();\n      }\n      this._setFocusToButton(button);\n    }\n  }\n\n  /** @private */\n  _setFocusToButton(button) {\n    if (button) {\n      button.focus();\n    }\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    // Store variant to be able to reset it when item is removed\n    item._initialVariant = item._initialVariant || item.variant;\n\n    // Force action variant\n    if (!(item.variant === Button.variant.ACTION || item.variant === Button.variant.QUIET_ACTION)) {\n      item.variant = item.variant === Button.variant.QUIET ? Button.variant.QUIET_ACTION : Button.variant.ACTION;\n    }\n\n    if (this.selectionMode !== selectionMode.NONE) {\n      if (this.selectionMode === selectionMode.SINGLE) {\n        item.setAttribute('role', 'radio');\n        item.setAttribute('tabindex', item.hasAttribute('selected') ? 0 : -1);\n      } else {\n        item.setAttribute('role', 'checkbox');\n      }\n      item.setAttribute('aria-checked', item.hasAttribute('selected'));\n    } else {\n      item.removeAttribute('role');\n    }\n\n    item.disabled = this.disabled || this.readOnly && !item.hasAttribute('selected');\n\n    item[this.readOnly ? 'setAttribute' : 'removeAttribute']('aria-disabled', true);\n\n    this._addItemOption(item);\n\n    // Handle the case where we might have multiple items selected while single selection mode is on\n    if (this.selectionMode === selectionMode.SINGLE) {\n      const selectedItems = this.items._getAllSelected();\n      // The last added item will stay selected\n      if (selectedItems.length > 1 && item.hasAttribute('selected')) {\n        item.removeAttribute('selected');\n      }\n    }\n  }\n\n  /** @private */\n  _onItemRemoved(item) {\n    // Restore variant\n    item.variant = item._initialVariant;\n    item._initialVariant = undefined;\n    item.removeAttribute('role');\n\n    if (!item.parentNode) {\n      // Remove the item from the initial selected values\n      const index = this._initalSelectedValues.indexOf(item.value);\n      if (index !== -1) {\n        this._initalSelectedValues.splice(index, 1);\n      }\n    }\n\n    // delete option\n    if (item.option) {\n      item.option.parentNode.removeChild(item.option);\n      item.option = undefined;\n    }\n  }\n\n  /** @private */\n  _onCollectionChange() {\n    // we need to make sure that the state of the selectionMode is valid\n    this._validateSelection();\n  }\n\n  /** @private */\n  _onButtonSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const button = event.target;\n    const isSelected = button.hasAttribute('selected');\n\n    // when in single mode, we need to make sure the current selection is valid\n    if (this.selectionMode === selectionMode.SINGLE) {\n      this._validateSelection(isSelected ? button : null);\n    } else {\n      // we simply toggle the selection\n      this._toggleItemSelection(button, isSelected);\n    }\n  }\n\n  /** @private */\n  _onButtonValueChanged(event) {\n    event.stopImmediatePropagation();\n\n    const button = event.target;\n    // Make sure option is attached before setting the value\n    if (this.selectionMode !== selectionMode.NONE) {\n      button.option.value = itemValueFromDOM(button);\n    }\n  }\n\n  /**\n   Toggles the selected state of the item. When <code>selected</code> is provided, it is set as the current state. If\n   the value is ommited, then the selected is toggled.\n\n   @param {HTMLElement} item\n   Item whose selection needs to be updated.\n   @param {Boolean} [selected]\n   Whether the item is selected. If it is not provided, then it is toggled.\n\n   @private\n   */\n  _toggleItemSelection(item, selected) {\n    const ariaCheckedAttr = item.getAttribute('aria-checked');\n    const tabIndexAttr = item.getAttribute('tabindex');\n\n    // if selected is provided it is used to enforce the selection, otherwise we toggle the current state\n    selected = typeof selected !== 'undefined' ? selected : !item.hasAttribute('selected');\n\n    // only manipulates the attributes when necessary to avoid unnecessary mutations\n    if (selected) {\n      if (!item.hasAttribute('selected')) {\n        item.setAttribute('selected', '');\n      }\n\n      if (ariaCheckedAttr !== 'true') {\n        item.setAttribute('aria-checked', true);\n      }\n\n      if (this.selectionMode === selectionMode.SINGLE && tabIndexAttr !== '0') {\n        item.setAttribute('tabindex', 0);\n      }\n    } else if (!selected) {\n      if (item.hasAttribute('selected')) {\n        item.removeAttribute('selected');\n      }\n\n      if (this.selectionMode !== selectionMode.NONE) {\n        if (ariaCheckedAttr !== 'false') {\n          item.setAttribute('aria-checked', false);\n        }\n\n        if (this.selectionMode === selectionMode.SINGLE && tabIndexAttr !== '-1') {\n          item.setAttribute('tabindex', -1);\n        }\n      } else {\n        item.removeAttribute('aria-checked');\n        item.removeAttribute('tabindex');\n      }\n    }\n\n    // if element.option is present - absent when selection mode changed to none\n    if (item.option) {\n      item.option.selected = selected;\n    }\n  }\n\n  _selectItemByValue(values) {\n    // queries all the buttons to change their selection state\n    const buttons = this.items.getAll();\n    let item;\n\n    for (let i = 0, buttonsCount = buttons.length ; i < buttonsCount ; i++) {\n      // stores the reference\n      item = buttons[i];\n\n      // if the value is inside the new values array it should be selected\n      this._toggleItemSelection(item, values.indexOf(itemValueFromDOM(item)) !== -1);\n    }\n  }\n\n  /** @private */\n  _setInitialValues() {\n    if (this.selectionMode !== selectionMode.NONE) {\n      const selectedItems = this.selectedItems;\n      for (let i = 0, selectedItemsCount = selectedItems.length ; i < selectedItemsCount ; i++) {\n        // Store _initalSelectedValues for reset\n        this._initalSelectedValues.push(selectedItems[i].value);\n\n        // Same goes for native select\n        this._addItemOption(selectedItems[i]);\n      }\n    }\n  }\n\n  /** @private */\n  _addItemOption(item) {\n    if (this.selectionMode === selectionMode.NONE) {\n      return;\n    }\n\n    // if already attached return\n    if (item.option) {\n      return;\n    }\n\n    const option = document.createElement('option');\n    option.value = itemValueFromDOM(item);\n\n    if (item.hasAttribute('selected')) {\n      option.setAttribute('selected', '');\n    }\n\n    // add it to DOM. In single selectionMode the first item gets selected automatically\n    item.option = option;\n    this._elements.nativeSelect.add(option);\n\n    // we make sure the options reflect the state of the button\n    this._toggleItemSelection(item, item.hasAttribute('selected'));\n  }\n\n  /** @private */\n  _removeItemOptions() {\n    // Find all buttons and try attaching corresponding option elem\n    const buttons = this.items.getAll();\n\n    let item;\n    for (let i = 0, buttonsCount = buttons.length ; i < buttonsCount ; i++) {\n      // stores the reference\n      item = buttons[i];\n\n      item.removeAttribute('role');\n      item.removeAttribute('aria-checked');\n\n      // single we are removing the options, selection must also go away\n      if (item.hasAttribute('selected')) {\n        this._toggleItemSelection(item, false);\n      }\n\n      // we clear the related option element\n      if (item.option) {\n        item.option.parentNode.removeChild(item.option);\n        delete item.option;\n      }\n    }\n  }\n\n  /** @private */\n  _syncItemOptions() {\n    // finds all buttons and try attaching corresponding option elem\n    const buttons = this.items.getAll();\n    const buttonsCount = buttons.length;\n    let i = 0;\n\n    let role = null;\n    if (this.selectionMode === selectionMode.SINGLE) {\n      role = 'radio';\n    } else if (this.selectionMode === selectionMode.MULTIPLE) {\n      role = 'checkbox';\n    }\n\n    let button;\n    let isSelected = false;\n\n    for (i ; i < buttonsCount ; i++) {\n      // try attaching corresponding input element\n      this._addItemOption(buttons[i]);\n    }\n\n    // We need to set the right state for the native select AFTER all buttons have been added\n    // (as we can't disable options while there is only one option attached [at least in FF])\n    for (i = buttonsCount - 1 ; i >= 0 ; i--) {\n      button = buttons[i];\n      isSelected = button.hasAttribute('selected');\n      button.option.selected = isSelected;\n      button.setAttribute('aria-checked', isSelected);\n\n      if (role) {\n        button.setAttribute('role', role);\n      } else {\n        button.removeAttribute('role');\n      }\n    }\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    // when selectionMode = single, we need to force a selection\n    if (this.selectionMode === selectionMode.SINGLE) {\n      // gets the current selection\n      const selection = this.items._getAllSelected();\n      const selectionCount = selection.length;\n\n      // if no item is currently selected, we need to find a candidate\n      if (selectionCount === 0) {\n        // gets the first candidate for selection\n        const selectable = this.items._getFirstSelectable();\n\n        if (selectable) {\n          this._toggleItemSelection(selectable, true);\n        }\n      }\n      // more items are selected, so we find a single item and deselect everything else\n      else if (selectionCount > 1) {\n        // if no item was provided we force the selection on the first item\n        item = item || selection[0];\n\n        // we make sure the item is selected, this is important to match the options with the selection\n        this._toggleItemSelection(item, true);\n\n        for (let i = 0 ; i < selectionCount ; i++) {\n          if (selection[i] !== item) {\n            this._toggleItemSelection(selection[i], false);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   Returns {@link ButtonGroup} selection options.\n\n   @return {ButtonGroupSelectionModeEnum}\n   */\n  static get selectionMode() {\n    return selectionMode;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      selectionmode: 'selectionMode'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'selectionmode',\n      'selectionMode'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._selectionMode) {\n      this.selectionMode = selectionMode.NONE;\n    }\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    // Render the template\n    frag.appendChild(this._elements.nativeSelect);\n\n    // Clean up\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.getAttribute('handle') !== 'nativeSelect') {\n        // Add non-template elements to the content\n        frag.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Append the fragment to the component\n    this.appendChild(frag);\n\n    // Need to store and set the initially selected values in the native select so that it can reset\n    this._setInitialValues();\n\n    // Call onItemAdded and onCollectionChange on the existing items\n    this.items._startHandlingItems();\n  }\n});\n\nexport default ButtonGroup;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 511,
    "kind": "typedef",
    "name": "ButtonGroupSelectionModeEnum",
    "memberof": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js~ButtonGroupSelectionModeEnum",
    "access": "public",
    "description": "Enumeration for {@link ButtonGroup} selection options.",
    "lineNumber": 33,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "None is default, selection of buttons doesn't happen based on click."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SINGLE",
        "description": "Single selection mode, button group behaves like radio input elements."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MULTIPLE",
        "description": "Multiple selection mode, button group behaves like checkbox input elements."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ButtonGroupSelectionModeEnum"
    }
  },
  {
    "__docId__": 512,
    "kind": "variable",
    "name": "ITEM_SELECTOR",
    "memberof": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js~ITEM_SELECTOR",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 40,
    "unknown": [
      {
        "tagName": "@const",
        "tagValue": "Selector used to recognized an item of the ButtonGroup"
      }
    ],
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 513,
    "kind": "function",
    "name": "itemValueFromDOM",
    "memberof": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js~itemValueFromDOM",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Extracts the value from the item in case no explicit value was provided.",
    "lineNumber": 49,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} the value that will be submitted for this item."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "the item whose value will be extracted."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "the value that will be submitted for this item."
    },
    "ignore": true
  },
  {
    "__docId__": 514,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 55,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 515,
    "kind": "variable",
    "name": "ButtonGroup",
    "memberof": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-buttongroup/src/scripts/ButtonGroup.js~ButtonGroup",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ButtonGroup}",
    "description": "A ButtonGroup component that can be used as a selection form field.",
    "lineNumber": 65,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ButtonGroup"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ButtonGroup component that can be used as a selection form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-buttongroup"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-buttongroup></coral-buttongroup>",
      "<caption>JS constructor</caption>\nnew Coral.ButtonGroup();"
    ],
    "see": [
      "../examples/#buttongroup"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 516,
    "kind": "file",
    "name": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {DateTime} from '../../../coral-datetime';\nimport '../../../coral-component-button';\nimport {Icon} from '../../../coral-component-icon';\nimport calendar from '../templates/calendar';\nimport container from '../templates/container';\nimport table from '../templates/table';\nimport {transform, commons, i18n, Keys} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/** @ignore */\nfunction isDateInRange(date, startDate, endDate) {\n  if (!date) {\n    return false;\n  }\n\n  if (startDate === null && endDate === null) {\n    return true;\n  }\n  else if (startDate === null) {\n    return date.toDate() <= endDate;\n  }\n  else if (endDate === null) {\n    return date.toDate() >= startDate;\n  }\n\n  return startDate <= date.toDate() && date.toDate() <= endDate;\n}\n\n/** @ignore */\nfunction toMoment(value, format) {\n  if (value === 'today') {\n    return new DateTime.Moment().startOf('day');\n  }\n  else if (DateTime.Moment.isMoment(value)) {\n    return value.isValid() ? value.clone() : null;\n  }\n\n  // if the value provided is a date it does not make sense to provide a format to parse the date\n  const result = new DateTime.Moment(value, value instanceof Date ? null : format);\n  return result.isValid() ? result.startOf('day') : null;\n}\n\n/** @ignore */\nfunction validateAsChangedAndValidMoment(newValue, oldValue) {\n  // if the value is undefined we change it to null since moment considers both to be different\n  newValue = newValue || null;\n  oldValue = oldValue || null;\n\n  if (newValue !== oldValue && !new DateTime.Moment(newValue).isSame(oldValue, 'day')) {\n    return newValue === null || newValue.isValid();\n  }\n\n  return false;\n}\n\n/**\n Slides in new month tables, slides out old tables, and then cleans up the leftovers when it is done.\n\n @ignore\n */\nfunction TableAnimator(host) {\n  this.host = host;\n\n  this._addContainerIfNotPresent = (width, height) => {\n    if (!this.container) {\n      // Get a fresh container for the animation:\n      container.call(\n        this,\n        {\n          width,\n          height\n        }\n      );\n      this.host.appendChild(this.container);\n    }\n  };\n\n  this._removeContainerIfEmpty = () => {\n    if (this.container && this.container.children.length === 0) {\n      this.host.removeChild(this.container);\n      this.container = null;\n    }\n  };\n\n  this.slide = (newTable, direction) => {\n    const replace = direction === undefined;\n    const isLeft = direction === 'left';\n    const oldTable = this.oldTable;\n\n    // Should the replace flag be raised, or no old table be present, then do a non-transitioned (re)place and exit\n    if (replace || !oldTable) {\n      if (oldTable) {\n        oldTable.parentNode.removeChild(oldTable);\n      }\n      this.host.insertBefore(newTable, this.host.firstChild);\n      this.oldTable = newTable;\n      return;\n    }\n\n    const boundingClientRect = oldTable.getBoundingClientRect();\n    const width = boundingClientRect.width;\n    let height = boundingClientRect.height;\n    this._addContainerIfNotPresent(width, height);\n\n    // Add both the old and the new table to the container:\n    this.container.appendChild(oldTable);\n    this.container.appendChild(newTable);\n\n    // Set the existing table to start from being in full view, and mark it to transition on `left` changing\n    oldTable.classList.add('_coral-Calendar-table--transit');\n\n    commons.transitionEnd(oldTable, () => {\n      oldTable.parentNode.removeChild(oldTable);\n      this._removeContainerIfEmpty();\n    });\n\n    // Set the new table to start out of view (either left or right depending on the direction of the slide), and mark\n    // it to transition on `left` changing\n    newTable.classList.add('_coral-Calendar-table--transit');\n    newTable.style.left = `${isLeft ? width : -width}px`;\n\n    // When the transition is done, have the transition class lifted\n    commons.transitionEnd(newTable, () => {\n      newTable.classList.remove('_coral-Calendar-table--transit');\n      this.host.appendChild(newTable);\n      this._removeContainerIfEmpty();\n    });\n\n    // Force a redraw by querying the browser for its offsetWidth. Without this, the re-positioning code later on\n    // would not lead to a transition. Note that there's no significance to the resulting value being assigned to\n    // 'height'\n    height = this.container.offsetWidth;\n\n    // Set the `left` positions to transition to:\n    oldTable.style.left = `${isLeft ? -width : width}px`;\n    newTable.style.left = 0;\n\n    this.oldTable = newTable;\n  };\n}\n\n/** @ignore */\nconst ARRAYOF6 = [0, 0, 0, 0, 0, 0];\n\n/** @ignore */\nconst ARRAYOF7 = [0, 0, 0, 0, 0, 0, 0];\n\n/** @ignore */\nconst INTERNAL_FORMAT = 'YYYY-MM-DD';\n\n/** @ignore */\nconst timeUnit = {\n  YEAR: 'year',\n  MONTH: 'month',\n  WEEK: 'week',\n  DAY: 'day'\n};\n\nconst CLASSNAME = '_coral-Calendar';\n\n/**\n @class Coral.Calendar\n @classdesc A Calendar component that can be used as a date selection form field. Leverages {@link momentJS} if loaded\n on the page.\n @htmltag coral-calendar\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Calendar = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Default value\n    this._value = null;\n\n    this._delegateEvents(commons.extend(this._events, {\n      'click ._coral-Calendar-nextMonth,._coral-Calendar-prevMonth': '_onNextOrPreviousMonthClick',\n      'click ._coral-Calendar-body ._coral-Calendar-date': '_onDayClick',\n      'capture:focus ._coral-Calendar-body': '_onBodyFocus',\n      'mousedown ._coral-Calendar-body ._coral-Calendar-date': '_onDayMouseDown',\n      'key:up ._coral-Calendar-body': '_onUpKey',\n      'key:right ._coral-Calendar-body': '_onRightKey',\n      'key:down ._coral-Calendar-body': '_onDownKey',\n      'key:left ._coral-Calendar-body': '_onLeftKey',\n      'key:home ._coral-Calendar-body': '_onHomeOrEndKey',\n      'key:end ._coral-Calendar-body': '_onHomeOrEndKey',\n      'key:pageup': '_onPageUpKey',\n      'key:pagedown': '_onPageDownKey',\n\n      // On OSX we use Command+Page Up\n      'key:meta+pageup': '_onCtrlPageUpKey',\n      // On OSX we use Command+Page Down\n      'key:meta+pagedown': '_onCtrlPageDownKey',\n      // On Windows, we use CTRL+Page Up\n      'key:ctrl+pageup': '_onCtrlPageUpKey',\n      // On Windows, we use CTRL+Page Down\n      'key:ctrl+pagedown': '_onCtrlPageDownKey',\n\n      // Use alt+pageup/alt+pagedown and shift+pageup/shift+pagedown to jump by year\n      'key:alt+pageup': '_onCtrlPageUpKey',\n      'key:alt+pagedown': '_onCtrlPageDownKey',\n      'key:shift+pageup': '_onCtrlPageUpKey',\n      'key:shift+pagedown': '_onCtrlPageDownKey',\n\n      'key:enter ._coral-Calendar-body': '_onEnterKey',\n      'key:return ._coral-Calendar-body': '_onEnterKey',\n      'key:space ._coral-Calendar-body': '_onEnterKey'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    calendar.call(this._elements, {commons, i18n, Icon});\n\n    // Pre-define labellable element\n    this._labellableElement = this;\n\n    // Internal keeper of the month that is currently on display.\n    this._cursor = null;\n\n    // Internal keeper for the id of the currently focused date cell or the cell that would receive focus when the\n    // calendar body receives focus.\n    this._activeDescendant = null;\n    this._animator = new TableAnimator(this._elements.body);\n  }\n\n  /**\n   Defines the start day for the week, 0 = Sunday, 1 = Monday etc., as depicted on the calendar days grid.\n\n   @type {Number}\n   @default 0\n   @htmlattribute startday\n   */\n  get startDay() {\n    if (this._startDay) {\n      return this._startDay;\n    }\n\n    if (typeof DateTime.Moment.localeData(i18n.locale).firstDayOfWeek !== 'undefined') {\n      return DateTime.Moment.localeData(i18n.locale).firstDayOfWeek();\n    }\n\n    return 0;\n  }\n\n  set startDay(value) {\n    value = transform.number(value);\n    if (value >= 0 && value < 7) {\n      this._startDay = value;\n\n      this._renderCalendar();\n    }\n  }\n\n  /**\n   The format used to display the current month and year.\n   'MMMM YYYY' is supported by default. Include momentjs to support additional format string options see\n   http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"MMMM YYYY\"\n   @htmlattribute headerformat\n   */\n  get headerFormat() {\n    return this._headerFormat || 'MMMM YYYY';\n  }\n\n  set headerFormat(value) {\n    this._headerFormat = transform.string(value);\n    this._renderCalendar();\n  }\n\n  /**\n   The minimal selectable date in the Calendar view. When passed a string, it needs to be 'YYYY-MM-DD' formatted.\n\n   @type {String|Date}\n   @default null\n   @htmlattribute min\n   */\n  get min() {\n    return this._min ? this._min.toDate() : null;\n  }\n\n  set min(value) {\n    value = toMoment(value, this.valueFormat);\n\n    if (validateAsChangedAndValidMoment(value, this._min)) {\n      this._min = value;\n      this._renderCalendar();\n    }\n  }\n\n  /**\n   The max selectable date in the Calendar view. When passed a string, it needs to be 'YYYY-MM-DD'\n   formatted.\n\n   @type {String|Date}\n   @default null\n   @htmlattribute max\n   */\n  get max() {\n    return this._max ? this._max.toDate() : null;\n  }\n\n  set max(value) {\n    value = toMoment(value, this.valueFormat);\n\n    if (validateAsChangedAndValidMoment(value, this._max)) {\n      this._max = value;\n      this._renderCalendar();\n    }\n  }\n\n  /**\n   The format to use on expressing the selected date as a string on the <code>value</code> attribute.\n   'YYYY-MM-DD' is supported by default. Include momentjs to support additional format string options see\n   http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"YYYY-MM-DD\"\n   @htmlattribute valueformat\n   @htmlattributereflected\n   */\n  get valueFormat() {\n    return this._valueFormat || INTERNAL_FORMAT;\n  }\n\n  set valueFormat(value) {\n    value = transform.string(value);\n\n    const setValueFormat = (newValue) => {\n      this._valueFormat = newValue;\n      this._reflectAttribute('valueformat', this._valueFormat);\n    };\n\n    // Once the valueFormat is set, we make sure the value is also correct\n    if (!this._valueFormat && this._originalValue) {\n      setValueFormat(value);\n      this.value = this._originalValue;\n    }\n    else {\n      setValueFormat(value);\n      this._elements.input.value = this.value;\n    }\n  }\n\n  /**\n   The value returned, or set, as a Date. If the value is '' it will return <code>null</code>.\n\n   @type {Date}\n   @default null\n   */\n  get valueAsDate() {\n    return this._value ? this._value.toDate() : null;\n  }\n\n  set valueAsDate(value) {\n    if (value instanceof Date) {\n      this._valueAsDate = new DateTime.Moment(value);\n      this.value = this._valueAsDate;\n    }\n    else {\n      this._valueAsDate = null;\n      this.value = '';\n    }\n  }\n\n  /**\n   The current value. When set to 'today', the value is coerced into the clients local date expressed as string\n   formatted in accordance to the set <code>valueFormat</code>.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._value ? this._value.format(this.valueFormat) : '';\n  }\n\n  set value(value) {\n    // This is used to change the value if valueformat is also set but afterwards\n    this._originalValue = value;\n\n    value = toMoment(value, this.valueFormat);\n\n    if (validateAsChangedAndValidMoment(value, this._value)) {\n      this._value = value;\n      this._elements.input.value = this.value;\n\n      // resets the view cursor, so the selected month will be in view\n      this._cursor = null;\n\n      this._renderCalendar();\n      this.required = this.required;\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this.classList.toggle('is-required', this._required && this._value === null);\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.prev.disabled = this._disabled;\n    this._elements.next.disabled = this._disabled;\n    this._elements.body[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.body[this._disabled ? 'removeAttribute' : 'setAttribute']('tabindex', '0');\n\n    this._renderCalendar();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this._renderCalendar();\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.prev.disabled = this._readOnly;\n    this._elements.next.disabled = this._readOnly;\n    this._elements.body[this._readOnly ? 'removeAttribute' : 'setAttribute']('tabindex', '0');\n    this.classList.toggle('is-readOnly', this._readOnly);\n  }\n\n  /** @ignore */\n  _renderCalendar(slide) {\n    const cursor = this._requireCursor();\n    const displayYear = cursor.year();\n    const displayMonth = cursor.month();\n    const oldTable = this._animator.oldTable;\n\n    this._elements.heading.innerHTML = new DateTime.Moment([displayYear, displayMonth, 1]).format(this.headerFormat);\n\n    const newTable = this._renderTable(displayYear, displayMonth + 1);\n\n    if (oldTable) {\n      commons.transitionEnd(newTable, () => {\n        this._setActiveDescendant();\n      });\n    }\n\n    this._animator.slide(newTable, slide);\n\n    const el = this._elements.body.querySelector('.is-selected');\n\n    // This will be overwritten later if there is any other function setting the attribute\n    this._activeDescendant = el ? el.id : null;\n\n    this._setActiveDescendant();\n  }\n\n  /**\n   Returns <code>true</code> if moment specified is before <code>min</code>.\n\n   @param {moment} currentMoment\n   A moment to test.\n   @param {String} unit\n   Year, Month, Week, Day\n   @returns {Boolean}\n   <code>true</code> if moment specified is before <code>min</code>\n\n   @ignore\n   */\n  _isBeforeMin(currentMoment, unit) {\n    const min = this.min ? new DateTime.Moment(this.min) : null;\n    return min && currentMoment.isBefore(min, unit);\n  }\n\n  /**\n   Returns <code>true</code> if moment specified is after <code>max</code>.\n\n   @param {moment} currentMoment\n   A moment to test.\n   @param {String} unit\n   Year, Month, Week, Day\n   @returns {Boolean}\n   <code>true</code> if moment specified is after <code>max</code>\n\n   @ignore\n   */\n  _isAfterMax(currentMoment, unit) {\n    const max = this.max ? new DateTime.Moment(this.max) : null;\n    return max && currentMoment.isAfter(max, unit);\n  }\n\n  /**\n   Returns <code>true</code> if moment specified is greater than or equal to <code>min</code> and less than or equal to <code>max</code>.\n\n   @param {moment} currentMoment\n   A moment to test.\n   @param {String} unit\n   Year, Month, Week, Day\n   @returns {Boolean}\n   <code>true</code> if moment specified falls within <code>min</code>/<code>max</code> date range.\n\n   @ignore\n   */\n  _isInRange(currentMoment, unit) {\n    return !(this._isBeforeMin(currentMoment, unit) || this._isAfterMax(currentMoment, unit));\n  }\n\n  /**\n   Updates the aria-activedescendant property for the calendar grid to communicate the currently focused date, or the\n   date that should get focus when the grid receives focus, to assistive technology.\n\n   @ignore\n   */\n  _setActiveDescendant() {\n    let el;\n\n    const isActiveDescendantMissing = () => !this._activeDescendant || !this._elements.body.querySelector(`#${this._activeDescendant} [data-date]`);\n\n    if (isActiveDescendantMissing()) {\n      this._activeDescendant = null;\n\n      el = this._elements.body.querySelector('.is-selected');\n      this._activeDescendant = el && el.id;\n\n      if (isActiveDescendantMissing()) {\n        const currentMoment = this._value;\n\n        if (currentMoment) {\n          const dates = this._elements.body.querySelectorAll('[data-date]');\n\n          if (this._isBeforeMin(currentMoment)) {\n            el = dates[0];\n          }\n          else if (this._isAfterMax(currentMoment)) {\n            el = dates.length ? dates[dates.length - 1] : null;\n          }\n        }\n        else {\n          el = this._elements.body.querySelector('.is-focused') || this._elements.body.querySelector('.is-today');\n        }\n\n        if (el) {\n          this._activeDescendant = el.parentElement.id;\n        }\n      }\n    }\n\n    el = this._elements.body.querySelector('.is-focused');\n    if (el) {\n      el.classList.remove('is-focused');\n    }\n\n    this._elements.body[this._activeDescendant ? 'setAttribute' : 'removeAttribute']('aria-activedescendant', this._activeDescendant);\n\n    this._updateTableCaption();\n\n    if (!this._activeDescendant) {\n      return;\n    }\n\n    el = document.getElementById(this._activeDescendant);\n\n    if (!el) {\n      return;\n    }\n\n    const newTable = this.querySelector('._coral-Calendar-table--transit');\n    const isTransitioning = newTable !== null;\n\n    if (isTransitioning) {\n      window.requestAnimationFrame(() => {\n        el.querySelector('._coral-Calendar-date').classList.add('is-focused');\n      });\n    }\n    else {\n      // Focus the selected date\n      el.querySelector('._coral-Calendar-date').classList.add('is-focused');\n    }\n  }\n\n  /**\n   Updates the table caption which serves as a live region to announce the currently focused date to assistive\n   technology, improving compatibility across operating systems, browsers and screen readers.\n\n   @ignore\n   */\n  _updateTableCaption() {\n    const caption = this._elements.body.querySelector('caption');\n\n    if (!caption) {\n      return;\n    }\n\n    if (caption.firstChild) {\n      caption.removeChild(caption.firstChild);\n    }\n    if (this._activeDescendant) {\n      const activeDescendant = this._elements.body.querySelector(`#${this._activeDescendant}`);\n      const captionText = document.createTextNode(activeDescendant.getAttribute('title'));\n      caption.appendChild(captionText);\n    }\n  }\n\n  /** @ignore */\n  _renderTable(year, month) {\n    const firstDate = new DateTime.Moment([year, month - 1, 1]);\n    let monthStartsAt = (firstDate.day() - this.startDay) % 7;\n    const dateLocal = this._value ? this._value.clone().startOf('day') : null;\n\n    if (monthStartsAt < 0) {\n      monthStartsAt += 7;\n    }\n\n    const data = {\n      i18n: i18n,\n      commons: commons,\n      // eslint-disable-next-line no-unused-vars\n      dayNames: ARRAYOF7.map((currentIndex, index) => {\n        const dayMoment = new DateTime.Moment().day((index + this.startDay) % 7);\n        return {\n          dayAbbr: dayMoment.format('dd'),\n          dayFullName: dayMoment.format('dddd')\n        };\n      }, this),\n\n      // eslint-disable-next-line no-unused-vars, arrow-body-style\n      weeks: ARRAYOF6.map((currentWeekIndex, weekIndex) => {\n        // eslint-disable-next-line no-unused-vars\n        return ARRAYOF7.map((currentDayIndex, dayIndex) => {\n          const result = {};\n          const cssClass = this.disabled ? ['is-disabled'] : [];\n          let ariaSelected = false;\n          let ariaInvalid = false;\n          const day = weekIndex * 7 + dayIndex - monthStartsAt;\n          const cursor = new DateTime.Moment([year, month - 1]);\n          // we use add() since 'day' could be a negative value\n          cursor.add(day, 'days');\n\n          const isCurrentMonth = cursor.month() + 1 === parseFloat(month);\n          const dayOfWeek = new DateTime.Moment().day((dayIndex + this.startDay) % 7).format('dddd');\n          const isToday = cursor.isSame(new DateTime.Moment(), 'day');\n\n          const cursorLocal = cursor.clone().startOf('day');\n\n          if (isToday) {\n            cssClass.push('is-today');\n          }\n\n          if (dateLocal && cursorLocal.isSame(dateLocal, 'day')) {\n            ariaSelected = true;\n            cssClass.push('is-selected');\n            if (this.invalid) {\n              ariaInvalid = true;\n              cssClass.push('is-invalid');\n            }\n          }\n\n          if (isCurrentMonth) {\n            cssClass.push('is-currentMonth');\n            if (!this.disabled && isDateInRange(cursor, this.min, this.max)) {\n              result.dateAttr = cursorLocal.format(INTERNAL_FORMAT);\n              result.weekIndex = cursor.week();\n              result.formattedDate = cursor.format('LL');\n            }\n            else {\n              cssClass.push('is-disabled');\n            }\n          }\n          else {\n            cssClass.push('is-outsideMonth');\n          }\n\n          result.isDisabled = this.disabled || !result.dateAttr;\n          result.dateText = cursor.date();\n          result.cssClass = cssClass.join(' ');\n          result.isToday = isToday;\n          result.ariaSelected = ariaSelected;\n          result.ariaInvalid = ariaInvalid;\n          result.dateLabel = dayOfWeek;\n          result.weekIndex = cursor.week();\n\n          return result;\n        }, this);\n      }, this)\n    };\n\n    const handles = {};\n    table.call(handles, data);\n\n    return handles.table;\n  }\n\n  /** @ignore */\n  _requireCursor() {\n    let cursor = this._cursor;\n    if (!cursor || !cursor.isValid()) {\n      // When its unknown what month we should be showing, use the set date. If that is not available, use 'today'\n      cursor = (this._value ? this._value.clone().startOf('day') : new DateTime.Moment()).startOf('month');\n      this._cursor = cursor;\n    }\n\n    return cursor;\n  }\n\n  /**\n   Navigate to previous or next timeUnit interval.\n\n   @param {String} unit\n   Year, Month, Week, Day\n   @param {Boolean} isNext\n   Whether to navigate forward or backward.\n\n   @private\n   */\n  _gotoPreviousOrNextTimeUnit(unit, isNext) {\n    const direction = isNext ? 'left' : 'right';\n    const operator = isNext ? 'add' : 'subtract';\n    const el = this._elements.body.querySelector('._coral-Calendar-date.is-focused');\n    let currentActive;\n    let currentMoment;\n    let newMoment;\n    let difference;\n\n    if (el) {\n      currentActive = el.dataset.date;\n      currentMoment = new DateTime.Moment(currentActive);\n      newMoment = currentMoment[operator](1, unit);\n\n      // make sure new moment is in range before transitioning\n      if (!this._isInRange(newMoment)) {\n        // advance to closest value in range\n        if (this._isBeforeMin(newMoment)) {\n          newMoment = this.min;\n        }\n        else if (this._isAfterMax(newMoment)) {\n          newMoment = this.max;\n        }\n        newMoment = new DateTime.Moment(newMoment);\n      }\n      difference = Math.abs(new DateTime.Moment(currentActive).diff(newMoment, 'days'));\n      this._getToNewMoment(direction, operator, difference);\n      this._setActiveDescendant();\n    }\n    else {\n      this._requireCursor();\n\n      // if cursor is out of range\n      if (!this._isInRange(this._cursor)) {\n        // advance to closest value in range\n        if (this._isBeforeMin(this._cursor)) {\n          newMoment = this.min;\n        }\n        else if (this._isAfterMax(this._cursor)) {\n          newMoment = this.max;\n        }\n        newMoment = new DateTime.Moment(newMoment);\n        difference = Math.abs(this._cursor.diff(newMoment, 'days'));\n        this._getToNewMoment(direction, operator, difference);\n        this._setActiveDescendant();\n        return;\n      }\n\n      this._cursor[operator](1, unit);\n      this._renderCalendar(direction);\n    }\n  }\n\n  /**\n   Checks if the Calendar is valid or not. This is done by checking that the current value is between the\n   provided <code>min</code> and <code>max</code> values. This check is only performed on user interaction.\n   @ignore\n   */\n  _validateCalendar() {\n    const isInvalid = !(this._value === null || isDateInRange(this._value, this.min, this.max));\n\n    if (this.invalid !== isInvalid) {\n      this.invalid = isInvalid;\n    }\n  }\n\n  /** @ignore */\n  _onNextOrPreviousMonthClick(event) {\n    event.preventDefault();\n\n    this._gotoPreviousOrNextTimeUnit(\n      event.altKey || event.metaKey || event.shiftKey ? timeUnit.YEAR : timeUnit.MONTH,\n      this._elements.next === event.matchedTarget\n    );\n    event.matchedTarget.focus();\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _getToNewMoment(direction, operator, difference) {\n    const el = this._elements.body.querySelector('._coral-Calendar-date.is-focused');\n    let currentActive;\n\n    if (el) {\n      currentActive = el.dataset.date;\n    }\n    else {\n      this._requireCursor();\n      currentActive = this._cursor.format(INTERNAL_FORMAT);\n    }\n\n    const currentMoment = new DateTime.Moment(currentActive);\n    const currentMonth = currentMoment.month();\n    const currentYear = currentMoment.year();\n    const newMoment = currentMoment[operator](difference, 'days');\n    const newMonth = newMoment.month();\n    const newYear = newMoment.year();\n    const newMomentValue = newMoment.format(INTERNAL_FORMAT);\n\n    if (newMonth !== currentMonth) {\n      this._requireCursor();\n      this._cursor[operator](1, 'months');\n      this._renderCalendar(direction);\n    }\n    else if (newMonth === currentMonth && newYear !== currentYear) {\n      this._requireCursor();\n      this._cursor[operator](1, 'years');\n      this._renderCalendar(direction);\n    }\n\n    const dateQuery = `._coral-Calendar-date[data-date^=${JSON.stringify(newMomentValue)}]`;\n    const newDescendant = this._elements.body.querySelector(dateQuery);\n    if (newDescendant) {\n      this._activeDescendant = newDescendant.parentNode.getAttribute('id');\n    }\n  }\n\n  /** @ignore */\n  _onDayMouseDown(event) {\n    this._activeDescendant = event.target.parentNode.id;\n    this._setActiveDescendant();\n    this._elements.body.focus();\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onDayClick(event) {\n    event.preventDefault();\n\n    this._elements.body.focus();\n\n    const date = new DateTime.Moment(event.target.dataset.date, INTERNAL_FORMAT);\n    let dateLocal;\n\n    // Carry over any user set time info\n    if (this._value) {\n      dateLocal = this._value.clone();\n    }\n\n    // Set attribute so a change event will be triggered if the user has selected a different date\n    if (validateAsChangedAndValidMoment(date, dateLocal)) {\n      this.value = date;\n      this.trigger('change');\n    }\n\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onEnterKey(event) {\n    event.preventDefault();\n\n    const el = this._elements.body.querySelector('._coral-Calendar-date.is-focused');\n\n    if (el) {\n      el.click();\n    }\n\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onUpKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._gotoPreviousOrNextTimeUnit(timeUnit.WEEK, false);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onDownKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._gotoPreviousOrNextTimeUnit(timeUnit.WEEK, true);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onRightKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._gotoPreviousOrNextTimeUnit(timeUnit.DAY, true);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onLeftKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._gotoPreviousOrNextTimeUnit(timeUnit.DAY, false);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onHomeOrEndKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const isHome = event.keyCode === Keys.keyToCode('home');\n    const direction = '';\n    const operator = isHome ? 'subtract' : 'add';\n    const el = this._elements.body.querySelector('._coral-Calendar-date.is-focused');\n\n    if (el) {\n      const currentActive = el.dataset.date;\n      const currentMoment = new DateTime.Moment(currentActive);\n      const difference = isHome ? currentMoment.date() - 1 : currentMoment.daysInMonth() - currentMoment.date();\n      this._getToNewMoment(direction, operator, difference);\n      this._setActiveDescendant();\n    }\n\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onPageDownKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this._gotoPreviousOrNextTimeUnit(timeUnit.MONTH, true);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onPageUpKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this._gotoPreviousOrNextTimeUnit(timeUnit.MONTH, false);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onCtrlPageDownKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this._gotoPreviousOrNextTimeUnit(timeUnit.YEAR, true);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onCtrlPageUpKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this._gotoPreviousOrNextTimeUnit(timeUnit.YEAR, false);\n    this._validateCalendar();\n  }\n\n  /** @ignore */\n  _onBodyFocus() {\n    if (Boolean(this._value)) {\n      this._setActiveDescendant();\n      this._validateCalendar();\n    }\n  }\n\n  /**\n   sets focus to appropriate descendant\n   */\n  focus() {\n    const focusedElement = this._elements.body.querySelector('.is-focused');\n    if (focusedElement !== document.activeElement && !this.disabled) {\n      this._setActiveDescendant();\n      this._elements.body.focus();\n    }\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      startday: 'startDay',\n      headerformat: 'headerFormat',\n      valueformat: 'valueFormat'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'startday',\n      'headerformat',\n      'min',\n      'max',\n      'valueformat',\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.setAttribute('role', 'group');\n\n    // Default reflected attribute\n    if (!this._valueFormat) {\n      this.valueFormat = INTERNAL_FORMAT;\n    }\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.header);\n    frag.appendChild(this._elements.body);\n\n    /// Clean Up (cloneNode support)\n    while (this.firstChild) {\n      this.removeChild(this.firstChild);\n    }\n\n    this.appendChild(frag);\n\n    // Render the calendar body if it's empty\n    if (!this._elements.body.firstElementChild) {\n      this._renderCalendar();\n    }\n  }\n});\n\nexport default Calendar;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 517,
    "kind": "function",
    "name": "isDateInRange",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~isDateInRange",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "ignore": true,
    "params": [
      {
        "name": "date",
        "types": [
          "*"
        ]
      },
      {
        "name": "startDate",
        "types": [
          "*"
        ]
      },
      {
        "name": "endDate",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 518,
    "kind": "function",
    "name": "toMoment",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~toMoment",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 44,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      },
      {
        "name": "format",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 519,
    "kind": "function",
    "name": "validateAsChangedAndValidMoment",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~validateAsChangedAndValidMoment",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 58,
    "ignore": true,
    "params": [
      {
        "name": "newValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "oldValue",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 520,
    "kind": "function",
    "name": "TableAnimator",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~TableAnimator",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Slides in new month tables, slides out old tables, and then cleans up the leftovers when it is done.",
    "lineNumber": 75,
    "ignore": true,
    "params": [
      {
        "name": "host",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 521,
    "kind": "variable",
    "name": "ARRAYOF6",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~ARRAYOF6",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 157,
    "ignore": true,
    "type": {
      "types": [
        "number[]"
      ]
    }
  },
  {
    "__docId__": 522,
    "kind": "variable",
    "name": "ARRAYOF7",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~ARRAYOF7",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 160,
    "ignore": true,
    "type": {
      "types": [
        "number[]"
      ]
    }
  },
  {
    "__docId__": 523,
    "kind": "variable",
    "name": "INTERNAL_FORMAT",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~INTERNAL_FORMAT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 163,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 524,
    "kind": "variable",
    "name": "timeUnit",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~timeUnit",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 166,
    "ignore": true,
    "type": {
      "types": [
        "{\"YEAR\": string, \"MONTH\": string, \"WEEK\": string, \"DAY\": string}"
      ]
    }
  },
  {
    "__docId__": 525,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 173,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 526,
    "kind": "variable",
    "name": "Calendar",
    "memberof": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-calendar/src/scripts/Calendar.js~Calendar",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Calendar}",
    "description": "A Calendar component that can be used as a date selection form field. Leverages {@link momentJS} if loaded\non the page.",
    "lineNumber": 184,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Calendar"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Calendar component that can be used as a date selection form field. Leverages {@link momentJS} if loaded\non the page."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-calendar"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-calendar></coral-calendar>",
      "<caption>JS constructor</caption>\nnew Coral.Calendar();"
    ],
    "see": [
      "../examples/#calendar"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 527,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport base from '../templates/base';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst COLOR_HINT_REG_EXP = /^#[0-9A-F]{6}$/i;\n\n/**\n Enumeration for {@link Card} variants.\n\n @typedef {Object} CardVariantEnum\n\n @property {String} DEFAULT\n Default card variant that shows the asset, overlay and content in their default positions.\n @property {String} QUIET\n Quiet card variant that shows the asset, overlay and content in their default positions.\n @property {String} CONDENSED\n Condensed card variant where the overlay is hidden and the content is shown over the image.\n @property {String} INVERTED\n Condensed card variant where the overlay is hidden and the content is shown over the image with a dark style.\n @property {String} ASSET\n Card variant where only the asset is shown.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet',\n  CONDENSED: 'condensed',\n  INVERTED: 'inverted',\n  ASSET: 'asset'\n};\n\n// the card's base classname\nconst CLASSNAME = '_coral-Card';\n\n// builds a string containing all possible variant classnames. this will be used to remove classnames when the variant\n// changes\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Card\n @classdesc A Card component to display content in different variations.\n @htmltag coral-card\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Card = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      asset: this.querySelector('coral-card-asset') || document.createElement('coral-card-asset'),\n      content: this.querySelector('coral-card-content') || document.createElement('coral-card-content'),\n      info: this.querySelector('coral-card-info') || document.createElement('coral-card-info'),\n      overlay: this.querySelector('coral-card-overlay') || document.createElement('coral-card-overlay'),\n      title : this.querySelector('coral-card-title') || document.createElement('coral-card-title'),\n    };\n    base.call(this._elements);\n\n    // Events\n    this._delegateEvents({\n      'capture:load coral-card-asset img': '_onLoad'\n    });\n  }\n\n  /**\n   The Asset of the card.\n\n   @type {CardAsset}\n   @contentzone\n   */\n  get asset() {\n    return this._getContentZone(this._elements.asset);\n  }\n\n  set asset(value) {\n    this._setContentZone('asset', value, {\n      handle: 'asset',\n      tagName: 'coral-card-asset',\n      insert: function (asset) {\n        this.insertBefore(asset, this.info || this._elements.wrapper || null);\n      }\n    });\n  }\n\n  /**\n   Hints the height of the asset that is going to be loaded. This prepares the size so that when the image is\n   loaded no reflow is triggered. Both <code>assetHeight</code> and <code>assetWidth</code> need to be specified\n   for this feature to take effect.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute assetheight\n   */\n  get assetHeight() {\n    return this._assetHeight || '';\n  }\n\n  set assetHeight(value) {\n    this._assetHeight = transform.number(value);\n\n    // Avoid a forced reflow by executing following in the next frame\n    window.requestAnimationFrame(() => {\n      // both hint dimensions need to be set in order to use this feature\n      if (!this._loaded && this._elements.asset && this.assetWidth && this._assetHeight) {\n        // gets the width without the border of the card\n        const clientRect = this.getBoundingClientRect();\n        const width = clientRect.right - clientRect.left;\n        // calculates the image ratio used to resize the height\n        const ratio = width / this.assetWidth;\n\n        // the image is considered \"low resolution\"\n        // @todo: check this after removal of lowResolution\n        if (ratio > 1) {\n          // 32 = $card-asset-lowResolution-padding * 2\n          this._elements.asset.style.height = `${this._assetHeight + 32}px`;\n        }\n        // for non-low resolution images, condensed and inverted cards do not require the height to be set\n        else if (this.variant !== variant.CONDENSED && this.variant !== variant.INVERTED) {\n          this._elements.asset.style.height = `${ratio * this._assetHeight}px`;\n        }\n      }\n    });\n  }\n\n  /**\n   Hints the width of the asset that is going to be loaded. This prepares the size so that when the image is\n   loaded no reflow is triggered. Both <code>assetHeight</code> and <code>assetWidth</code> need to be specified\n   for this feature to take effect.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute assetwidth\n   */\n  get assetWidth() {\n    return this._assetWidth || '';\n  }\n\n  set assetWidth(value) {\n    this._assetWidth = transform.number(value);\n  }\n\n  /**\n   @type {String}\n   @default \"\"\n   @htmlattribute colorhint\n   */\n  get colorHint() {\n    return this._colorHint || '';\n  }\n\n  set colorHint(value) {\n    if (COLOR_HINT_REG_EXP.test(value)) {\n      this._colorHint = value;\n\n      // if the image is already loaded we do not add the color hint to the asset\n      if (!this._loaded) {\n        this._elements.asset.style['background-color'] = this._colorHint;\n      }\n    }\n  }\n\n  /**\n   The Content of the card.\n\n   @type {CardContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-card-content',\n      insert: function (content) {\n        // Ensure title comes first\n        const title = content.querySelector('coral-card-title');\n        if (title) {\n          content.insertBefore(title, content.firstChild);\n        }\n\n        this._elements.wrapper.insertBefore(content, this.overlay || null);\n      }\n    });\n  }\n\n  /**\n   The information area of the card, which is placed over all the content. It is typically used for alerts.\n\n   @type {CardInfo}\n   @contentzone\n   */\n  get info() {\n    return this._getContentZone(this._elements.info);\n  }\n\n  set info(value) {\n    this._setContentZone('info', value, {\n      handle: 'info',\n      tagName: 'coral-card-info',\n      insert: function (info) {\n        this.appendChild(info);\n      }\n    });\n  }\n\n  /**\n   Fixes the width of the card. By default cards will take the width of their containers allowing them to interact\n   nicely with grids. Whenever they are used standalone fixing the width might be desired.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute fixedwidth\n   @htmlattributereflected\n   */\n  get fixedWidth() {\n    return this._fixedWidth || false;\n  }\n\n  set fixedWidth(value) {\n    this._fixedWidth = transform.booleanAttr(value);\n    this._reflectAttribute('fixedwidth', this._fixedWidth);\n\n    this.classList.toggle(`${CLASSNAME}--fixedWidth`, this._fixedWidth);\n  }\n\n  /**\n   The Overlay of the card.\n\n   @type {CardOverlay}\n   @contentzone\n   */\n  get overlay() {\n    return this._getContentZone(this._elements.overlay);\n  }\n\n  set overlay(value) {\n    this._setContentZone('overlay', value, {\n      handle: 'overlay',\n      tagName: 'coral-card-overlay',\n      insert: function (overlay) {\n        this._elements.wrapper.appendChild(overlay);\n      }\n    });\n  }\n\n  /**\n   Whether the card is stacked or not. This is used to represent several assets grouped together.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute stacked\n   @htmlattributereflected\n   */\n  get stacked() {\n    return this._stacked || false;\n  }\n\n  set stacked(value) {\n    this._stacked = transform.booleanAttr(value);\n    this._reflectAttribute('stacked', this._stacked);\n\n    this.classList.toggle(`${CLASSNAME}--stacked`, this._stacked);\n  }\n\n  /**\n   The card's variant. It determines which sections of the Card and in which position they are shown.\n   See {@link CardVariantEnum}.\n\n   @type {String}\n   @default CardVariantEnum.DEFAULT\n   @htmlattribute variant\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant !== variant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._variant}`);\n    }\n\n    this.assetHeight = this.assetHeight;\n  }\n\n  /** @ignore */\n  _onLoad(event) {\n    // @todo fix me for multiple images\n    // sets the image as loaded\n    this._loaded = true;\n\n    // removes the height style since the asset has been completely loaded\n    this._elements.asset.style.height = '';\n\n    // enables the transition\n    event.target.classList.remove('is-loading');\n  }\n\n  get _contentZones() {\n    return {\n      'coral-card-asset': 'asset',\n      'coral-card-content': 'content',\n      'coral-card-info': 'info',\n      'coral-card-overlay': 'overlay'\n    };\n  }\n\n  /**\n   Returns {@link Card} variants.\n\n   @return {CardVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      assetwidth: 'assetWidth',\n      assetheight: 'assetHeight',\n      colorhint: 'colorHint',\n      fixedwidth: 'fixedWidth'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'assetwidth',\n      'assetheight',\n      'colorhint',\n      'fixedwidth',\n      'variant',\n      'stacked'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    const content = this._elements.content;\n    const asset = this._elements.asset;\n    const title = this._elements.title;\n    const titleId = commons.getUID();\n\n    // Set title attributes after a frame to allow any inner text changes to be applied first\n    commons.nextFrame(() => {\n      if (title) {\n        setTimeout(function() {\n          title.setAttribute(\"title\", title.innerText);\n          title.setAttribute(\"aria-label\", title.innerText);\n          title.setAttribute(\"id\", titleId);\n        }, 1);\n      }\n    });\n\n    // Prepares images to be loaded nicely\n    const images = asset.querySelectorAll('img');\n    const imagesCount = images.length;\n    for (let i = 0 ; i < imagesCount ; i++) {\n      const image = images[i];\n      if (!image.hasAttribute(\"alt\")) {\n        image.setAttribute(\"alt\", \"\");\n      }\n      if (!image.complete) {\n        image.classList.add('is-loading');\n      }\n    }\n\n    for (const contentZone in this._contentZones) {\n      const element = this._elements[this._contentZones[contentZone]];\n      // Remove it so we can process children\n      if (element.parentNode) {\n        element.parentNode.removeChild(element);\n      }\n    }\n\n    // Moves everything into the main content zone\n    while (this.firstChild) {\n      const child = this.firstChild;\n      // Removes the empty spaces\n      if (child.nodeType === Node.TEXT_NODE && child.textContent.trim() !== '' ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'wrapper') {\n        // Add non-template elements to the content\n        content.appendChild(child);\n      }\n      // Remove anything else element\n      else {\n        this.removeChild(child);\n      }\n    }\n\n    // Assign the content zones so the insert functions will be called\n    this.overlay = this._elements.overlay;\n    this.content = content;\n    this.info = this._elements.info;\n\n    this.appendChild(this._elements.wrapper);\n\n    // The 'asset' setter knows to insert the element just before the wrapper node.\n    this.asset = asset;\n\n    // In case a lot of alerts are added, they will not overflow the card\n    // Also check whether any alerts are available\n    requestAnimationFrame(()=> {\n      this.classList.toggle(`${CLASSNAME}--overflow`, this.info.childNodes.length && this.info.scrollHeight > this.clientHeight);\n    });\n  }\n});\n\nexport default Card;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/Card.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 528,
    "kind": "variable",
    "name": "COLOR_HINT_REG_EXP",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/Card.js~COLOR_HINT_REG_EXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 529,
    "kind": "typedef",
    "name": "CardVariantEnum",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/Card.js~CardVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Card} variants.",
    "lineNumber": 36,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Default card variant that shows the asset, overlay and content in their default positions."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "Quiet card variant that shows the asset, overlay and content in their default positions."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CONDENSED",
        "description": "Condensed card variant where the overlay is hidden and the content is shown over the image."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INVERTED",
        "description": "Condensed card variant where the overlay is hidden and the content is shown over the image with a dark style."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ASSET",
        "description": "Card variant where only the asset is shown."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CardVariantEnum"
    }
  },
  {
    "__docId__": 530,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/Card.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 45,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 531,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/Card.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 49,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 532,
    "kind": "variable",
    "name": "Card",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/Card.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/Card.js~Card",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card component to display content in different variations.",
    "lineNumber": 61,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card component to display content in different variations."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-card></coral-card>",
      "<caption>JS constructor</caption>\nnew Coral.Card();"
    ],
    "see": [
      "../examples/#card"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 533,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardAsset.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Asset\n @classdesc The Card Asset\n @htmltag coral-card-asset\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-asset');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardAsset.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 534,
    "kind": "function",
    "name": "CardAsset",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardAsset.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardAsset.js~CardAsset",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "The Card Asset",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Asset"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Card Asset"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-asset"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-asset></coral-card-asset>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Asset();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 535,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Content\n @classdesc The Card Content\n @htmltag coral-card-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 536,
    "kind": "function",
    "name": "CardContent",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardContent.js~CardContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "The Card Content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Card Content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-content></coral-card-content>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Content();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 537,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardContext.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Context\n @classdesc A Card context component\n @htmltag coral-card-context\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-context');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardContext.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 538,
    "kind": "function",
    "name": "CardContext",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardContext.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardContext.js~CardContext",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card context component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Context"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card context component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-context"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-context></coral-card-context>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Context();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 539,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardDescription.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Description\n @classdesc A Card description component\n @htmltag coral-card-description\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-description');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardDescription.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 540,
    "kind": "function",
    "name": "CardDescription",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardDescription.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardDescription.js~CardDescription",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card description component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Description"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card description component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-description"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-description></coral-card-description>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Description();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 541,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardInfo.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Info\n @classdesc The Card Info\n @htmltag coral-card-info\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-info');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardInfo.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 542,
    "kind": "function",
    "name": "CardInfo",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardInfo.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardInfo.js~CardInfo",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "The Card Info",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Info"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Card Info"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-info"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-info></coral-card-info>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Info();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 543,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardOverlay.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Overlay\n @classdesc The Card Overlay\n @htmltag coral-card-overlay\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-overlay');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardOverlay.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 544,
    "kind": "function",
    "name": "CardOverlay",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardOverlay.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardOverlay.js~CardOverlay",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "The Card Overlay",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Overlay"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Card Overlay"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-overlay"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-overlay></coral-card-overlay>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Overlay();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 545,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardProperty.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons} from '../../../coral-utils';\nimport '../../../coral-component-icon';\nimport icon from '../templates/icon';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Card-property';\n\n/**\n @class Coral.Card.Property\n @classdesc A Card property component\n @htmltag coral-card-property\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CardProperty = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      content: this.querySelector('coral-card-property-content') || document.createElement('coral-card-property-content')\n    };\n    icon.call(this._elements);\n  }\n\n  /**\n   The property's content zone\n\n   @type {CardPropertyContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-card-property-content',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Specifies the icon name used inside the property. See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.icon.icon;\n  }\n\n  set icon(value) {\n    this._elements.icon.icon = value;\n\n    // removes the icon element from the DOM since there is no valid icon. this causes the content to have the\n    // correct styling\n    if (this.icon === '') {\n      this._elements.icon.remove();\n    } else if (!this._elements.icon.parentNode) {\n      this.insertBefore(this._elements.icon, this.firstChild);\n    }\n  }\n\n  /**\n   Specifies the alternative text to be used for the icon.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute iconalt\n   */\n  get iconAlt() {\n    return this._elements.icon ? this._elements.icon.getAttribute('alt') : undefined;\n  }\n\n  set iconAlt(value) {\n    this._elements.icon && this._elements.icon.setAttribute('alt', value);\n  }\n\n  /**\n   Specifies the title attribute to be used for the icon.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icontitle\n   */\n  get iconTitle() {\n    return this._elements.icon ? this._elements.icon.getAttribute('title') : undefined;\n  }\n\n  set iconTitle(value) {\n    this._elements.icon && this._elements.icon.setAttribute('title', value);\n  }\n\n  get _contentZones() {\n    return {'coral-card-property-content': 'content'};\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      iconalt: 'iconAlt',\n      icontitle: 'iconTitle',\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['icon', 'iconalt', 'icontitle']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, 'coral-Body--small');\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    // Render the main template\n    if (this.icon) {\n      frag.appendChild(this._elements.icon);\n    }\n\n    const content = this._elements.content;\n\n    // Remove it so we can process children\n    if (content.parentNode) {\n      content.parentNode.removeChild(content);\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'icon') {\n        // Add non-template elements to the label\n        content.appendChild(child);\n      } else {\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(frag);\n\n    // Assign the content zones, moving them into place in the process\n    this.content = content;\n\n    // Adjusting icon aria-label attribute as per coral-card-property title attribute\n\n    var parentElement;\n    if (this._elements && this._elements.icon) {\n      parentElement = this._elements.icon.parentElement;\n      if (parentElement !== null && parentElement.hasAttribute(\"title\")) {\n        const iconParentTitle = parentElement.getAttribute(\"title\");\n        this._elements.icon.setAttribute(\"aria-label\", iconParentTitle);\n      }\n    }\n \n  }\n});\n\nexport default CardProperty;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardProperty.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 546,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardProperty.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardProperty.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 547,
    "kind": "variable",
    "name": "CardProperty",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardProperty.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardProperty.js~CardProperty",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card property component",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Property"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card property component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-property"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-card-property></coral-card-property>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Property();"
    ],
    "see": [
      "../examples/#card"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 548,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardPropertyContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Property.Content\n @classdesc A Card Property Content component\n @htmltag coral-card-property-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-property-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardPropertyContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 549,
    "kind": "function",
    "name": "CardPropertyContent",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardPropertyContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardPropertyContent.js~CardPropertyContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card Property Content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Property.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card Property Content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-property-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-property-content></coral-card-property-content>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Property.Content();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 550,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardPropertyList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.Card.PropertyList\n @classdesc The Card PropertyList component\n @htmltag coral-card-propertylist\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CardPropertyList = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add('u-coral-clearFix');\n\n    // Empty it if no items\n    if (this.innerHTML.trim() === '') {\n      this.textContent = '';\n    }\n  }\n});\n\nexport default CardPropertyList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardPropertyList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 551,
    "kind": "variable",
    "name": "CardPropertyList",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardPropertyList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardPropertyList.js~CardPropertyList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "The Card PropertyList component",
    "lineNumber": 23,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.PropertyList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Card PropertyList component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-propertylist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-card-propertylist></coral-card-propertylist>",
      "<caption>JS constructor</caption>\nnew Coral.Card.PropertyList();"
    ],
    "see": [
      "../examples/#card"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 552,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardSubtitle.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Subtitle\n @classdesc A Card sub title component\n @htmltag coral-card-subtitle\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-subtitle');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardSubtitle.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 553,
    "kind": "function",
    "name": "CardSubtitle",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardSubtitle.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardSubtitle.js~CardSubtitle",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card sub title component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Subtitle"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card sub title component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-subtitle"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-subtitle></coral-card-subtitle>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Subtitle();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 554,
    "kind": "file",
    "name": "coral-spectrum/coral-component-card/src/scripts/CardTitle.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Card.Title\n @classdesc A Card title component\n @htmltag coral-card-title\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-card-title');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-card/src/scripts/CardTitle.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 555,
    "kind": "function",
    "name": "CardTitle",
    "memberof": "coral-spectrum/coral-component-card/src/scripts/CardTitle.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-card/src/scripts/CardTitle.js~CardTitle",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Card}",
    "description": "A Card title component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Card.Title"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Card title component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-card-title"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-card-title></coral-card-title>",
      "<caption>JS constructor</caption>\nnew Coral.Card.Title();"
    ],
    "see": [
      "../examples/#card"
    ],
    "params": []
  },
  {
    "__docId__": 556,
    "kind": "file",
    "name": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons, transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-CharacterCount';\n\n/**\n Enumeration for {@link CharacterCount} targets.\n\n @typedef {Object} CharacterCountTargetEnum\n\n @property {String} PREVIOUS\n Relates the CharacterCount to the previous sibling.\n @property {String} NEXT\n Relates the CharacterCount to the next sibling.\n */\nconst target = {\n  PREVIOUS: '_prev',\n  NEXT: '_next'\n};\n\n/**\n @class Coral.CharacterCount\n @classdesc A CharacterCount component that indicates the remaining characters in a Textfield or Textarea.\n @htmltag coral-charactercount\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CharacterCount = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The target Textfield or Textarea for this component. It accepts values from {@link CharacterCountTargetEnum},\n   as well as any DOM element or CSS selector.\n\n   @type {HTMLElement|String}\n   @default CharacterCountTargetEnum.PREVIOUS\n   @htmlattribute target\n   */\n  get target() {\n    return this._target || target.PREVIOUS;\n  }\n\n  set target(value) {\n    if (typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      // Remove previous event listener\n      if (this._targetEl) {\n        this._targetEl.removeEventListener('input', this._refreshCharCount.bind(this));\n      }\n\n      // Get the target DOM element\n      if (value === target.NEXT) {\n        this._targetEl = this.nextElementSibling;\n      } else if (value === target.PREVIOUS) {\n        this._targetEl = this.previousElementSibling;\n      } else if (typeof value === 'string') {\n        this._targetEl = document.querySelector(value);\n      } else {\n        this._targetEl = value;\n      }\n\n      if (this._targetEl) {\n        this._targetEl.addEventListener('input', this._refreshCharCount.bind(this));\n\n        // Try to get maxlength from target element\n        if (this._targetEl.getAttribute('maxlength')) {\n          this.maxLength = this._targetEl.getAttribute('maxlength');\n        }\n      }\n    }\n  }\n\n  /**\n   Maximum character length for the TextField/TextArea (will be read from target field markup if able).\n\n   @type {Number}\n   @default null\n   @htmlattribute maxlength\n   @htmlattributereflected\n   */\n  get maxLength() {\n    return this._maxLength || null;\n  }\n\n  set maxLength(value) {\n    this._maxLength = transform.number(value);\n    this._reflectAttribute('maxlength', this._maxLength);\n\n    this._refreshCharCount();\n  }\n\n  /** @ignore */\n  _getCharCount() {\n    let elementLength = 0;\n    if (this._targetEl && this._targetEl.value) {\n      elementLength = this._targetEl.value.length;\n    }\n\n    return this._maxLength ? this._maxLength - elementLength : elementLength;\n  }\n\n  /** @ignore */\n  _refreshCharCount() {\n    const currentCount = this._getCharCount();\n    /** @ignore */\n    this.innerHTML = currentCount;\n    const isMaxExceeded = currentCount < 0;\n    if (this._targetEl) {\n      this._targetEl.classList.toggle('is-invalid', isMaxExceeded);\n      this.classList.toggle('is-invalid', isMaxExceeded);\n    }\n  }\n\n  /**\n   Returns {@link CharacterCount} target options.\n\n   @return {CharacterCountTargetEnum}\n   */\n  static get target() {\n    return target;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      maxlength: 'maxLength'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['target', 'maxlength']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, 'coral-Body--S');\n\n    // Set defaults\n    this.target = this.target;\n\n    // Refresh once connected\n    this._refreshCharCount();\n  }\n});\n\nexport default CharacterCount;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 557,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 558,
    "kind": "typedef",
    "name": "CharacterCountTargetEnum",
    "memberof": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js~CharacterCountTargetEnum",
    "access": "public",
    "description": "Enumeration for {@link CharacterCount} targets.",
    "lineNumber": 29,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PREVIOUS",
        "description": "Relates the CharacterCount to the previous sibling."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NEXT",
        "description": "Relates the CharacterCount to the next sibling."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CharacterCountTargetEnum"
    }
  },
  {
    "__docId__": 559,
    "kind": "variable",
    "name": "CharacterCount",
    "memberof": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-charactercount/src/scripts/CharacterCount.js~CharacterCount",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CharacterCount}",
    "description": "A CharacterCount component that indicates the remaining characters in a Textfield or Textarea.",
    "lineNumber": 41,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CharacterCount"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A CharacterCount component that indicates the remaining characters in a Textfield or Textarea."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-charactercount"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-charactercount></coral-charactercount>",
      "<caption>JS constructor</caption>\nnew Coral.CharacterCount();"
    ],
    "see": [
      "../examples/#charactercount"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 560,
    "kind": "file",
    "name": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {Icon} from '../../../coral-component-icon';\nimport base from '../templates/base';\nimport {transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst IS_IE_OR_EDGE = navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0 ||\n  window.navigator.userAgent.indexOf('Edge') !== -1;\n\nconst CLASSNAME = '_coral-Checkbox';\n\n/**\n @class Coral.Checkbox\n @classdesc A Checkbox component to be used as a form field.\n @htmltag coral-checkbox\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Checkbox = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // @polyfill ie\n    this._delegateEvents(commons.extend(this._events, {\n      click: '_onClick',\n      mousedown: '_onMouseDown'\n    }));\n\n    // Prepare templates\n    this._elements = {\n      // Try to find the label content zone or create one\n      label: this.querySelector('coral-checkbox-label') || document.createElement('coral-checkbox-label')\n    };\n    base.call(this._elements, {commons, i18n, Icon});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Check if the label is empty whenever we get a mutation\n    this._observer = new MutationObserver(this._hideLabelIfEmpty.bind(this));\n\n    // Watch for changes to the label element's children\n    this._observer.observe(this._elements.labelWrapper, {\n      // Catch changes to childList\n      childList: true,\n      // Catch changes to textContent\n      characterData: true,\n      // Monitor any child node\n      subtree: true\n    });\n  }\n\n  /**\n   Checked state for the checkbox.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute checked\n   @htmlattributereflected\n   @emits {change}\n   */\n  get checked() {\n    return this._checked || false;\n  }\n\n  set checked(value) {\n    this._checked = transform.booleanAttr(value);\n    this._reflectAttribute('checked', this._checked);\n\n    this._elements.input.checked = this._checked;\n  }\n\n  /**\n   Indicates that the checkbox is neither on nor off.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute indeterminate\n   @htmlattributereflected\n   */\n  get indeterminate() {\n    return this._indeterminate || false;\n  }\n\n  set indeterminate(value) {\n    this._indeterminate = transform.booleanAttr(value);\n    this._reflectAttribute('indeterminate', this._indeterminate);\n\n    this.classList.toggle('is-indeterminate', this._indeterminate);\n    this._elements.input.indeterminate = this._indeterminate;\n    this._elements.input[this._indeterminate ? 'setAttribute' : 'removeAttribute']('aria-checked', 'mixed');\n  }\n\n  /**\n   The checkbox's label element.\n\n   @type {CheckboxLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-checkbox-label',\n      insert: function (label) {\n        this._elements.labelWrapper.appendChild(label);\n      }\n    });\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   The value that will be submitted when the checkbox is checked. Changing this value will not trigger an event.\n\n   @type {String}\n   @default \"on\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.input.value || 'on';\n  }\n\n  set value(value) {\n    this._elements.input.value = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input.disabled = this._disabled;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this.classList.toggle('is-readOnly', this._readOnly);\n    this._elements.input.tabIndex = this._readOnly ? -1 : 0;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    this._hideLabelIfEmpty();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    this._hideLabelIfEmpty();\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    // it uses the name as the first fallback since it is not localized, otherwise it uses the label\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.name ? `${this.name}=${this.value}` : '') || (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property needs to be set in this component.\n\n   @protected\n   */\n  get _componentTargetProperty() {\n    return 'checked';\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property has to be extracted from the event.\n\n   @protected\n   */\n  get _eventTargetProperty() {\n    return 'checked';\n  }\n\n  /** @private */\n  _onInputChange(event) {\n    // stops the current event\n    event.stopPropagation();\n\n    /** @ignore */\n    this[this._componentTargetProperty] = event.target[this._eventTargetProperty];\n\n    // resets the indeterminate state after user interaction\n    this.indeterminate = false;\n\n    // Explicitly re-emit the change event after the property has been set\n    if (this._triggerChangeEvent) {\n      // @polyfill ie/edge\n      if (IS_IE_OR_EDGE) {\n        // We need 1 additional frame in case the indeterminate state is set manually on change event\n        window.requestAnimationFrame(() => {\n          this.trigger('change');\n        });\n      } else {\n        this.trigger('change');\n      }\n    }\n  }\n\n  /**\n   @private\n   @polyfill ie/edge\n   */\n  _onClick(event) {\n    // Force the check/uncheck and trigger the change event since IE won't.\n    if (IS_IE_OR_EDGE && this.indeterminate) {\n      // Other browsers like Chrome and Firefox will trigger the change event and set indeterminate = false. So we\n      // verify if indeterminate was changed and if not, we manually check/uncheck and trigger the change event.\n      this.checked = !this.checked;\n      this._onInputChange(event);\n    }\n    // Handle the click() just like the native checkbox\n    else if (event.target === this) {\n      this.indeterminate = false;\n      this.checked = !this.checked;\n      this.trigger('change');\n    }\n\n    this._trackEvent(this.checked ? 'checked' : 'unchecked', 'coral-checkbox', event);\n  }\n\n  /**\n   Forces checkbox to receive focus on mousedown\n   @ignore\n   */\n  _onMouseDown() {\n    const target = this._elements.input;\n    window.requestAnimationFrame(() => {\n      if (target !== document.activeElement) {\n        target.focus();\n      }\n    });\n  }\n\n  /**\n   Hide the label if it's empty\n   @ignore\n   */\n  _hideLabelIfEmpty() {\n    const label = this._elements.label;\n\n    // If it's empty and has no non-textnode children, hide the label\n    const hiddenValue = !(label.children.length === 0 && label.textContent.replace(/\\s*/g, '') === '');\n\n    // Toggle the screen reader text\n    this._elements.labelWrapper.style.margin = !hiddenValue ? '0' : '';\n    this._elements.screenReaderOnly.hidden = !!hiddenValue || !!this.labelledBy || !!this.labelled;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#clear}.\n   */\n  clear() {\n    this.checked = false;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    this.checked = this._initialCheckedState;\n  }\n\n  get _contentZones() {\n    return {'coral-checkbox-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['indeterminate', 'checked']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    const templateHandleNames = ['input', 'checkbox', 'labelWrapper'];\n\n    // Render the main template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.checkbox);\n    frag.appendChild(this._elements.labelWrapper);\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      label.parentNode.removeChild(label);\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        label.appendChild(child);\n      } else {\n        // Remove anything else (e.g labelWrapper)\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(frag);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n\n    // Cache the initial checked state of the checkbox (in order to implement reset)\n    this._initialCheckedState = this.checked;\n\n    // Check if we need to hide the label\n    // We must do this because IE does not catch mutations when nodes are not in the DOM\n    this._hideLabelIfEmpty();\n  }\n});\n\nexport default Checkbox;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 561,
    "kind": "variable",
    "name": "IS_IE_OR_EDGE",
    "memberof": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js~IS_IE_OR_EDGE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 562,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 563,
    "kind": "variable",
    "name": "Checkbox",
    "memberof": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-checkbox/src/scripts/Checkbox.js~Checkbox",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Checkbox}",
    "description": "A Checkbox component to be used as a form field.",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Checkbox"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Checkbox component to be used as a form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-checkbox"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-checkbox></coral-checkbox>",
      "<caption>JS constructor</caption>\nnew Coral.Checkbox();"
    ],
    "see": [
      "../examples/#checkbox"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 564,
    "kind": "file",
    "name": "coral-spectrum/coral-component-checkbox/src/scripts/CheckboxLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Checkbox.Label\n @classdesc The Checkbox label\n @htmltag coral-checkbox-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-checkbox-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-checkbox/src/scripts/CheckboxLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 565,
    "kind": "function",
    "name": "CheckboxLabel",
    "memberof": "coral-spectrum/coral-component-checkbox/src/scripts/CheckboxLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-checkbox/src/scripts/CheckboxLabel.js~CheckboxLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Checkbox}",
    "description": "The Checkbox label",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Checkbox.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Checkbox label"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-checkbox-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-checkbox-label></coral-checkbox-label>",
      "<caption>JS constructor</caption>\nnew Coral.Checkbox.Label();"
    ],
    "see": [
      "../examples/#checkbox"
    ],
    "params": []
  },
  {
    "__docId__": 566,
    "kind": "file",
    "name": "coral-spectrum/coral-component-checkboxgroup/src/scripts/CheckboxGroup.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFieldGroup} from '../../../coral-base-fieldgroup';\nimport '../../../coral-component-checkbox';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.CheckboxGroup\n @classdesc A CheckboxGroup component to group checkbox fields\n @htmltag coral-checkboxgroup\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFieldGroup}\n */\nconst CheckboxGroup = Decorator(class extends BaseFieldGroup(BaseComponent(HTMLElement)) {\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-checkbox';\n  }\n\n  /**\n   Returns an Array containing the selected field group items.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected('checked');\n  }\n});\n\nexport default CheckboxGroup;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-checkboxgroup/src/scripts/CheckboxGroup.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 567,
    "kind": "variable",
    "name": "CheckboxGroup",
    "memberof": "coral-spectrum/coral-component-checkboxgroup/src/scripts/CheckboxGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-checkboxgroup/src/scripts/CheckboxGroup.js~CheckboxGroup",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CheckboxGroup}",
    "description": "A CheckboxGroup component to group checkbox fields",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CheckboxGroup"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A CheckboxGroup component to group checkbox fields"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-checkboxgroup"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFieldGroup}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-checkboxgroup></coral-checkboxgroup>",
      "<caption>JS constructor</caption>\nnew Coral.CheckboxGroup();"
    ],
    "see": [
      "../examples/#checkboxgroup"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 568,
    "kind": "file",
    "name": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {DateTime} from '../../../coral-datetime';\nimport '../../../coral-component-textfield';\nimport '../../../coral-component-select';\nimport base from '../templates/base';\nimport {transform, commons, validate, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n// Default for display and value format\nconst DEFAULT_HOUR_FORMAT = 'HH';\nconst DEFAULT_MINUTE_FORMAT = 'mm';\nconst DEFAULT_TIME_FORMAT = `${DEFAULT_HOUR_FORMAT}:${DEFAULT_MINUTE_FORMAT}`;\n\n// Used to extract the time format from a date format\nconst AUTHORIZED_TOKENS = '(A|a|H{1,2}|h{1,2}|k{1,2}|m{1,2})';\nconst TIME_REG_EXP = new RegExp(`${AUTHORIZED_TOKENS}.*${AUTHORIZED_TOKENS}|${AUTHORIZED_TOKENS}`);\nconst HOUR_REG_EXP = new RegExp('h{1,2}|H{1,2}|k{1,2}');\nconst MIN_REG_EXP = new RegExp('m{1,2}');\n\n/**\n Enumeration for {@link Clock} variants.\n\n @typedef {Object} ClockVariantEnum\n\n @property {String} DEFAULT\n A default, gray Clock.\n @property {String} QUIET\n A Clock with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\nconst CLASSNAME = '_coral-Clock';\n\n// builds an array containing all possible variant classnames. this will be used to remove classnames when the variant\n// changes\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Clock\n @classdesc A Clock component that can be used as a time selection form field. Leverages {@link momentJS} if loaded\n on the page.\n @htmltag coral-clock\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Clock = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Default value\n    this._value = '';\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      'change [handle=\"period\"]': '_onPeriodChange'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    this._template = base.call(this._elements, {commons, i18n});\n\n    // Pre-define labellable element\n    this._labellableElement = this;\n\n    // Add aria-errormessage attribute to coral-clock element\n    this.errorID = (this.id || commons.getUID()) + \"-coral-clock-error-label\";\n\n    // Prevent typing in specific characters which can be added to number inputs\n    const forbiddenChars = [\"-\", \"+\", \"e\", \",\", \".\"];\n    this.addEventListener(\"keydown\", (e) => {\n      if (forbiddenChars.includes(e.key)) {\n        e.preventDefault();\n      }\n    });\n  }\n\n  /**\n   The format used to display the selected time to the user. If the user manually types a time, this format\n   will be used to parse the value. 'HH:mm' is supported by default. Include momentjs to support additional format\n   string options see http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"HH:mm\"\n   @htmlattribute displayformat\n   @htmlattributereflected\n   */\n  get displayFormat() {\n    return this._displayFormat || DEFAULT_TIME_FORMAT;\n  }\n\n  set displayFormat(value) {\n    this._displayFormat = this._extractTimeFormat(transform.string(value).trim(), TIME_REG_EXP, DEFAULT_TIME_FORMAT);\n    this._reflectAttribute('displayformat', this._displayFormat);\n\n    this._syncDisplay();\n  }\n\n  /**\n   The format to use on expressing the time as a string on the <code>value</code> attribute. The value\n   will be sent to the server using this format. If an empty string is provided, then the default value per type\n   will be used. 'HH:mm' is supported by default. Include momentjs to support additional format string options\n   see http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"HH:mm\"\n   @htmlattribute valueformat\n   @htmlattributereflected\n   */\n  get valueFormat() {\n    return this._valueFormat || DEFAULT_TIME_FORMAT;\n  }\n\n  set valueFormat(value) {\n    const setValueFormat = (newValue) => {\n      this._valueFormat = this._extractTimeFormat(transform.string(newValue).trim(), TIME_REG_EXP, DEFAULT_TIME_FORMAT);\n      this._reflectAttribute('valueformat', this._valueFormat);\n    };\n\n    // Once the valueFormat is set, we make sure the value is also correct\n    if (!this._valueFormat && this._originalValue) {\n      setValueFormat(value);\n      this.value = this._originalValue;\n    } else {\n      setValueFormat(value);\n      this._elements.input.value = this.value;\n    }\n  }\n\n  /**\n   The current value as a Date. If the value is \"\" or an invalid date, <code>null</code> will be returned.\n\n   @type {Date}\n   @default null\n   */\n  get valueAsDate() {\n    return this._value ? new Date(this._value.toDate().getTime()) : null;\n  }\n\n  set valueAsDate(value) {\n    this.value = value instanceof Date ? new DateTime.Moment(value, null, true).format(this.valueFormat) : '';\n  }\n\n  /**\n   The clock's variant. See {@link ClockVariantEnum}.\n\n   @type {String}\n   @default ClockVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    // passes down the variant to the underlying components\n    this._elements.hours.variant = this._variant;\n    this._elements.minutes.variant = this._variant;\n    this._elements.period.variant = this._variant;\n\n    // removes every existing variant\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant !== variant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._variant}`);\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.hours.disabled = this._disabled;\n    this._elements.minutes.disabled = this._disabled;\n    // stops the form submission\n    this._elements.input.disabled = this._disabled;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this._elements.hours.invalid = this._invalid;\n    this._elements.minutes.invalid = this._invalid;\n    this._elements.hours.setAttribute(\"aria-errormessage\", this.errorID);\n    this._elements.minutes.setAttribute(\"aria-errormessage\", this.errorID);\n\n    const ERROR_LABEL_ELEMENT_CLASS = \"._coral-Clock .coral-Form-errorlabel\";\n    const errorLabel = this.querySelector(ERROR_LABEL_ELEMENT_CLASS);\n\n    if (this._elements.hours.invalid || this._elements.minutes.invalid) {\n      errorLabel.setAttribute(\"id\", this.errorID);\n      errorLabel.setAttribute(\"aria-live\", \"assertive\");\n      errorLabel.hidden = false;\n      errorLabel.style.display = \"table-caption\";\n      errorLabel.style[\"caption-side\"] = \"bottom\";\n    } else {\n      errorLabel.setAttribute(\"aria-live\", \"off\");\n      errorLabel.hidden = true;\n    }\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.hours.required = this._required;\n    this._elements.minutes.required = this._required;\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.hours.readOnly = this._readOnly;\n    this._elements.minutes.readOnly = this._readOnly;\n    this._elements.input.readOnly = this._readOnly;\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._getValueAsString(this._value, this.valueFormat);\n  }\n\n  set value(value) {\n    value = typeof value === 'string' ? value : '';\n    // This is used to change the value if valueformat is also set but afterwards\n    this._originalValue = value;\n\n    // we do strict conversion of the values\n    const time = new DateTime.Moment(value, this.valueFormat, true);\n    this._value = time.isValid() ? time : '';\n    this._elements.input.value = this.value;\n\n    this._syncValueAsText();\n    this._syncDisplay();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    // Get current aria-labelledby attribute on the labellable element.\n    let labelledBy = this.getAttribute('aria-labelledby');\n\n    // If a labelledBy attribute has been defined,\n    if (labelledBy) {\n      // and strip the valueAsText element id from the end of the aria-labelledby string.\n      labelledBy = labelledBy.replace(this._elements.valueAsText.id, '').trim();\n\n      // If the resulting labelledBy string is empty, return null.\n      if (!labelledBy.length) {\n        labelledBy = null;\n      }\n    }\n    return labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    // The specified labelledBy property.\n    const labelledBy = this.labelledBy;\n\n    // An array of element ids to label control, the last being the valueAsText element id.\n    const ids = [this._elements.valueAsText.id];\n\n    // If a labelledBy property exists,\n    if (labelledBy) {\n      // prepend the labelledBy value to the ids array\n      ids.unshift(labelledBy);\n\n      // Set aria-labelledby attribute on the labellable element joining ids array into space-delimited list of ids.\n      this.setAttribute('aria-labelledby', ids.join(' '));\n    } else {\n      // labelledBy property is null, remove the aria-labelledby attribute.\n      this.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /**\n   Ignore the date part and use the time part only\n\n   @private\n   */\n  _extractTimeFormat(format, regExp, defaultFormat) {\n    const match = regExp.exec(format);\n    return match && match.length && match[0] !== '' ? match[0] : defaultFormat;\n  }\n\n  /**\n   Sync time display based on the format\n\n   @private\n   */\n  _syncDisplay() {\n    const hourFormat = this._extractTimeFormat(this.displayFormat, HOUR_REG_EXP, DEFAULT_HOUR_FORMAT);\n    const minuteFormat = this._extractTimeFormat(this.displayFormat, MIN_REG_EXP, DEFAULT_MINUTE_FORMAT);\n\n    this._elements.hours.placeholder = hourFormat;\n    this._elements.minutes.placeholder = minuteFormat;\n\n    this._elements.hours.value = this._getValueAsString(this._value, hourFormat);\n    this._elements.minutes.value = this._getValueAsString(this._value, minuteFormat);\n\n    this._syncPeriod();\n    this._syncValueAsText();\n  }\n\n  /**\n   Sync period selector based on the format\n\n   @private\n   */\n  _syncPeriod() {\n    const period = this._elements.period;\n    const time = this._value;\n    const am = i18n.get('am');\n    const pm = i18n.get('pm');\n    const items = period.items.getAll();\n\n    if (time && time.isValid()) {\n      if (time.hours() < 12) {\n        period.value = 'am';\n      } else {\n        period.value = 'pm';\n      }\n    }\n\n    // Check for am/pm\n    if (this.displayFormat.indexOf('a') !== -1) {\n      items[0].textContent = am;\n      items[1].textContent = pm;\n      this._togglePeriod(true);\n    } else if (this.displayFormat.indexOf('A') !== -1) {\n      items[0].textContent = am.toUpperCase();\n      items[1].textContent = pm.toUpperCase();\n      this._togglePeriod(true);\n    } else {\n      this._togglePeriod(false);\n    }\n  }\n\n  /** @private */\n  _togglePeriod(show) {\n    this.classList.toggle(`${CLASSNAME}--extended`, show);\n    this._elements.period.hidden = !show;\n  }\n\n  /** @private */\n  _onPeriodChange(event) {\n    // stops the event from leaving the component\n    event.stopImmediatePropagation();\n\n    const time = this._value;\n    const period = this._elements.period;\n\n    // we check if a change event needs to be triggered since it was produced via user interaction\n    if (time && time.isValid()) {\n      if (this.displayFormat.indexOf('h') !== -1) {\n        if (period.value === 'am') {\n          time.subtract(12, 'h');\n        } else {\n          time.add(12, 'h');\n        }\n      }\n\n      this.value = time.format(this.valueFormat);\n      this.trigger('change');\n    }\n  }\n\n  _syncValueAsText() {\n    this._elements.valueAsText.textContent = this._getValueAsString(this._value, this.displayFormat);\n\n    if (!this.getAttribute('aria-labelledby')) {\n      this.labelledBy = this.labelledBy;\n    }\n  }\n\n  /**\n   Kills the internal _onInputChange from BaseFormField because it does not check the target.\n\n   @private\n   */\n  _onInputChange(event) {\n    // stops the event from leaving the component\n    event.stopImmediatePropagation();\n\n    let newTime = new DateTime.Moment();\n    const oldTime = this._value;\n\n    let hours = parseInt(this._elements.hours.value, 10);\n    const minutes = parseInt(this._elements.minutes.value, 10);\n\n    if (window.isNaN(hours) || window.isNaN(minutes)) {\n      newTime = '';\n    } else {\n      if (!this._elements.period.hidden &&\n        this.displayFormat.indexOf('h') !== -1 &&\n        this._elements.period.value === 'pm') {\n        hours += 12;\n      }\n\n      newTime.hours(hours);\n      newTime.minutes(minutes);\n    }\n\n    // we check if a change event needs to be triggered since it was produced via user interaction\n    if (newTime && newTime.isValid()) {\n      // @polyfill ie\n      this.invalid = false;\n\n      if (!newTime.isSame(oldTime, 'hour') || !newTime.isSame(oldTime, 'minute')) {\n        this.value = newTime.format(this.valueFormat);\n        this.trigger('change');\n      }\n    } else {\n      // @polyfill ie\n      this.invalid = true;\n      // does not sync the inputs so allow the user to continue typing the date\n      this._value = '';\n\n      if (newTime !== oldTime) {\n        this.trigger('change');\n      }\n    }\n  }\n\n  /**\n   Helper class that converts the internal moment value into a String using the provided date format. If the value is\n   invalid, empty string will be returned.\n\n   @param {?Moment} value\n   The value representing the date. It has to be a moment object or <code>null</code>\n   @param {String} format\n   The Date format to be used.\n\n   @returns {String} a String representing the value in the given format.\n\n   @ignore\n   */\n  _getValueAsString(value, format) {\n    return value && value.isValid() ? value.format(format) : '';\n  }\n\n  focus() {\n    // Sets focus to appropriate descendant\n    if (!this.contains(document.activeElement)) {\n      this._elements.hours.focus();\n    }\n  }\n\n  /**\n   Returns {@link Clock} variants.\n\n   @return {ClockVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      displayformat: 'displayFormat',\n      valueformat: 'valueFormat'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'displayformat',\n      'valueformat',\n      'variant'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'group');\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n    if (!this._valueFormat) {\n      this.valueFormat = DEFAULT_TIME_FORMAT;\n    }\n    if (!this._displayFormat) {\n      this.displayFormat = DEFAULT_TIME_FORMAT;\n    }\n\n    // clean up to be able to clone it\n    while (this.firstChild) {\n      this.removeChild(this.firstChild);\n    }\n\n    // Render template\n    this.appendChild(this._template);\n\n    this._syncDisplay();\n  }\n});\n\nexport default Clock;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 569,
    "kind": "variable",
    "name": "DEFAULT_HOUR_FORMAT",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~DEFAULT_HOUR_FORMAT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 570,
    "kind": "variable",
    "name": "DEFAULT_MINUTE_FORMAT",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~DEFAULT_MINUTE_FORMAT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 571,
    "kind": "variable",
    "name": "DEFAULT_TIME_FORMAT",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~DEFAULT_TIME_FORMAT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 572,
    "kind": "variable",
    "name": "AUTHORIZED_TOKENS",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~AUTHORIZED_TOKENS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 28,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 573,
    "kind": "variable",
    "name": "TIME_REG_EXP",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~TIME_REG_EXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 574,
    "kind": "variable",
    "name": "HOUR_REG_EXP",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~HOUR_REG_EXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 30,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 575,
    "kind": "variable",
    "name": "MIN_REG_EXP",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~MIN_REG_EXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 31,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 576,
    "kind": "typedef",
    "name": "ClockVariantEnum",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~ClockVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Clock} variants.",
    "lineNumber": 43,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default, gray Clock."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A Clock with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ClockVariantEnum"
    }
  },
  {
    "__docId__": 577,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 578,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 579,
    "kind": "variable",
    "name": "Clock",
    "memberof": "coral-spectrum/coral-component-clock/src/scripts/Clock.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-clock/src/scripts/Clock.js~Clock",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Clock}",
    "description": "A Clock component that can be used as a time selection form field. Leverages {@link momentJS} if loaded\non the page.",
    "lineNumber": 66,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Clock"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Clock component that can be used as a time selection form field. Leverages {@link momentJS} if loaded\non the page."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-clock"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-clock></coral-clock>",
      "<caption>JS constructor</caption>\nnew Coral.Clock();"
    ],
    "see": [
      "../examples/#clock"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 580,
    "kind": "file",
    "name": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport base from '../templates/base';\nimport {Overlay} from '../../../coral-component-overlay';\nimport '../../../coral-component-popover';\nimport PopperJS from 'popper.js';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link CoachMark} sizes.\n\n @typedef {Object} CoachMarkSizeEnum\n\n @property {String} SMALL\n A small sized coach mark.\n @property {String} MEDIUM\n A default sized coach mark.\n */\nconst size = {\n  SMALL: 'S',\n  MEDIUM: 'M'\n};\n\n/**\n Enumeration for {@link CoachMark} variants.\n\n @typedef {Object} CoachMarkVariantEnum\n\n @property {String} DEFAULT\n The default styled coach mark.\n @property {String} LIGHT\n A styled coach mark for dark backgrounds.\n @property {String} DARK\n A styled coach mark for light backgrounds.\n */\nconst variant = {\n  DEFAULT: 'default',\n  LIGHT: 'light',\n  DARK: 'dark',\n};\n\nconst CLASSNAME = '_coral-CoachMarkIndicator';\n\n/**\n @class Coral.CoachMark\n @classdesc A coach mark component to highlight UI elements on the page.\n @htmltag coral-coachmark\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CoachMark = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    this._template = base.call(this._elements);\n  }\n\n  /**\n   The element the coach mark should position relative to. It accepts values from {@link OverlayTargetEnum}, as\n   well as a DOM element or a CSS selector. If a CSS selector is provided, the first matching element will be used.\n\n   @type {?HTMLElement|String}\n   @default null\n   */\n  get target() {\n    return this._target || null;\n  }\n\n  set target(value) {\n    // We don't want to validate that the value must change here\n    // If a selector is provided, we'll take the first element matching that selector\n    // If the DOM is modified and the user wants a new target with the same selector,\n    // They should be able to set target = 'selector' again and get a different element\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      requestAnimationFrame(() => {\n        const targetElement = Overlay._getTarget(this);\n\n        if (targetElement) {\n          // Initialize popper only if we have a target\n          this._popper = this._popper || new PopperJS(targetElement, this);\n\n          // Update target only if valid\n          if (targetElement) {\n            this._popper.reference = targetElement;\n          }\n\n          this._popper.options.placement = 'top';\n\n          this._popper.modifiers.forEach((modifier) => {\n            if (modifier.name === 'offset') {\n              const lengthOffset = targetElement.clientHeight / 2 + this.clientHeight / 2;\n              modifier.offset = `0, -${lengthOffset}`;\n            } else if (modifier.name === 'preventOverflow') {\n              modifier.padding = 0;\n            }\n          });\n\n          this._popper.update();\n        }\n      });\n    }\n  }\n\n  /**\n   The coach mark size. See {@link CoachMarkSizeEnum}.\n\n   @type {String}\n   @default CoachMarkSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    this._reflectAttribute('size', this._size);\n\n    this.classList.toggle(`${CLASSNAME}--quiet`, this._size === size.SMALL);\n  }\n\n  /**\n   The coach mark variant. See {@link CoachMarkVariantEnum}.\n\n   @type {String}\n   @default CoachMarkVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.toggle(`${CLASSNAME}--light`, this._variant === variant.LIGHT);\n    this.classList.toggle(`${CLASSNAME}--dark`, this._variant === variant.DARK);\n  }\n\n  /**\n   Returns {@link CoachMark} sizes options.\n\n   @return {CoachMarkSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link CoachMark} variant options.\n\n   @return {CoachMarkVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'size',\n      'variant',\n      'target'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Support cloneNode\n    const template = this.getElementsByClassName('_coral-CoachMarkIndicator-ring');\n    while (template.length) {\n      template[0].remove();\n    }\n\n    // Render template\n    this.appendChild(this._template);\n  }\n});\n\nexport default CoachMark;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 581,
    "kind": "typedef",
    "name": "CoachMarkSizeEnum",
    "memberof": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js~CoachMarkSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link CoachMark} sizes.",
    "lineNumber": 31,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small sized coach mark."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A default sized coach mark."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CoachMarkSizeEnum"
    }
  },
  {
    "__docId__": 582,
    "kind": "typedef",
    "name": "CoachMarkVariantEnum",
    "memberof": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js~CoachMarkVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link CoachMark} variants.",
    "lineNumber": 48,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "The default styled coach mark."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LIGHT",
        "description": "A styled coach mark for dark backgrounds."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DARK",
        "description": "A styled coach mark for light backgrounds."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CoachMarkVariantEnum"
    }
  },
  {
    "__docId__": 583,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 54,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 584,
    "kind": "variable",
    "name": "CoachMark",
    "memberof": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-coachmark/src/scripts/CoachMark.js~CoachMark",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CoachMark}",
    "description": "A coach mark component to highlight UI elements on the page.",
    "lineNumber": 63,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CoachMark"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A coach mark component to highlight UI elements on the page."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-coachmark"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-coachmark></coral-coachmark>",
      "<caption>JS constructor</caption>\nnew Coral.CoachMark();"
    ],
    "see": [
      "../examples/#coachmark"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 585,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @base BaseColorInputAbstractSubview\n @classdesc An abstract subview class that other subviews should extend.\n */\nclass BaseColorInputAbstractSubview extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._events = {\n      'click ._coral-ColorInput-preview': '_onPreviewClicked'\n    };\n\n    // export a static variable used by all subviews\n    this.constructor._lastValidColor = null;\n  }\n\n  /** @ignore */\n  _onPreviewClicked() {\n    if (this._colorinput.valueAsColor !== null) {\n      this.constructor._lastValidColor = this._colorinput.valueAsColor;\n      this._colorinput._setActiveColor(null);\n    } else if (this.constructor._lastValidColor !== null) {\n      this._colorinput._setActiveColor(this.constructor._lastValidColor);\n    }\n  }\n\n  /** @ignore */\n  _beforeOverlayOpen() {\n    // overwrite callback in subclass if needed\n  }\n\n  /** @ignore */\n  _onColorInputChange() {\n    // overwrite callback in subclass if needed\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this.closest('._coral-ColorInput-overlay');\n\n    if (overlay && overlay._colorinput) {\n      // save references to bound callbacks (in order to be able to remove them again from event system)\n      this.__beforeOverlayOpen = this._beforeOverlayOpen.bind(this);\n      this.__onColorInputChange = this._onColorInputChange.bind(this);\n\n      // cache colorinput if this component is attached to dom\n      this._colorinput = overlay._colorinput;\n      this._colorinput.on('coral-overlay:beforeopen', this.__beforeOverlayOpen);\n      this._colorinput.on('coral-colorinput:_valuechange', this.__onColorInputChange);\n\n      // trigger one change initially\n      this._onColorInputChange();\n    }\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    if (this._colorinput) {\n      this._colorinput.off('coral-overlay:beforeopen', this.__beforeOverlayOpen);\n      this._colorinput.off('coral-colorinput:_valuechange', this.__onColorInputChange);\n    }\n\n    this._colorinput = null;\n  }\n};\n\nexport default BaseColorInputAbstractSubview;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 586,
    "kind": "class",
    "name": "BaseColorInputAbstractSubview",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "An abstract subview class that other subviews should extend.",
    "lineNumber": 17,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseColorInputAbstractSubview"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An abstract subview class that other subviews should extend."
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 587,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 19,
    "ignore": true
  },
  {
    "__docId__": 588,
    "kind": "member",
    "name": "_events",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#_events",
    "access": "private",
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"click ._coral-ColorInput-preview\": string}"
      ]
    }
  },
  {
    "__docId__": 589,
    "kind": "method",
    "name": "_onPreviewClicked",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#_onPreviewClicked",
    "access": "private",
    "description": null,
    "lineNumber": 31,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 590,
    "kind": "method",
    "name": "_beforeOverlayOpen",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#_beforeOverlayOpen",
    "access": "private",
    "description": null,
    "lineNumber": 41,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 591,
    "kind": "method",
    "name": "_onColorInputChange",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#_onColorInputChange",
    "access": "private",
    "description": null,
    "lineNumber": 46,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 592,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 51,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 593,
    "kind": "member",
    "name": "__beforeOverlayOpen",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#__beforeOverlayOpen",
    "access": "private",
    "description": null,
    "lineNumber": 58,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 594,
    "kind": "member",
    "name": "__onColorInputChange",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#__onColorInputChange",
    "access": "private",
    "description": null,
    "lineNumber": 59,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 595,
    "kind": "member",
    "name": "_colorinput",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#_colorinput",
    "access": "private",
    "description": null,
    "lineNumber": 62,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 596,
    "kind": "method",
    "name": "disconnectedCallback",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/BaseColorInputAbstractSubview.js~BaseColorInputAbstractSubview#disconnectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 72,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 598,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {transform} from '../../../coral-utils';\n\n// try to stay in same color space as long as possible (because of conversions being not 100% accurate ...)\n/** @ignore */\nconst colorSpace = {\n  RGB: 'rgb',\n  HEX: 'hex',\n  CMYK: 'cmyk',\n  HSB: 'hsb',\n  HSL: 'hsl'\n};\n\n/**\n Transforms part of a color (r,g,b) into a hex value.\n\n @static\n @param {Number} x\n value between 0-255\n\n @return {String} Hex representation\n @ignore\n */\nfunction _hex(x) {\n  return `0${x.toString(16)}`.slice(-2);\n}\n\n/** @ignore */\nfunction _slice(str, startStr) {\n  let sliced = [];\n\n  str = transform.string(str).toLowerCase();\n  startStr = transform.string(startStr).toLowerCase();\n\n  if (str.indexOf(startStr) !== -1) {\n    sliced = str.substring(str.indexOf(startStr) + startStr.length, str.lastIndexOf(')')).split(/,\\s*/);\n  }\n\n  return sliced;\n}\n\n/**\n Parse an rgb value into an object.\n e.g.: 'rgb(0,0,0)' => {r:0, g:0, b:0}\n\n @static\n @param {String} rgbStr\n The string representing the rgb value\n\n @return {Object} {r, g, b} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseRGB(rgbStr) {\n  const sliced = _slice(rgbStr, 'rgb(');\n\n  if (sliced.length !== 3) {\n    return null;\n  }\n\n  const r = parseInt(sliced[0], 10);\n  const g = parseInt(sliced[1], 10);\n  const b = parseInt(sliced[2], 10);\n\n  if (isNaN(r) || isNaN(g) || isNaN(b)) {\n    return null;\n  }\n\n  if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {\n    return null;\n  }\n\n  return {r, g, b};\n}\n\n/**\n Serialize an rgb object into a string.\n e.g.: {r:0, g:0, b:0} => 'rgb(0,0,0)'\n\n @static\n @param {Object} rgb\n @return {String} rgbStr The string representing the rgb value\n @ignore\n */\nfunction _serializeRGB(rgb) {\n  if (rgb) {\n    return `rgb(${rgb.r},${rgb.g},${rgb.b})`;\n  }\n\n  return '';\n}\n\n/**\n Parse an rgba value into an object.\n e.g.: 'rgba(0,0,0,0.5)' => {r:0, g:0, b:0, a:0.5}\n\n @static\n @param {String} rgbaStr\n The string representing the rgba value.\n\n @return {Object} {r, g, b, a} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseRGBA(rgbaStr) {\n  const sliced = _slice(rgbaStr, 'rgba(');\n\n  if (sliced.length !== 4) {\n    return null;\n  }\n\n  const r = parseInt(sliced[0], 10);\n  const g = parseInt(sliced[1], 10);\n  const b = parseInt(sliced[2], 10);\n  const a = parseFloat(sliced[3]);\n\n  if (isNaN(r) || isNaN(g) || isNaN(b) || isNaN(a)) {\n    return null;\n  }\n\n  if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || a < 0 || a > 1) {\n    return null;\n  }\n\n  return {r, g, b, a};\n}\n\n/**\n Serialize an rgba object into a string.\n e.g.: {r:0, g:0, b:0, a:0.5} => 'rgb(0,0,0,0.5)'\n\n @static\n @param {Object} rgba\n @return {String} rgbaStr The string representing the rgba value\n @ignore\n */\nfunction _serializeRGBA(rgba) {\n  if (rgba) {\n    return `rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`;\n  }\n  return '';\n}\n\n/**\n Parse an cmyk value into an object.\n e.g.: 'cmyk(0, 100, 50, 0)' => {c:0, m:100, y:50, k:0}\n\n @static\n @param {String} cmykStr\n The string representing the cmyk value.\n\n @return {Object} {c, m, y, k} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseCMYK(cmykStr) {\n  const sliced = _slice(cmykStr, 'cmyk(');\n\n  if (sliced.length !== 4) {\n    return null;\n  }\n\n  const c = parseFloat(sliced[0]);\n  const m = parseFloat(sliced[1]);\n  const y = parseFloat(sliced[2]);\n  const k = parseFloat(sliced[3]);\n\n  if (isNaN(c) || isNaN(m) || isNaN(y) || isNaN(k)) {\n    return null;\n  }\n\n  if (c < 0 || c > 100 || m < 0 || m > 100 || y < 0 || y > 100 || k < 0 || k > 100) {\n    return null;\n  }\n\n  return {c, m, y, k};\n}\n\n/**\n Serialize an cmyk object into a string.\n e.g.: {c:0, m:100, y:50, k:0} => 'cmyk(0, 100, 50, 0)'\n\n @static\n @param {Object} cmyk\n @return {String} cmykStr The string representing the cmyk value\n @ignore\n */\nfunction _serializeCMYK(cmyk) {\n  if (cmyk) {\n    // make sure there are not more than 2 digits after dot\n    const c = parseFloat(cmyk.c.toFixed(2));\n    const m = parseFloat(cmyk.m.toFixed(2));\n    const y = parseFloat(cmyk.y.toFixed(2));\n    const k = parseFloat(cmyk.k.toFixed(2));\n\n    return `cmyk(${c},${m},${y},${k})`;\n  }\n  return '';\n}\n\n/**\n Parse an hex value into a number. Corrects a hex value, if it is represented by 3 or 6 characters with or without\n '#'.\n\n @static\n @param {String} hexStr The string representing the hex value\n @return {Number} Returns a number representing the parsed hex value\n @ignore\n */\nfunction _parseHex(hexStr) {\n  hexStr = transform.string(hexStr).replace('#', '');\n\n  if (hexStr.length === 3) {\n    hexStr = hexStr.charAt(0) + hexStr.charAt(0) +\n      hexStr.charAt(1) + hexStr.charAt(1) +\n      hexStr.charAt(2) + hexStr.charAt(2);\n  }\n\n  // test if this could be a hex value\n  const isOk = (/^[0-9A-F]{6}$/i).test(hexStr);\n  if (!isOk) {\n    return null;\n  }\n\n  return parseInt(hexStr, 16);\n}\n\n/**\n Transforms a hex color into RGB representation.\n\n @static\n @param {Number} hex\n The color hex representation.\n\n @return {Object} {r, g, b}\n @ignore\n */\nfunction _hexToRgb(hex) {\n  // explicitly test null (0 is valid)\n  if (hex !== null) {\n    return {\n      r: hex >> 16,\n      // eslint-disable-next-line no-extra-parens\n      g: (hex & 0x00FF00) >> 8,\n      // eslint-disable-next-line no-extra-parens\n      b: (hex & 0x0000FF)\n    };\n  }\n  return null;\n}\n\n/**\n Serialize a hex number into a string.\n\n @static\n @param {Number} hex\n @return {String}\n @ignore\n */\nfunction _serializeHex(hex) {\n  // explicitly test null (0 is valid)\n  if (hex !== null) {\n    const rgb = _hexToRgb(hex);\n    return `#${_hex(rgb.r) + _hex(rgb.g) + _hex(rgb.b)}`;\n  }\n\n  return '';\n}\n\n/**\n Transforms a RGB color into HEX representation.\n\n @static\n @param {Object} rgb\n @return {Number} hex The color hex representation\n @ignore\n */\nfunction _rgbToHex(rgb) {\n  if (rgb) {\n    return _parseHex(_hex(rgb.r) + _hex(rgb.g) + _hex(rgb.b));\n  }\n  return null;\n}\n\n/**\n Transforms a cmyk color into RGB representation. Converting CMYK to RGB will incur slight loss because both color\n spaces are not absolute and there will be some round-off error in the conversion process.\n\n @static\n @param {Object} cmyk\n @return {Object} {r, g, b}\n @ignore\n */\nfunction _cmykToRgb(cmyk) {\n  if (!cmyk) {\n    return null;\n  }\n\n  const result = {\n    r: 0,\n    g: 0,\n    b: 0\n  };\n\n  const c = parseFloat(cmyk.c) / 100;\n  const m = parseFloat(cmyk.m) / 100;\n  const y = parseFloat(cmyk.y) / 100;\n  const k = parseFloat(cmyk.k) / 100;\n\n  result.r = 1 - Math.min(1, c * (1 - k) + k);\n  result.g = 1 - Math.min(1, m * (1 - k) + k);\n  result.b = 1 - Math.min(1, y * (1 - k) + k);\n\n  result.r = Math.round(result.r * 255);\n  result.g = Math.round(result.g * 255);\n  result.b = Math.round(result.b * 255);\n\n  return result;\n}\n\n/**\n Transforms a rgb color into cmyk representation. Converting CMYK to RGB will incur slight loss because both color\n spaces are not absolute and there will be some round-off error in the conversion process.\n\n @static\n @param {Object} rgb\n @return {Object} {c, m, y, k}\n @ignore\n */\nfunction _rgbToCmyk(rgb) {\n  if (!rgb) {\n    return null;\n  }\n\n  const result = {\n    c: 0,\n    m: 0,\n    y: 0,\n    k: 0\n  };\n\n  if (rgb.r === 0 && rgb.g === 0 && rgb.b === 0) {\n    result.k = 100;\n    return result;\n  }\n\n  const r = rgb.r / 255;\n  const g = rgb.g / 255;\n  const b = rgb.b / 255;\n\n  result.k = Math.min(1 - r, 1 - g, 1 - b);\n  result.c = (1 - r - result.k) / (1 - result.k);\n  result.m = (1 - g - result.k) / (1 - result.k);\n  result.y = (1 - b - result.k) / (1 - result.k);\n\n  result.c = Math.round(result.c * 100);\n  result.m = Math.round(result.m * 100);\n  result.y = Math.round(result.y * 100);\n  result.k = Math.round(result.k * 100);\n\n  return result;\n}\n\n/**\n Parse an hsb value into an object.\n e.g.: 'hsb(360,100,0)' => {h:360, s:100, b:0}\n\n @static\n @param {String} hsbStr\n The string representing the hsb value.\n\n @return {Object} {h, s, b} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseHSB(hsbStr) {\n  const sliced = _slice(hsbStr, 'hsb(');\n\n  if (sliced.length !== 3) {\n    return null;\n  }\n\n  // make sure there are not more than 2 digits after dot\n  const h = parseFloat(sliced[0]);\n  const s = parseFloat(sliced[1]);\n  const b = parseFloat(sliced[2]);\n\n  if (isNaN(h) || isNaN(s) || isNaN(b)) {\n    return null;\n  }\n\n  if (h < 0 || h > 360 || s < 0 || s > 100 || b < 0 || b > 100) {\n    return null;\n  }\n\n  return {h, s, b};\n}\n\n/**\n Serialize an hsb object into a string.\n e.g.: {h:0, s:0, b:0} => 'hsb(0,0,0)'\n\n @static\n @param {Object} hsb\n @return {String} hsb The string representing the hsb value\n @ignore\n */\nfunction _serializeHSB(hsb) {\n  if (hsb) {\n    // make sure there are not more than 2 digits after dot\n    const h = parseFloat(hsb.h.toFixed(2));\n    const s = parseFloat(hsb.s.toFixed(2));\n    const b = parseFloat(hsb.b.toFixed(2));\n\n    return `hsb(${h},${s},${b})`;\n  }\n\n  return '';\n}\n\n/**\n Transforms a HSB (same as HSV) color into RGB representation.\n h (hue has value between 0-360 degree)\n s (saturation has a value between 0-100 percent)\n b (brightness has a value between 0-100 percent)\n\n @static\n @param {Object} hsb\n @return {Object} {r, g, b}\n @ignore\n */\nfunction _hsbToRgb(hsb) {\n  if (!hsb) {\n    return null;\n  }\n\n  const h = hsb.h / 360;\n  const s = hsb.s / 100;\n  const v = hsb.b / 100;\n\n  let r, g, b;\n  const i = Math.floor(h * 6);\n  const f = h * 6 - i;\n  const p = v * (1 - s);\n  const q = v * (1 - f * s);\n  const t = v * (1 - (1 - f) * s);\n  switch (i % 6) {\n    case 0:\n      r = v;\n      g = t;\n      b = p;\n      break;\n    case 1:\n      r = q;\n      g = v;\n      b = p;\n      break;\n    case 2:\n      r = p;\n      g = v;\n      b = t;\n      break;\n    case 3:\n      r = p;\n      g = q;\n      b = v;\n      break;\n    case 4:\n      r = t;\n      g = p;\n      b = v;\n      break;\n    case 5:\n      r = v;\n      g = p;\n      b = q;\n      break;\n  }\n  return {\n    r: Math.round(r * 255),\n    g: Math.round(g * 255),\n    b: Math.round(b * 255)\n  };\n}\n\n/**\n Transforms a RGB color into HSB (same as HSV) representation.\n\n @static\n @param {Object} rgb\n @return {Object} {h, s, b}\n @ignore\n */\nfunction _rgbToHsb(rgb) {\n  if (!rgb) {\n    return null;\n  }\n\n  const r = rgb.r;\n  const g = rgb.g;\n  const b = rgb.b;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const d = max - min;\n  let h;\n  const s = max === 0 ? 0 : d / max;\n  const v = max / 255;\n\n  switch (max) {\n    case min:\n      h = 0;\n      break;\n    case r:\n      h = g - b + d * (g < b ? 6 : 0);\n      h /= 6 * d;\n      break;\n    case g:\n      h = b - r + d * 2;\n      h /= 6 * d;\n      break;\n    case b:\n      h = r - g + d * 4;\n      h /= 6 * d;\n      break;\n  }\n\n  return {\n    h: h * 360,\n    s: s * 100,\n    b: v * 100\n  };\n}\n\n/**\n Parse an hsl value into an object.\n e.g.: 'hsl(360,100,0)' => {h:360, s:100, b:0}\n\n @static\n @param {String} hslStr\n The string representing the hsl value.\n\n @return {Object} {h, s, l} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseHSL(hslStr) {\n  const sliced = _slice(hslStr, 'hsl(');\n\n  if (sliced.length !== 3) {\n    return null;\n  }\n\n  // make sure there are not more than 2 digits after dot\n  const h = parseFloat(sliced[0]);\n  const s = parseFloat(sliced[1]);\n  const l = parseFloat(sliced[2]);\n\n  if (isNaN(h) || isNaN(s) || isNaN(l)) {\n    return null;\n  }\n\n  if (h < 0 || h > 360 || s < 0 || s > 100 || l < 0 || l > 100) {\n    return null;\n  }\n\n  return {h, s, l};\n}\n\n/**\n Serialize an hsl object into a string.\n e.g.: {h:0, s:0, l:0} => 'hsl(0,0%,0%)'\n\n @static\n @param {Object} hsl\n @return {String} hsb The string representing the hsb value\n @ignore\n */\nfunction _serializeHSL(hsl) {\n  if (hsl) {\n    // make sure there are not more than 2 digits after dot\n    const h = parseFloat(hsl.h.toFixed(2));\n    const s = parseFloat(hsl.s.toFixed(2));\n    const l = parseFloat(hsl.l.toFixed(2));\n\n    return `hsl(${h},${s}%,${l}%)`;\n  }\n\n  return '';\n}\n\n/**\n Transforms a HSL color into RGB representation.\n h (hue has value between 0-360 degree)\n s (saturation has a value between 0-100 percent)\n l (lightness has a value between 0-100 percent)\n\n @static\n @param {Object} hsl\n @return {Object} {r, g, b}\n @ignore\n */\nfunction _hslToRgb(hsl) {\n  if (!hsl) {\n    return null;\n  }\n\n  const h = hsl.h / 360;\n  const s = hsl.s / 100;\n  const l = hsl.l / 100;\n\n  let r;\n  let g;\n  let b;\n\n  if (s === 0) {\n    // achromatic\n    r = g = b = l;\n  } else {\n    const hue2rgb = (p, q, t) => {\n      if (t < 0) {\n        t += 1;\n      }\n      if (t > 1) {\n        t -= 1;\n      }\n      if (t < 1 / 6) {\n        return p + (q - p) * 6 * t;\n      }\n      if (t < 1 / 2) {\n        return q;\n      }\n      if (t < 2 / 3) {\n        return p + (q - p) * (2 / 3 - t) * 6;\n      }\n      return p;\n    };\n\n    const qValue = l < 0.5 ? l * (1 + s) : l + s - l * s;\n    const pValue = 2 * l - qValue;\n    r = hue2rgb(pValue, qValue, h + 1 / 3);\n    g = hue2rgb(pValue, qValue, h);\n    b = hue2rgb(pValue, qValue, h - 1 / 3);\n  }\n\n  return {\n    r: Math.round(r * 255),\n    g: Math.round(g * 255),\n    b: Math.round(b * 255)\n  };\n}\n\n/**\n Transforms an RGB color into HSL representation.\n\n @static\n @param {Object} rgb\n @return {Object} {h, s, l}\n @ignore\n */\nfunction _rgbToHsl(rgb) {\n  if (!rgb) {\n    return null;\n  }\n\n  const r = rgb.r / 255;\n  const g = rgb.g / 255;\n  const b = rgb.b / 255;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  let h;\n  let s;\n  const l = (max + min) / 2;\n\n  if (max === min) {\n    // achromatic\n    h = s = 0;\n  } else {\n    const d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0);\n        break;\n      case g:\n        h = (b - r) / d + 2;\n        break;\n      case b:\n        h = (r - g) / d + 4;\n        break;\n    }\n    h /= 6;\n  }\n\n  return {\n    h: h * 360,\n    s: s * 100,\n    l: l * 100\n  };\n}\n\n/**\n Parse an hsla value into an object.\n e.g.: 'hsla(360,100%,0%,0.5)' => {h:360, s:100, l:0, 0.5}\n\n @static\n @param {String} hslaStr\n The string representing the hsl value.\n\n @return {Object} {h, s, l, a} Returns null if string could not be parsed\n @ignore\n */\nfunction _parseHSLA(hslaStr) {\n  const sliced = _slice(hslaStr, 'hsla(');\n\n  if (sliced.length !== 4) {\n    return null;\n  }\n\n  // make sure there are not more than 2 digits after dot\n  const h = parseFloat(sliced[0]);\n  const s = parseFloat(sliced[1]);\n  const l = parseFloat(sliced[2]);\n  const a = parseFloat(sliced[3]);\n\n  if (isNaN(h) || isNaN(s) || isNaN(l)) {\n    return null;\n  }\n\n  if (h < 0 || h > 360 || s < 0 || s > 100 || l < 0 || l > 100 || a < 0 || a > 1) {\n    return null;\n  }\n\n  return {h, s, l, a};\n}\n\n/**\n Serialize an hsla object into a string.\n e.g.: {h:0, s:0, l:0, a:0.5} => 'hsl(0,0%,0%,0.5)'\n\n @static\n @param {Object} hsla\n @return {String} hsb The string representing the hsb value\n @ignore\n */\nfunction _serializeHSLA(hsla) {\n  if (hsla) {\n    // make sure there are not more than 2 digits after dot\n    const h = parseFloat(hsla.h.toFixed(2));\n    const s = parseFloat(hsla.s.toFixed(2));\n    const l = parseFloat(hsla.l.toFixed(2));\n    const a = parseFloat(hsla.a.toFixed(2));\n\n    return `hsla(${h},${s}%,${l}%,${a})`;\n  }\n\n  return '';\n}\n\n/**\n Color is used to get a color in different color spaces, calculate tints and shades etc.\n */\nclass Color {\n  /** @ignore */\n  constructor() {\n    // Set defaults\n    this._colorSpace = colorSpace.HEX;\n    this._value = '';\n    this._alpha = 1;\n  }\n\n  /**\n   The value of the color. This value can be set in different formats (HEX, RGB, RGBA, HSB, HSL, HSLA and CMYK).\n   Corrects a hex value, if it is represented by 3 or 6 characters with or without '#'.\n\n   e.g:\n   HEX:  #FFFFFF\n   RGB:  rgb(16,16,16)\n   RGBA: rgba(215,40,40,0.9)\n   HSB:  hsb(360,100,100)\n   HSL:  hsl(360,100%,100%)\n   HSLA: hsla(360,100%,100%,0.9)\n   CMYK: cmyk(0,100,50,0)\n\n   @type {String}\n   @default \"\"\n   */\n  get value() {\n    return this._value;\n  }\n\n  set value(value) {\n    // Two color formats with alpha values\n    const rgba = _parseRGBA(value);\n    const hsla = _parseHSLA(value);\n\n    const rgb = _parseRGB(value);\n    const cmyk = _parseCMYK(value);\n    const hsb = _parseHSB(value);\n    const hsl = _parseHSL(value);\n    const hex = _parseHex(value);\n\n    if (rgba !== null) {\n      this._colorSpace = colorSpace.RGB;\n      this.alpha = rgba.a;\n      value = _serializeRGB({\n        r: rgba.r,\n        g: rgba.g,\n        b: rgba.b\n      });\n    } else if (hsla !== null) {\n      this._colorSpace = colorSpace.HSL;\n      this.alpha = hsla.a;\n      value = _serializeHSL({\n        h: hsla.h,\n        s: hsla.s,\n        l: hsla.l\n      });\n    } else if (rgb !== null) {\n      this._colorSpace = colorSpace.RGB;\n    } else if (cmyk !== null) {\n      this._colorSpace = colorSpace.CMYK;\n    } else if (hsb !== null) {\n      this._colorSpace = colorSpace.HSB;\n    } else if (hsl !== null) {\n      this._colorSpace = colorSpace.HSL;\n    } else if (hex !== null) {\n      this._colorSpace = colorSpace.HEX;\n    } else {\n      // restore defaults\n      this._colorSpace = colorSpace.HEX;\n      value = '';\n    }\n\n    this._value = value;\n  }\n\n  /**\n   The alpha value of the color (value between 0-1).\n\n   @type {Number}\n   @default 1\n   */\n  get alpha() {\n    return this._alpha;\n  }\n\n  set alpha(value) {\n    if (isNaN(value) || value < 0 || value > 1) {\n      return;\n    }\n    this._alpha = transform.number(value);\n  }\n\n  /**\n   The rgb values of the color (value between 0-255).\n   e.g.: {r:0, g:0, b:0}\n\n   @type {Object}\n   @default null\n   */\n  get rgb() {\n    let rgb = null;\n    if (this._colorSpace === colorSpace.RGB) {\n      rgb = _parseRGB(this.value);\n    } else if (this._colorSpace === colorSpace.HEX) {\n      const hex = _parseHex(this.value);\n      rgb = _hexToRgb(hex);\n    } else if (this._colorSpace === colorSpace.CMYK) {\n      const cmyk = _parseCMYK(this.value);\n      rgb = _cmykToRgb(cmyk);\n    } else if (this._colorSpace === colorSpace.HSB) {\n      const hsb = _parseHSB(this.value);\n      rgb = _hsbToRgb(hsb);\n    } else if (this._colorSpace === colorSpace.HSL) {\n      const hsl = _parseHSL(this.value);\n      rgb = _hslToRgb(hsl);\n    }\n    return rgb;\n  }\n\n  set rgb(value) {\n    this.value = _serializeRGB(value);\n  }\n\n  /**\n   The serialized rgb values of the color (r,g,b values between 0-255).\n   e.g: 'rgb(0,0,0)'\n\n   @type {String}\n   @default \"\"\n   */\n  get rgbValue() {\n    return _serializeRGB(this.rgb);\n  }\n\n  set rgbValue(value) {\n    this.value = value;\n  }\n\n  /**\n   The rgba values of the color (r,g,b values between 0-255 and a between 0-1).\n   e.g: {r:0, g:0, b:0, a:1}\n\n   @type {Object}\n   @default null\n   */\n  get rgba() {\n    const rgb = this.rgb;\n    if (rgb) {\n      return {\n        r: rgb.r,\n        g: rgb.g,\n        b: rgb.b,\n        a: this.alpha\n      };\n    }\n\n    return null;\n  }\n\n  set rgba(value) {\n    this.value = _serializeRGBA(value);\n  }\n\n  /**\n   The serialized rgba values of the color (r,g,b values between 0-255 and alpha between 0-1).\n   e.g: 'rgba(0,0,0,1)'\n\n   @type {String}\n   @default \"\"\n   */\n  get rgbaValue() {\n    return _serializeRGBA(this.rgba);\n  }\n\n  set rgbaValue(value) {\n    this.value = value;\n  }\n\n  /**\n   The hex value of the color.\n\n   @type {Number}\n   @default null\n   */\n  get hex() {\n    // as hex color space is essentially just the same as rgb and there is no loss in conversion, we can do it this way\n    return _rgbToHex(this.rgb);\n  }\n\n  set hex(value) {\n    this.value = _serializeHex(value);\n  }\n\n  /**\n   The serialized hex value of the color.\n   e.g: '#94CD4B'\n\n   @type {String}\n   @default \"\"\n   */\n  get hexValue() {\n    return _serializeHex(this.hex);\n  }\n\n  set hexValue(value) {\n    this.value = value;\n  }\n\n  /**\n   The cmyk values of the color (all values between 0-100).\n   e.g: {c:0, m:100, y:0, k:100}\n\n   @type {Object}\n   @default null\n   */\n  get cmyk() {\n    let cmyk = null;\n    let rgb = null;\n    if (this._colorSpace === colorSpace.RGB) {\n      rgb = _parseRGB(this.value);\n      cmyk = _rgbToCmyk(rgb);\n    } else if (this._colorSpace === colorSpace.HEX) {\n      const hex = _parseHex(this.value);\n      rgb = _hexToRgb(hex);\n      cmyk = _rgbToCmyk(rgb);\n    } else if (this._colorSpace === colorSpace.CMYK) {\n      cmyk = _parseCMYK(this.value);\n    } else if (this._colorSpace === colorSpace.HSB) {\n      const hsb = _parseHSB(this.value);\n      rgb = _hsbToRgb(hsb);\n      cmyk = _rgbToCmyk(rgb);\n    } else if (this._colorSpace === colorSpace.HSL) {\n      const hsl = _parseHSL(this.value);\n      rgb = _hslToRgb(hsl);\n      cmyk = _rgbToCmyk(rgb);\n    }\n    return cmyk;\n  }\n\n  set cmyk(value) {\n    this.value = _serializeCMYK(value);\n  }\n\n  /**\n   The serialized cmyk values of the color (all values between 0-100).\n   e.g: 'cmyk(100,100,100,100)'\n\n   @type {String}\n   @default \"\"\n   */\n  get cmykValue() {\n    return _serializeCMYK(this.cmyk);\n  }\n\n  set cmykValue(value) {\n    this.value = value;\n  }\n\n  /**\n   The hsb values of the color.\n   h (hue has value between 0-360 degree)\n   s (saturation has a value between 0-100 percent)\n   b (brightness has a value between 0-100 percent)\n\n   @type {Object}\n   @default null\n   */\n  get hsb() {\n    let hsb = null;\n    let rgb = null;\n    if (this._colorSpace === colorSpace.RGB) {\n      rgb = _parseRGB(this.value);\n      hsb = _rgbToHsb(rgb);\n    } else if (this._colorSpace === colorSpace.HEX) {\n      const hex = _parseHex(this.value);\n      rgb = _hexToRgb(hex);\n      hsb = _rgbToHsb(rgb);\n    } else if (this._colorSpace === colorSpace.CMYK) {\n      const cmyk = _parseCMYK(this.value);\n      rgb = _cmykToRgb(cmyk);\n      hsb = _rgbToHsb(rgb);\n    } else if (this._colorSpace === colorSpace.HSB) {\n      hsb = _parseHSB(this.value);\n    } else if (this._colorSpace === colorSpace.HSL) {\n      const hsl = _parseHSL(this.value);\n      rgb = _hslToRgb(hsl);\n      hsb = _rgbToHsb(rgb);\n    }\n    return hsb;\n  }\n\n  set hsb(value) {\n    this.value = _serializeHSB(value);\n  }\n\n  /**\n   The serialized hsb values of the color (s and b values between 0-100, h between 0-360).\n   e.g: 'hsb(360,100,100)'\n\n   @type {String}\n   @default \"\"\n   */\n  get hsbValue() {\n    return _serializeHSB(this.hsb);\n  }\n\n  set hsbValue(value) {\n    this.value = value;\n  }\n\n  /*\n   The hsl values of the color.\n   h (hue has value between 0-360 degree)\n   s (saturation has a value between 0-100 percent)\n   l (lightness has a value between 0-100 percent)\n\n   @type {Object}\n   @default null\n   */\n  get hsl() {\n    let hsl = null;\n    let rgb = null;\n    if (this._colorSpace === colorSpace.RGB) {\n      rgb = _parseRGB(this.value);\n      hsl = _rgbToHsl(rgb);\n    } else if (this._colorSpace === colorSpace.HEX) {\n      const hex = _parseHex(this.value);\n      rgb = _hexToRgb(hex);\n      hsl = _rgbToHsl(rgb);\n    } else if (this._colorSpace === colorSpace.CMYK) {\n      const cmyk = _parseCMYK(this.value);\n      rgb = _cmykToRgb(cmyk);\n      hsl = _rgbToHsl(rgb);\n    } else if (this._colorSpace === colorSpace.HSB) {\n      const hsb = _parseHSB(this.value);\n      rgb = _hsbToRgb(hsb);\n      hsl = _rgbToHsl(rgb);\n    } else if (this._colorSpace === colorSpace.HSL) {\n      hsl = _parseHSL(this.value);\n    }\n    return hsl;\n  }\n\n  set hsl(value) {\n    this.value = _serializeHSL(value);\n  }\n\n  /**\n   The serialized hsl values of the color (s and l values between 0-100 in percent, h between 0-360).\n   e.g: 'hsl(360,100%,100%)'\n\n   @type {String}\n   @default \"\"\n   */\n  get hslValue() {\n    return _serializeHSL(this.hsl);\n  }\n\n  set hslValue(value) {\n    this.value = value;\n  }\n\n  /**\n   The hsla values of the color.\n   h (hue has value between 0-360 degree)\n   s (saturation has a value between 0-100 percent)\n   l (lightness has a value between 0-100 percent)\n   a (alpha has a value between 0-1)\n\n   @type {Object}\n   @default null\n   */\n  get hsla() {\n    const hsl = this.hsl;\n    if (hsl) {\n      return {\n        h: hsl.h,\n        s: hsl.s,\n        l: hsl.l,\n        a: this.alpha\n      };\n    }\n\n    return null;\n  }\n\n  set hsla(value) {\n    this.value = _serializeHSLA(value);\n  }\n\n  /**\n   The serialized hsla values of the color.\n   h (hue has value between 0-360 degree)\n   s (saturation has a value between 0-100 percent)\n   l (lightness has a value between 0-100 percent)\n   a (alpha has a value between 0-1)\n   e.g: 'hsla(360,50%,50%,0.9)'\n\n   @type {String}\n   @default \"\"\n   */\n  get hslaValue() {\n    return _serializeHSLA(this.hsla);\n  }\n\n  set hslaValue(value) {\n    this.value = value;\n  }\n\n  /**\n   Clone this color.\n\n   @type {Color}\n   */\n  clone() {\n    const clone = new this.constructor();\n    clone.value = this.value;\n    clone.alpha = this.alpha;\n    return clone;\n  }\n\n  /**\n   Test if this Color is similar to another color.\n\n   @type {Boolean}\n   @param {Color} compareColor\n   The color to compare this color too.\n\n   @param {Boolean} [allowSlightColorDifference=true]\n   While converting between color spaces slight loses might happen => we should normally consider colors equal,\n   even if they are minimally different.\n\n   */\n  isSimilarTo(compareColor, allowSlightColorDifference) {\n    if (this.rgb === null && (!compareColor || compareColor.rgb === null)) {\n      // Consider an rgb of null equal to a null object (or another value of null)\n      return true;\n    }\n\n    if (!compareColor || compareColor.rgb === null || this.rgb === null) {\n      return false;\n    }\n\n    let allowedRgbDifference = 1;\n    let allowedAlphaDifference = 0.01;\n\n    if (allowSlightColorDifference === false) {\n      allowedRgbDifference = 0;\n      allowedAlphaDifference = 0;\n    }\n\n    const rgb = this.rgb;\n    const rgb2 = compareColor.rgb;\n\n    const rDiff = Math.abs(rgb2.r - rgb.r);\n    const gDiff = Math.abs(rgb2.g - rgb.g);\n    const bDiff = Math.abs(rgb2.b - rgb.b);\n    const aDiff = Math.abs(this.alpha - compareColor.alpha);\n\n    if (rDiff <= allowedRgbDifference && gDiff <= allowedRgbDifference && bDiff <= allowedRgbDifference && aDiff <= allowedAlphaDifference) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   Calculates an array of lighter colors.\n\n   @type {Array<Coral.Color>}\n   @param {Number} amount\n   Amount of tint colors to generate.\n\n   */\n  calculateTintColors(amount) {\n    const tintColors = [];\n    let tintColor = null;\n\n    const rgb = this.rgb;\n    if (rgb) {\n      const r = rgb.r;\n      const g = rgb.g;\n      const b = rgb.b;\n\n      let tintFactor = 1;\n\n      for (let i = 1 ; i <= amount ; i++) {\n        tintFactor = i / (amount + 1);\n        tintColor = this.clone();\n        // alpha value kept from original\n        tintColor.rgb = {\n          r: r + (255 - r) * tintFactor,\n          g: g + (255 - g) * tintFactor,\n          b: b + (255 - b) * tintFactor\n        };\n\n        tintColors.push(tintColor);\n      }\n    }\n\n    return tintColors;\n  }\n\n  /**\n   Calculates an array of darker colors.\n\n   @type {Array<Coral.Color>}\n   @param {Number} amount\n   Amount of shade colors to generate.\n\n   */\n  calculateShadeColors(amount) {\n    const shadeColors = [];\n    let shadeColor = null;\n\n    const rgb = this.rgb;\n    if (rgb) {\n      const r = rgb.r;\n      const g = rgb.g;\n      const b = rgb.b;\n\n      let shadeFactor = 1;\n\n      for (let i = 1 ; i <= amount ; i++) {\n        shadeFactor = i / (amount + 1);\n        shadeColor = this.clone();\n        // alpha value kept from original\n        shadeColor.rgb = {\n          r: r * (1 - shadeFactor),\n          g: g * (1 - shadeFactor),\n          b: b * (1 - shadeFactor)\n        };\n\n        shadeColors.push(shadeColor);\n      }\n    }\n\n    return shadeColors;\n  }\n}\n\nexport default Color;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 599,
    "kind": "variable",
    "name": "colorSpace",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~colorSpace",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "ignore": true,
    "type": {
      "types": [
        "{\"RGB\": string, \"HEX\": string, \"CMYK\": string, \"HSB\": string, \"HSL\": string}"
      ]
    }
  },
  {
    "__docId__": 600,
    "kind": "function",
    "name": "_hex",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_hex",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms part of a color (r,g,b) into a hex value.",
    "lineNumber": 35,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "x",
        "description": "value between 0-255"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "Hex representation"
    }
  },
  {
    "__docId__": 601,
    "kind": "function",
    "name": "_slice",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_slice",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 40,
    "ignore": true,
    "params": [
      {
        "name": "str",
        "types": [
          "*"
        ]
      },
      {
        "name": "startStr",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 602,
    "kind": "function",
    "name": "_parseRGB",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseRGB",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an rgb value into an object.\ne.g.: 'rgb(0,0,0)' => {r:0, g:0, b:0}",
    "lineNumber": 64,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "rgbStr",
        "description": "The string representing the rgb value"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 603,
    "kind": "function",
    "name": "_serializeRGB",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeRGB",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an rgb object into a string.\ne.g.: {r:0, g:0, b:0} => 'rgb(0,0,0)'",
    "lineNumber": 95,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "rgbStr The string representing the rgb value"
    }
  },
  {
    "__docId__": 604,
    "kind": "function",
    "name": "_parseRGBA",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseRGBA",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an rgba value into an object.\ne.g.: 'rgba(0,0,0,0.5)' => {r:0, g:0, b:0, a:0.5}",
    "lineNumber": 114,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "rgbaStr",
        "description": "The string representing the rgba value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b, a} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 605,
    "kind": "function",
    "name": "_serializeRGBA",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeRGBA",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an rgba object into a string.\ne.g.: {r:0, g:0, b:0, a:0.5} => 'rgb(0,0,0,0.5)'",
    "lineNumber": 146,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgba",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "rgbaStr The string representing the rgba value"
    }
  },
  {
    "__docId__": 606,
    "kind": "function",
    "name": "_parseCMYK",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseCMYK",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an cmyk value into an object.\ne.g.: 'cmyk(0, 100, 50, 0)' => {c:0, m:100, y:50, k:0}",
    "lineNumber": 164,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "cmykStr",
        "description": "The string representing the cmyk value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{c, m, y, k} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 607,
    "kind": "function",
    "name": "_serializeCMYK",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeCMYK",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an cmyk object into a string.\ne.g.: {c:0, m:100, y:50, k:0} => 'cmyk(0, 100, 50, 0)'",
    "lineNumber": 196,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "cmyk",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "cmykStr The string representing the cmyk value"
    }
  },
  {
    "__docId__": 608,
    "kind": "function",
    "name": "_parseHex",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseHex",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an hex value into a number. Corrects a hex value, if it is represented by 3 or 6 characters with or without\n'#'.",
    "lineNumber": 218,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hexStr",
        "description": "The string representing the hex value"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": "Returns a number representing the parsed hex value"
    }
  },
  {
    "__docId__": 609,
    "kind": "function",
    "name": "_hexToRgb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_hexToRgb",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a hex color into RGB representation.",
    "lineNumber": 246,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "hex",
        "description": "The color hex representation."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b}"
    }
  },
  {
    "__docId__": 610,
    "kind": "function",
    "name": "_serializeHex",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeHex",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize a hex number into a string.",
    "lineNumber": 268,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "hex",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": ""
    }
  },
  {
    "__docId__": 611,
    "kind": "function",
    "name": "_rgbToHex",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_rgbToHex",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a RGB color into HEX representation.",
    "lineNumber": 286,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": "hex The color hex representation"
    }
  },
  {
    "__docId__": 612,
    "kind": "function",
    "name": "_cmykToRgb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_cmykToRgb",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a cmyk color into RGB representation. Converting CMYK to RGB will incur slight loss because both color\nspaces are not absolute and there will be some round-off error in the conversion process.",
    "lineNumber": 302,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "cmyk",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b}"
    }
  },
  {
    "__docId__": 613,
    "kind": "function",
    "name": "_rgbToCmyk",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_rgbToCmyk",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a rgb color into cmyk representation. Converting CMYK to RGB will incur slight loss because both color\nspaces are not absolute and there will be some round-off error in the conversion process.",
    "lineNumber": 338,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{c, m, y, k}"
    }
  },
  {
    "__docId__": 614,
    "kind": "function",
    "name": "_parseHSB",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseHSB",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an hsb value into an object.\ne.g.: 'hsb(360,100,0)' => {h:360, s:100, b:0}",
    "lineNumber": 383,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hsbStr",
        "description": "The string representing the hsb value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{h, s, b} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 615,
    "kind": "function",
    "name": "_serializeHSB",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeHSB",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an hsb object into a string.\ne.g.: {h:0, s:0, b:0} => 'hsb(0,0,0)'",
    "lineNumber": 415,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "hsb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "hsb The string representing the hsb value"
    }
  },
  {
    "__docId__": 616,
    "kind": "function",
    "name": "_hsbToRgb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_hsbToRgb",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a HSB (same as HSV) color into RGB representation.\nh (hue has value between 0-360 degree)\ns (saturation has a value between 0-100 percent)\nb (brightness has a value between 0-100 percent)",
    "lineNumber": 439,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "hsb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b}"
    }
  },
  {
    "__docId__": 617,
    "kind": "function",
    "name": "_rgbToHsb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_rgbToHsb",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a RGB color into HSB (same as HSV) representation.",
    "lineNumber": 501,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{h, s, b}"
    }
  },
  {
    "__docId__": 618,
    "kind": "function",
    "name": "_parseHSL",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseHSL",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an hsl value into an object.\ne.g.: 'hsl(360,100,0)' => {h:360, s:100, b:0}",
    "lineNumber": 553,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hslStr",
        "description": "The string representing the hsl value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{h, s, l} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 619,
    "kind": "function",
    "name": "_serializeHSL",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeHSL",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an hsl object into a string.\ne.g.: {h:0, s:0, l:0} => 'hsl(0,0%,0%)'",
    "lineNumber": 585,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "hsl",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "hsb The string representing the hsb value"
    }
  },
  {
    "__docId__": 620,
    "kind": "function",
    "name": "_hslToRgb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_hslToRgb",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms a HSL color into RGB representation.\nh (hue has value between 0-360 degree)\ns (saturation has a value between 0-100 percent)\nl (lightness has a value between 0-100 percent)",
    "lineNumber": 609,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "hsl",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{r, g, b}"
    }
  },
  {
    "__docId__": 621,
    "kind": "function",
    "name": "_rgbToHsl",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_rgbToHsl",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Transforms an RGB color into HSL representation.",
    "lineNumber": 667,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "rgb",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{h, s, l}"
    }
  },
  {
    "__docId__": 622,
    "kind": "function",
    "name": "_parseHSLA",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_parseHSLA",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Parse an hsla value into an object.\ne.g.: 'hsla(360,100%,0%,0.5)' => {h:360, s:100, l:0, 0.5}",
    "lineNumber": 720,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hslaStr",
        "description": "The string representing the hsl value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "{h, s, l, a} Returns null if string could not be parsed"
    }
  },
  {
    "__docId__": 623,
    "kind": "function",
    "name": "_serializeHSLA",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~_serializeHSLA",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Serialize an hsla object into a string.\ne.g.: {h:0, s:0, l:0, a:0.5} => 'hsl(0,0%,0%,0.5)'",
    "lineNumber": 753,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "hsla",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "hsb The string representing the hsb value"
    }
  },
  {
    "__docId__": 624,
    "kind": "class",
    "name": "Color",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Color}",
    "description": "Color is used to get a color in different color spaces, calculate tints and shades etc.",
    "lineNumber": 770,
    "interface": false
  },
  {
    "__docId__": 625,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 772,
    "ignore": true
  },
  {
    "__docId__": 626,
    "kind": "member",
    "name": "_colorSpace",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#_colorSpace",
    "access": "private",
    "description": null,
    "lineNumber": 774,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 627,
    "kind": "member",
    "name": "_value",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#_value",
    "access": "private",
    "description": null,
    "lineNumber": 775,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 628,
    "kind": "member",
    "name": "_alpha",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#_alpha",
    "access": "private",
    "description": null,
    "lineNumber": 776,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 629,
    "kind": "member",
    "name": "value",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#value",
    "access": "public",
    "description": "The value of the color. This value can be set in different formats (HEX, RGB, RGBA, HSB, HSL, HSLA and CMYK).\nCorrects a hex value, if it is represented by 3 or 6 characters with or without '#'.\n\ne.g:\nHEX:  #FFFFFF\nRGB:  rgb(16,16,16)\nRGBA: rgba(215,40,40,0.9)\nHSB:  hsb(360,100,100)\nHSL:  hsl(360,100%,100%)\nHSLA: hsla(360,100%,100%,0.9)\nCMYK: cmyk(0,100,50,0)\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 795,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 642,
    "kind": "member",
    "name": "alpha",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#alpha",
    "access": "public",
    "description": "The alpha value of the color (value between 0-1).\n<ul><li><code>1</code> by default.</li></ul>",
    "lineNumber": 851,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 645,
    "kind": "member",
    "name": "rgb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#rgb",
    "access": "public",
    "description": "The rgb values of the color (value between 0-255).\ne.g.: {r:0, g:0, b:0}\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 869,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 648,
    "kind": "member",
    "name": "rgbValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#rgbValue",
    "access": "public",
    "description": "The serialized rgb values of the color (r,g,b values between 0-255).\ne.g: 'rgb(0,0,0)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 900,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 651,
    "kind": "member",
    "name": "rgba",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#rgba",
    "access": "public",
    "description": "The rgba values of the color (r,g,b values between 0-255 and a between 0-1).\ne.g: {r:0, g:0, b:0, a:1}\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 915,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 654,
    "kind": "member",
    "name": "rgbaValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#rgbaValue",
    "access": "public",
    "description": "The serialized rgba values of the color (r,g,b values between 0-255 and alpha between 0-1).\ne.g: 'rgba(0,0,0,1)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 940,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 657,
    "kind": "member",
    "name": "hex",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hex",
    "access": "public",
    "description": "The hex value of the color.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 954,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 660,
    "kind": "member",
    "name": "hexValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hexValue",
    "access": "public",
    "description": "The serialized hex value of the color.\ne.g: '#94CD4B'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 970,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 663,
    "kind": "member",
    "name": "cmyk",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#cmyk",
    "access": "public",
    "description": "The cmyk values of the color (all values between 0-100).\ne.g: {c:0, m:100, y:0, k:100}\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 985,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 666,
    "kind": "member",
    "name": "cmykValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#cmykValue",
    "access": "public",
    "description": "The serialized cmyk values of the color (all values between 0-100).\ne.g: 'cmyk(100,100,100,100)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 1020,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 669,
    "kind": "member",
    "name": "hsb",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hsb",
    "access": "public",
    "description": "The hsb values of the color.\nh (hue has value between 0-360 degree)\ns (saturation has a value between 0-100 percent)\nb (brightness has a value between 0-100 percent)\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 1037,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 672,
    "kind": "member",
    "name": "hsbValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hsbValue",
    "access": "public",
    "description": "The serialized hsb values of the color (s and b values between 0-100, h between 0-360).\ne.g: 'hsb(360,100,100)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 1072,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 675,
    "kind": "member",
    "name": "hsl",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hsl",
    "access": "public",
    "description": "null",
    "lineNumber": 1089,
    "undocument": true,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 678,
    "kind": "member",
    "name": "hslValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hslValue",
    "access": "public",
    "description": "The serialized hsl values of the color (s and l values between 0-100 in percent, h between 0-360).\ne.g: 'hsl(360,100%,100%)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 1124,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 681,
    "kind": "member",
    "name": "hsla",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hsla",
    "access": "public",
    "description": "The hsla values of the color.\nh (hue has value between 0-360 degree)\ns (saturation has a value between 0-100 percent)\nl (lightness has a value between 0-100 percent)\na (alpha has a value between 0-1)\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 1142,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 684,
    "kind": "member",
    "name": "hslaValue",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#hslaValue",
    "access": "public",
    "description": "The serialized hsla values of the color.\nh (hue has value between 0-360 degree)\ns (saturation has a value between 0-100 percent)\nl (lightness has a value between 0-100 percent)\na (alpha has a value between 0-1)\ne.g: 'hsla(360,50%,50%,0.9)'\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 1171,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 687,
    "kind": "method",
    "name": "clone",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#clone",
    "access": "public",
    "description": "Clone this color.",
    "lineNumber": 1184,
    "type": {
      "nullable": null,
      "types": [
        "Color"
      ],
      "spread": false,
      "description": null
    },
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 688,
    "kind": "method",
    "name": "isSimilarTo",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#isSimilarTo",
    "access": "public",
    "description": "Test if this Color is similar to another color.",
    "lineNumber": 1203,
    "params": [
      {
        "nullable": null,
        "types": [
          "Color"
        ],
        "spread": false,
        "optional": false,
        "name": "compareColor",
        "description": "The color to compare this color too."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "true",
        "defaultRaw": true,
        "name": "allowSlightColorDifference",
        "description": "While converting between color spaces slight loses might happen => we should normally consider colors equal,\neven if they are minimally different."
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "return": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 689,
    "kind": "method",
    "name": "calculateTintColors",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#calculateTintColors",
    "access": "public",
    "description": "Calculates an array of lighter colors.",
    "lineNumber": 1244,
    "params": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "amount",
        "description": "Amount of tint colors to generate."
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Array<Coral.Color>"
      ],
      "spread": false,
      "description": null
    },
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 690,
    "kind": "method",
    "name": "calculateShadeColors",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/Color.js~Color#calculateShadeColors",
    "access": "public",
    "description": "Calculates an array of darker colors.",
    "lineNumber": 1281,
    "params": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "amount",
        "description": "Amount of shade colors to generate."
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Array<Coral.Color>"
      ],
      "spread": false,
      "description": null
    },
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 691,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport Color from './Color';\nimport ColorInputItem from './ColorInputItem';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {Icon} from '../../../coral-component-icon';\nimport '../../../coral-component-textfield';\nimport '../../../coral-component-button';\nimport '../../../coral-component-popover';\nimport './ColorInputColorProperties';\nimport './ColorInputSwatches';\nimport base from '../templates/base';\nimport {validate, transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ColorInput';\n\n/**\n Enumeration for {@link ColorInput} variants.\n\n @typedef {Object} ColorInputVariantEnum\n\n @property {String} DEFAULT\n Use ColorInput as a formfield (default).\n @property {String} SWATCH\n Use a simple swatch as ColorInput.\n */\nconst variant = {\n  DEFAULT: 'default',\n  SWATCH: 'swatch'\n};\n\n/**\n Enumeration for {@link ColorInput} auto generated colors options.\n\n @typedef {Object} ColorInputAutoGenerateColorsEnum\n\n @property {String} OFF\n Disable auto generation.\n @property {String} SHADES\n Automatically generate shades (darker colors) of all colors.\n @property {String} TINTS\n Automatically generate tints (lighter colors) of all colors.\n */\nconst autoGenerateColors = {\n  OFF: 'off',\n  SHADES: 'shades',\n  TINTS: 'tints'\n};\n\n/**\n Enumeration for {@link ColorInput} swatches display options.\n\n @typedef {Object} ColorInputShowSwatchesEnum\n\n @property {String} ON\n Display swatches view (default).\n @property {String} OFF\n Hide swatches view.\n */\nconst showSwatches = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link ColorInput} color properties display options.\n\n @typedef {Object} ColorInputShowPropertiesEnum\n\n @property {String} ON\n Display color properties view (default).\n @property {String} OFF\n Hide color properties view.\n */\nconst showProperties = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link ColorInput} default colors display options.\n\n @typedef {Object} ColorInputShowDefaultColorsEnum\n\n @property {String} ON\n Display default colors (default).\n @property {String} OFF\n Hide default colors.\n */\nconst showDefaultColors = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n @class Coral.ColorInput\n @classdesc A ColorInput component than can be used as a form field to select from a list of color options.\n @htmltag coral-colorinput\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst ColorInput = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {commons, i18n});\n\n    const overlay = this._elements.overlay;\n    const overlayId = overlay.id;\n\n    // Add a reference to this\n    overlay._colorinput = this;\n\n    // Extend form field events\n    const events = commons.extend(this._events, {\n      'key:down ._coral-ColorInput-input:not([readonly])': '_onKeyDown',\n      'key:down [handle=\"colorPreview\"]': '_onKeyDown',\n      'click [handle=\"colorPreview\"]': '_onColorPreviewClick',\n      'key:esc input': '_onKeyEsc',\n      'key:enter input': '_onKeyEsc',\n\n      // private\n      'coral-colorinput-item:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    // Overlay\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_beforeOverlayOpen';\n    events[`global:capture:coral-overlay:close #${overlayId}`] = '_onOverlayClose';\n    events[`global:key:esc #${overlayId}`] = '_onKeyEsc';\n\n    // Events\n    this._delegateEvents(events);\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-colorinput-item',\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item in the ColorInput.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /**\n   The ColorInput variant. See {@link ColorInputVariantEnum}.\n\n   @default ColorInputVariantEnum.DEFAULT\n   @type {String}\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    if (this._variant === variant.SWATCH) {\n      this.classList.add('_coral-ColorInput--swatch');\n      this._elements.input.setAttribute('tabindex', -1);\n      this._elements.colorPreview.removeAttribute('tabindex');\n    } else {\n      this.classList.remove('_coral-ColorInput--swatch');\n      this._elements.input.removeAttribute('tabindex');\n    }\n    \n    this._syncColorPreviewIcon();\n  }\n\n  /**\n   Convenient property to get/set the the current color. If the value is no valid color it will return\n   <code>null</code> (The getter will return a copy of the current selected color).\n\n   @type {Color}\n   */\n  get valueAsColor() {\n    if (!this._color) {\n      this._color = new Color();\n    }\n\n    // sync this._color with the hidden field if necessary\n    const newColor = new Color();\n    newColor.value = this.value;\n    if (!this._color.isSimilarTo(newColor, true)) {\n      this._color.value = newColor.value;\n      this._color.alpha = newColor.alpha;\n    }\n\n    if (this._color.rgb === null) {\n      return null;\n    }\n\n    return this._color.clone();\n  }\n\n  set valueAsColor(value) {\n    if (!this._color) {\n      this._color = new Color();\n    }\n\n    if (!value) {\n      // clear color values\n      this._color.value = '';\n      this.value = '';\n    } else {\n      // set color values\n      this._color = value;\n\n      if (value.alpha < 1) {\n        // if an alpha value is used store rgba in the hidden field (it is the only format that can store alpha)\n        this.value = value.rgbaValue;\n      } else {\n        this.value = value.value;\n      }\n    }\n  }\n\n  /**\n   Should shades (darker colors) or tints (lighter colors) automatically be generated.\n   See {@link ColorInputAutoGenerateColorsEnum}.\n\n   @default Coral.ColorInput.autoGenerateColors.OFF\n   @type {String}\n   @htmlattribute autogeneratecolors\n   */\n  get autoGenerateColors() {\n    return this._autoGenerateColors || autoGenerateColors.OFF;\n  }\n\n  set autoGenerateColors(value) {\n    value = transform.string(value).toLowerCase();\n    this._autoGenerateColors = validate.enumeration(autoGenerateColors)(value) && value || autoGenerateColors.OFF;\n\n    this._recalculateGeneratedColors();\n  }\n\n  /**\n   Whether swatches view should be displayed. See {@link ColorInputSwatches}.\n\n   @default ColorInputShowSwatchesEnum.ON\n   @type {ColorInputSwatches}\n   @htmlattribute showswatches\n   */\n  get showSwatches() {\n    return this._showSwatches || showSwatches.ON;\n  }\n\n  set showSwatches(value) {\n    value = transform.string(value).toLowerCase();\n    this._showSwatches = validate.enumeration(showSwatches)(value) && value || showSwatches.ON;\n\n    this._showOrHideView(this._elements.swatchesView, this._showSwatches === showSwatches.OFF);\n  }\n\n  /**\n   Whether properties view should be displayed. See {@link ColorInputColorProperties}.\n\n   @default ColorInputShowPropertiesEnum.ON\n   @type {String}\n   @htmlattribute showproperties\n   */\n  get showProperties() {\n    return this._showProperties || showProperties.ON;\n  }\n\n  set showProperties(value) {\n    value = transform.string(value).toLowerCase();\n    this._showProperties = validate.enumeration(showProperties)(value) && value || showProperties.ON;\n\n    this._showOrHideView(this._elements.propertiesView, this._showProperties === showProperties.OFF);\n  }\n\n  /**\n   Whether default colors should be displayed. Link {@link ColorInputShowDefaultColorsEnum}.\n\n   @default ColorInputShowDefaultColorsEnum.ON\n   @type {String}\n   @htmlattribute showdefaultcolors\n   */\n  get showDefaultColors() {\n    return this._showDefaultColors || showDefaultColors.ON;\n  }\n\n  set showDefaultColors(value) {\n    value = transform.string(value).toLowerCase();\n    this._showDefaultColors = validate.enumeration(showDefaultColors)(value) && value || showDefaultColors.ON;\n\n    const defaultPalette = this._elements.defaultPalette;\n    if (this._showDefaultColors === showDefaultColors.ON) {\n      if (!defaultPalette.parentNode) {\n        this.insertBefore(defaultPalette, this.firstChild || null);\n      }\n    } else if (defaultPalette.parentNode) {\n      defaultPalette.parentNode.removeChild(defaultPalette);\n    }\n  }\n\n  /**\n   Short hint that describes the expected value of the ColorInput. It is displayed when the ColorInput is empty\n   and the variant is {@link Coral.ColorInput.variant.DEFAULT}\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  get placeholder() {\n    return this._elements.input.placeholder;\n  }\n\n  set placeholder(value) {\n    this._reflectAttribute('placeholder', value);\n    this._elements.input.placeholder = value;\n  }\n\n  /**\n   The value of the color. This value can be set in 5 different formats (HEX, RGB, RGBA, HSB and CMYK). Corrects a\n   hex value, if it is represented by 3 or 6 characters with or without '#'\n\n   e.g:\n   HEX:  #FFFFFF\n   RGB:  rgb(16,16,16)\n   RGBA: rgba(215,40,40,0.9)\n   RGBA: hsb(360,100,100)\n   CMYK: cmyk(0,100,50,0)\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._value || '';\n  }\n\n  set value(value) {\n    const oldColor = new Color();\n    oldColor.value = this.value;\n\n    const newColor = new Color();\n    newColor.value = value;\n\n    if (!newColor.isSimilarTo(oldColor, false)) {\n      this._value = value;\n\n      // make sure right ColorInput.Item is selected even if input field was set by hand\n      this._selectColorInputColor(newColor);\n\n      // trigger a change event\n      this.trigger('coral-colorinput:_valuechange');\n    }\n\n    // always set the input to the current value\n    this._elements.input.value = this.value;\n\n    this._updateColorPreview();\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.input.disabled = this.disabled;\n    this._elements.colorPreview.disabled = this._disabled || this.readOnly;\n\n    this._syncColorPreviewIcon();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this._elements.input.invalid = this.invalid;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.input.readOnly = this._readOnly;\n    this._elements.colorPreview.disabled = this.disabled || this._readOnly;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    // Sync input aria-labelledby\n    this._elements.input[value ? 'setAttribute' : 'removeAttribute']('aria-labelledby', value);\n\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    if (this.labelledBy) {\n      this.setAttribute('aria-labelledby', this.labelledBy);\n      this._elements.colorPreview.setAttribute('aria-labelledby',\n        [this.labelledBy,\n          this._elements.colorPreview.label.id].join(' '));\n    } else {\n      this.removeAttribute('aria-labelledby');\n      this._elements.colorPreview.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    this._validateSelection(item);\n\n    if (this._elements.overlay.open) {\n      // simply close the overlay whenever a color is added\n      this._elements.overlay.open = false;\n    }\n  }\n\n  /** @private */\n  _onItemRemoved() {\n    if (this._elements.overlay.open) {\n      // simply close the overlay whenever a color is removed\n      this._elements.overlay.open = false;\n    }\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n\n    // Last selected item wins\n    item = item || selectedItems[selectedItems.length - 1];\n\n    if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      // update hidden fields\n      if (selectedItem) {\n        this.value = selectedItem.getAttribute('value');\n      }\n\n      this.trigger('coral-colorinput:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @ignore */\n  _onColorPreviewClick(event) {\n    // restore focus to appropriate element when overlay closes\n    this._elements.overlay.returnFocusTo(this.variant === variant.SWATCH ? event.matchedTarget : this._elements.input);\n  }\n\n  _onInputChange(event) {\n    if (event.target === this._elements.input) {\n      // only handle changes to the hidden input field ...\n\n      // stops the current event\n      event.stopPropagation();\n\n      const color = new Color();\n      color.value = event.target[this._eventTargetProperty];\n\n      this._setActiveColor(color);\n    }\n  }\n\n  /** @ignore */\n  _onKeyDown(event) {\n    event.stopPropagation();\n\n    // restore focus to appropriate element when overlay closes\n    this._elements.overlay.returnFocusTo(this.variant === variant.SWATCH ? event.matchedTarget : this._elements.input);\n\n    this._elements.overlay.open = true;\n  }\n\n  /** @ignore */\n  _onKeyEsc(event) {\n    if (!this._elements.overlay.open) {\n      return;\n    }\n\n    event.stopPropagation();\n\n    this._elements.overlay.open = false;\n  }\n\n  /** @ignore */\n  _beforeOverlayOpen() {\n    // Make sure appropriate tabbable descendant will receive focus\n    if (this.showProperties === showProperties.ON) {\n      this._elements.overlay.focusOnShow = this._elements.propertiesView._elements.colorPreview2;\n    } else if (this.showSwatches === showSwatches.ON) {\n      this._elements.overlay.focusOnShow =\n        this._elements.overlay.querySelector('coral-colorinput-swatch[selected] > button') ||\n        'coral-colorinput-swatch > button';\n    }\n\n    // set aria-expanded state\n    this._elements.input.setAttribute('aria-expanded', true);\n    this._elements.colorPreview.setAttribute('aria-expanded', true);\n  }\n\n  /** @ignore */\n  _onOverlayClose() {\n    // set aria-expanded state\n    this._elements.input.setAttribute('aria-expanded', true);\n    this._elements.colorPreview.setAttribute('aria-expanded', false);\n  }\n\n  /**\n   Checks if the current input is valid or not. This check will only be performed on user interaction.\n\n   @ignore\n   */\n  _validateInputValue() {\n    this.invalid = this.value !== '' && this.valueAsColor === null;\n  }\n\n  /** @ignore */\n  _showOrHideView(view, hide) {\n    view.hidden = hide;\n    // Remove both classes and add only the required one\n    this._elements.overlay.classList.remove('_coral-ColorInput-onlySwatchesView', '_coral-ColorInput-onlyPropertiesView');\n\n    if (!this._elements.propertiesView.hidden && this._elements.swatchesView.hidden) {\n      this._elements.overlay.classList.add('_coral-ColorInput-onlyPropertiesView');\n    } else if (this._elements.propertiesView.hidden && !this._elements.swatchesView.hidden) {\n      this._elements.overlay.classList.add('_coral-ColorInput-onlySwatchesView');\n    }\n\n    // Update accessibility label for colorPreview button when only swatches are shown\n    if (this.showProperties === showProperties.OFF &&\n      this.showSwatches === showSwatches.ON) {\n      this._elements.colorPreview.label.textContent = i18n.get('Swatches');\n      if (this.previousElementSibling) {\n        this.previousElementSibling.setAttribute('aria-label', i18n.get('Confirm hex value'));\n      }\n      this._elements.overlay.setAttribute('aria-label', i18n.get('Swatches'));\n    } else {\n      this._elements.colorPreview.label.textContent = i18n.get('Color Picker');\n      this._elements.overlay.setAttribute('aria-label', i18n.get('Color Picker'));\n    }\n  }\n\n  /** @ignore */\n  _recalculateGeneratedColors() {\n    // remove old generated tint colors\n    const childrenList = this.querySelectorAll('coral-colorinput-item[coral-colorinput-generatedcolor]');\n    const childrenListLength = childrenList.length;\n    for (let i = 0 ; i < childrenListLength ; i++) {\n      childrenList[i].remove();\n    }\n\n    if (this.autoGenerateColors !== autoGenerateColors.OFF) {\n      const colorElements = this.items.getAll();\n\n      let colorEl = null;\n      let color = null;\n      let colorIndex = 0;\n      let generatedIndex = 0;\n\n      let generatedColorEl = null;\n      let generatedColors = [];\n\n      for (colorIndex = 0 ; colorIndex < colorElements.length ; colorIndex++) {\n        colorEl = colorElements[colorIndex];\n        color = new Color();\n        color.value = colorEl.value;\n\n        generatedColors = this.autoGenerateColors === autoGenerateColors.TINTS ? color.calculateTintColors(5) : color.calculateShadeColors(5);\n\n        for (generatedIndex = generatedColors.length - 1 ; generatedIndex >= 0 ; generatedIndex--) {\n          generatedColorEl = new ColorInputItem();\n          // be sure to add alpha\n          generatedColorEl.value = generatedColors[generatedIndex].rgbaValue;\n          generatedColorEl.setAttribute('coral-colorinput-generatedcolor', '');\n          colorEl.parentNode.insertBefore(generatedColorEl, colorEl.nextSibling);\n        }\n      }\n    }\n  }\n\n  /** @ignore */\n  _syncColorPreviewIcon() {\n    const colorPreview = this._elements.colorPreview;\n\n    colorPreview.icon = this.disabled && this.variant === variant.SWATCH ? 'lockClosed' : '';\n    colorPreview.iconSize = Icon.size.SMALL;\n  }\n\n  /** @ignore */\n  _setActiveColor(color) {\n    // method used by subviews to set a color and trigger a change event if needed\n    const oldColor = this.valueAsColor ? this.valueAsColor : new Color();\n    this.valueAsColor = color;\n\n    if (!oldColor.isSimilarTo(this.valueAsColor, false)) {\n      // test if current color is invalid\n      this._validateInputValue();\n\n      // trigger a change event (change events should only be triggered when an user interaction happened)\n      this.trigger('change');\n    }\n  }\n\n  /** @ignore */\n  _selectColorInputColor(newColor) {\n    let selectColorInItems = true;\n\n    if (this.selectedItem) {\n      const selectedColor = new Color();\n      selectedColor.value = this.selectedItem.value;\n\n      // only select color if it is not already selected\n      selectColorInItems = !selectedColor.isSimilarTo(newColor, true);\n    }\n\n    if (selectColorInItems) {\n      // select right color in this.items (if necessary and possible)\n      const selectedItem = this.selectedItem;\n      if (selectedItem) {\n        selectedItem.removeAttribute('selected');\n      }\n\n      const colorElements = this.items.getAll();\n      const colorElementsCount = colorElements.length;\n\n      let color = null;\n      for (let i = 0 ; i < colorElementsCount ; i++) {\n        color = new Color();\n        color.value = colorElements[i].getAttribute('value');\n\n        if (color.isSimilarTo(newColor, true)) {\n          colorElements[i].setAttribute('selected', '');\n          break;\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _setDefaultSelectedItem() {\n    const selectedItem = this.selectedItem;\n    const value = this.value;\n\n    // Sync selectedItem if value is set\n    if (value && !selectedItem) {\n      const color = new Color();\n      color.value = value;\n      this._selectColorInputColor(color);\n    }\n\n    // Also sync color preview\n    this._updateColorPreview();\n  }\n\n  _updateColorPreview() {\n    const isValueEmpty = this.value === '';\n\n    // update color preview\n    const currentColor = this.valueAsColor;\n    this._elements.colorPreview.style.backgroundColor = currentColor ? currentColor.rgbaValue : '';\n    this.classList.toggle('_coral-ColorInput--novalue', isValueEmpty);\n\n    // Update preview in overlay\n    const preview = this._elements.overlay.querySelector('._coral-ColorInput-preview');\n    if (preview) {\n      preview.classList.toggle('_coral-ColorInput-preview--novalue', isValueEmpty);\n    }\n    this._elements.input.setAttribute(\"aria-label\", this._items._container._color._value);\n  }\n\n  /**\n   Returns {@link ColorInput} variants.\n\n   @return {ColorInputVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link ColorInput} auto generated colors options.\n\n   @return {ColorInputAutoGenerateColorsEnum}\n   */\n  static get autoGenerateColors() {\n    return autoGenerateColors;\n  }\n\n  /**\n   Returns {@link ColorInput} swatches display options.\n\n   @return {ColorInputShowSwatchesEnum}\n   */\n  static get showSwatches() {\n    return showSwatches;\n  }\n\n  /**\n   Returns {@link ColorInput} color properties display options.\n\n   @return {ColorInputShowDefaultColorsEnum}\n   */\n  static get showDefaultColors() {\n    return showDefaultColors;\n  }\n\n  /**\n   Returns {@link ColorInput} default colors display options.\n\n   @return {ColorInputShowPropertiesEnum}\n   */\n  static get showProperties() {\n    return showProperties;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      autogeneratecolors: 'autoGenerateColors',\n      showswatches: 'showSwatches',\n      showproperties: 'showProperties',\n      showdefaultcolors: 'showDefaultColors'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'variant',\n      'autogeneratecolors',\n      'showswatches',\n      'showproperties',\n      'showdefaultcolors',\n      'placeholder'\n    ]);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.setAttribute('role', 'group');\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.defaultPalette);\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.buttonWrapper);\n    frag.appendChild(this._elements.overlay);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } else {\n        frag.appendChild(child);\n      }\n    }\n\n    // we use 'this' so properly aligns to the input\n    this._elements.overlay.target = this._elements.colorPreview;\n\n    this.appendChild(frag);\n\n    // Make sure colors are generated\n    this.autoGenerateColors = this.autoGenerateColors;\n    this.showDefaultColors = this.showDefaultColors;\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n\n    // Make sure we don't have multiple items selected\n    this._validateSelection();\n\n    // If value is set to default palette item value, we have to make sure it's selected\n    this._setDefaultSelectedItem();\n\n    // We can trigger events gain\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n});\n\nexport default ColorInput;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 692,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 28,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 693,
    "kind": "typedef",
    "name": "ColorInputVariantEnum",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInputVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link ColorInput} variants.",
    "lineNumber": 40,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Use ColorInput as a formfield (default)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SWATCH",
        "description": "Use a simple swatch as ColorInput."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColorInputVariantEnum"
    }
  },
  {
    "__docId__": 694,
    "kind": "typedef",
    "name": "ColorInputAutoGenerateColorsEnum",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInputAutoGenerateColorsEnum",
    "access": "public",
    "description": "Enumeration for {@link ColorInput} auto generated colors options.",
    "lineNumber": 57,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Disable auto generation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SHADES",
        "description": "Automatically generate shades (darker colors) of all colors."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TINTS",
        "description": "Automatically generate tints (lighter colors) of all colors."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColorInputAutoGenerateColorsEnum"
    }
  },
  {
    "__docId__": 695,
    "kind": "typedef",
    "name": "ColorInputShowSwatchesEnum",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInputShowSwatchesEnum",
    "access": "public",
    "description": "Enumeration for {@link ColorInput} swatches display options.",
    "lineNumber": 73,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Display swatches view (default)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Hide swatches view."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColorInputShowSwatchesEnum"
    }
  },
  {
    "__docId__": 696,
    "kind": "typedef",
    "name": "ColorInputShowPropertiesEnum",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInputShowPropertiesEnum",
    "access": "public",
    "description": "Enumeration for {@link ColorInput} color properties display options.",
    "lineNumber": 88,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Display color properties view (default)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Hide color properties view."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColorInputShowPropertiesEnum"
    }
  },
  {
    "__docId__": 697,
    "kind": "typedef",
    "name": "ColorInputShowDefaultColorsEnum",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInputShowDefaultColorsEnum",
    "access": "public",
    "description": "Enumeration for {@link ColorInput} default colors display options.",
    "lineNumber": 103,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Display default colors (default)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Hide default colors."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColorInputShowDefaultColorsEnum"
    }
  },
  {
    "__docId__": 698,
    "kind": "variable",
    "name": "ColorInput",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInput.js~ColorInput",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput component than can be used as a form field to select from a list of color options.",
    "lineNumber": 116,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput component than can be used as a form field to select from a list of color options."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput></coral-colorinput>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 699,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseColorInputAbstractSubview from './BaseColorInputAbstractSubview';\nimport Color from './Color';\nimport '../../../coral-component-button';\nimport '../../../coral-component-textfield';\nimport './ColorInputSlider';\nimport propertiesSubview from '../templates/colorProperties';\nimport {commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ColorInput-colorProperties';\n\n/**\n @class Coral.ColorInput.ColorProperties\n @classdesc A ColorInput Color properties component\n @htmltag coral-colorinput-colorproperties\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseColorInputAbstractSubview}\n */\nconst ColorInputColorProperties = Decorator(class extends BaseColorInputAbstractSubview(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      'change [handle=\"redSlider\"]': '_onRedSliderChange',\n      'change [handle=\"greenSlider\"]': '_onGreenSliderChange',\n      'change [handle=\"blueSlider\"]': '_onBlueSliderChange',\n      'change [handle=\"alphaSlider\"]': '_onAlphaSliderChange',\n      'change ._coral-ColorInput-editHex': '_onChangeHex',\n      'change ._coral-ColorInput-editRgba': '_onChangeRgba'\n    }));\n\n    // Templates\n    this._elements = {};\n    propertiesSubview.call(this._elements, {commons, i18n});\n  }\n\n  /** @ignore */\n  _onColorInputChange() {\n    const newColor = this._colorinput.valueAsColor;\n    const colorPreview = this._elements.colorPreview2;\n    let rgba;\n\n    if (!newColor) {\n      // update the colorPreview background color, state, and label\n      colorPreview.setAttribute('aria-pressed', 'true');\n      colorPreview.setAttribute('aria-label', i18n.get('Color not set'));\n\n      // reset Hex value to empty\n      this._elements.hexInput.value = '';\n    } else {\n      rgba = newColor.rgba;\n\n      // update the colorPreview background color, state, and label\n      colorPreview.style.backgroundColor = newColor.rgbValue;\n      colorPreview.setAttribute('aria-pressed', 'false');\n      colorPreview.setAttribute('aria-label', i18n.get('{value}, Color', {\n        value: parseFloat(rgba.a) === 1 ? newColor.value : newColor.rgbaValue\n      }));\n\n      // update the Hex input value\n      this._elements.hexInput.value = newColor.hexValue.substr(1);\n    }\n\n    const prefixes = ['red', 'green', 'blue', 'alpha'];\n    const prefixesLength = prefixes.length;\n    let prefix;\n    let abbr;\n    let isAlpha;\n    let val;\n\n    // update rgba slider and input values\n    for (let i = 0 ; i < prefixesLength ; i++) {\n      prefix = prefixes[i];\n      abbr = prefix.substr(0, 1);\n      isAlpha = i === prefixesLength - 1;\n\n      // default slider and input value\n      val = isAlpha ? 100 : 127;\n\n      // with new color, get appropriate RGBA value\n      if (newColor) {\n        if (!rgba) {\n          val = '';\n        } else if (isAlpha) {\n          val = parseInt(rgba[abbr] * 100, 10);\n        } else {\n          val = rgba[abbr];\n        }\n      }\n\n      // update the slider and input values\n      this._elements[`${prefix}Slider`].value = this._elements[`${prefix}Input`].value = val;\n    }\n\n    if (colorPreview === document.activeElement) {\n      // force blur and focus on colorButton so that new color or state is announced\n      colorPreview.blur();\n\n      // delay focus by 100ms so that screen reader has time to adjust to label with updated color value\n      window.setTimeout(() => {\n        colorPreview.focus();\n      }, 100);\n    }\n  }\n\n  /** @ignore */\n  _onRedSliderChange(event) {\n    this._elements.redInput.value = this._elements.redSlider.value;\n    this._onChangeRgba(event);\n  }\n\n  /** @ignore */\n  _onGreenSliderChange(event) {\n    this._elements.greenInput.value = this._elements.greenSlider.value;\n    this._onChangeRgba(event);\n  }\n\n  /** @ignore */\n  _onBlueSliderChange(event) {\n    this._elements.blueInput.value = this._elements.blueSlider.value;\n    this._onChangeRgba(event);\n  }\n\n  /** @ignore */\n  _onAlphaSliderChange(event) {\n    this._elements.alphaInput.value = this._elements.alphaSlider.value;\n    this._onChangeRgba(event);\n  }\n\n  /** @ignore */\n  _onChangeHex(event) {\n    event.stopPropagation();\n\n    // Value of hexInput field is without '#'.\n    const value = `#${this._elements.hexInput.value}`;\n    const color = new Color();\n    color.value = value;\n\n    if (color.hex === null) {\n      // no valid color value\n      this._elements.hexInput.value = '';\n      // Save last valid color\n      if (this._colorinput.valueAsColor !== null) {\n        this.constructor._lastValidColor = this._colorinput.valueAsColor;\n      }\n      this._colorinput._setActiveColor(null);\n    } else {\n      this._colorinput._setActiveColor(color);\n    }\n  }\n\n  /** @ignore */\n  _onChangeRgba(event) {\n    event.stopPropagation();\n\n    const r = parseInt(this._elements.redInput.value, 10);\n    const g = parseInt(this._elements.greenInput.value, 10);\n    const b = parseInt(this._elements.blueInput.value, 10);\n    const a = parseInt(this._elements.alphaInput.value, 10);\n\n    let colorValid = true;\n    if (isNaN(r) || r < 0 || r > 255) {\n      colorValid = false;\n      this._elements.redInput.value = '';\n    }\n\n    if (isNaN(g) || g < 0 || g > 255) {\n      colorValid = false;\n      this._elements.greenInput.value = '';\n    }\n\n    if (isNaN(b) || b < 0 || b > 255) {\n      colorValid = false;\n      this._elements.blueInput.value = '';\n    }\n\n    if (isNaN(a) || a < 0 || a > 100) {\n      colorValid = false;\n      this._elements.alphaInput.value = '';\n    }\n\n    if (colorValid) {\n      const color = new Color();\n      color.rgba = {\n        r: r,\n        g: g,\n        b: b,\n        a: a / 100\n      };\n      this._colorinput._setActiveColor(color);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Support cloneNode\n    const subview = this.querySelector('._coral-ColorInput-propertiesSubview');\n    if (subview) {\n      subview.remove();\n    }\n\n    this.appendChild(this._elements.propertiesSubview);\n  }\n});\n\nexport default ColorInputColorProperties;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 700,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 701,
    "kind": "variable",
    "name": "ColorInputColorProperties",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputColorProperties.js~ColorInputColorProperties",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput Color properties component",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput.ColorProperties"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput Color properties component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput-colorproperties"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseColorInputAbstractSubview}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput-colorproperties></coral-colorinput-colorproperties>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput.ColorProperties();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 702,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport Color from './Color';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.ColorInput.Item\n @classdesc A ColorInput Item component\n @htmltag coral-colorinput-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ColorInputItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The value of the color. This value can be set in different formats (HEX, RGB, RGBA, HSB, HSL, HSLA and CMYK).\n   Corrects a hex value, if it is represented by 3 or 6 characters with or without '#'.\n\n   e.g:\n   HEX:  #FFFFFF\n   RGB:  rgb(16,16,16)\n   RGBA: rgba(215,40,40,0.9)\n   HSB: hsb(360,100,100)\n   HSL: hsl(360,100,100)\n   HSLA: hsla(360,100%,100%, 0.9)\n   CMYK: cmyk(0,100,50,0)\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return this._value || '';\n  }\n\n  set value(value) {\n    // invalid values fallback to empty string\n    const color = new Color();\n    color.value = value;\n\n    // invalid values fallback to empty string\n    this._value = color.rgb !== null ? value : '';\n    this._reflectAttribute('value', this._value);\n  }\n\n  /**\n   Whether the Item is selected.\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n\n    this._selected = value;\n    this._reflectAttribute('selected', this._selected);\n\n    this.classList.toggle('is-selected', this._selected);\n    this.setAttribute('aria-selected', this._selected);\n\n    this.trigger('coral-colorinput-item:_selectedchanged');\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'value']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'option');\n  }\n});\n\nexport default ColorInputItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInputItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 703,
    "kind": "variable",
    "name": "ColorInputItem",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputItem.js~ColorInputItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput Item component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput Item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput-item></coral-colorinput-item>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput.Item();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 704,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ExtensibleSlider, Slider} from '../../../coral-component-slider';\nimport '../../../coral-component-tooltip';\nimport sliderBase from '../templates/sliderBase';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAMES = ['_coral-ColorInput-slider', '_coral-Slider--color'];\n\n/**\n @class Coral.ColorInput.Slider\n @classdesc A ColorInput Slider component\n @htmltag coral-colorinput-slider\n @extends {Slider}\n */\nconst ColorInputSlider = Decorator(class extends ExtensibleSlider {\n  /**\n   The gradient shown as slider background as space separated values (at least 2 values needed).\n   e.g: #ff0000 #ffff00 #00ff00 #00ffff #0000ff #ff00ff #ff0000\n\n   @type {String}\n   @default \"\"\n   @htmlattribute gradient\n   */\n  get gradient() {\n    return this._gradient || '';\n  }\n\n  set gradient(value) {\n    this._gradient = transform.string(value);\n\n    const bar = this._elements.bar;\n    const barStyle = bar.style;\n\n    const stops = this.gradient.split(' ');\n    const amountStops = stops.length;\n\n    // remove old gradients\n    barStyle.backgroundImage = 'none';\n    barStyle.filter = '';\n\n    if (amountStops < 2) {\n      return;\n    }\n\n    let partialGradientStr = '';\n    for (let i = 0 ; i < amountStops ; i++) {\n      partialGradientStr += `, ${stops[i]} ${Math.abs(i * 100 / (amountStops - 1))}%`;\n    }\n\n    barStyle.backgroundImage = `-moz-linear-gradient(to right${partialGradientStr})`;\n    barStyle.backgroundImage = `-ms-linear-gradient(to right${partialGradientStr})`;\n    barStyle.backgroundImage = `-o-linear-gradient(to right${partialGradientStr})`;\n    barStyle.backgroundImage = `-webkit-linear-gradient(to right${partialGradientStr})`;\n    barStyle.backgroundImage = `linear-gradient(to right${partialGradientStr})`;\n    barStyle.filter = `progid:DXImageTransform.Microsoft.gradient(startColorstr='${stops[0]}', endColorstr='${stops[1]}', gradientType=1)`;\n  }\n\n  _moveHandles() {\n    const calculatePercent = (value) => (value - this.min) / (this.max - this.min) * 100;\n    const labelValue = [];\n\n    // Set the handle position as a percentage based on the stored values\n    this._elements.handles.forEach((handle, index) => {\n      const percent = calculatePercent(this._values[index]);\n      handle.style.left = `${percent}%`;\n\n      labelValue.push(this._getLabel(this._values[index]));\n    });\n\n    this._elements.labelValue.textContent = labelValue.length > 1 ? labelValue.join(' - ') : labelValue[0];\n  }\n\n  /** @override */\n  _getTemplate() {\n    return sliderBase;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['gradient']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(...CLASSNAMES);\n  }\n});\n\nexport default ColorInputSlider;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 705,
    "kind": "variable",
    "name": "CLASSNAMES",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js~CLASSNAMES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 706,
    "kind": "variable",
    "name": "ColorInputSlider",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSlider.js~ColorInputSlider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput Slider component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput.Slider"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput Slider component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput-slider"
      },
      {
        "tagName": "@extends",
        "tagValue": "{Slider}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput-slider></coral-colorinput-slider>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput.Slider();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 707,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseColorInputAbstractSubview from './BaseColorInputAbstractSubview';\nimport Color from './Color';\nimport '../../../coral-component-button';\nimport colorButton from '../templates/colorButton';\nimport {commons, i18n, transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ColorInput-swatch';\n\n/**\n @class Coral.ColorInput.Swatch\n @classdesc A ColorInput Swatch component\n @htmltag coral-colorinput-swatch\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseColorInputAbstractSubview}\n */\nconst ColorInputSwatch = Decorator(class extends BaseColorInputAbstractSubview(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(this._events);\n\n    // Templates\n    this._elements = {};\n    colorButton.call(this._elements);\n  }\n\n  /**\n   Whether the Item is selected.\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n\n    if (!value || value && !this.disabled) {\n      this._selected = value;\n      this._reflectAttribute('selected', this.disabled ? false : this._selected);\n      this.removeAttribute('aria-selected', this._selected);\n\n      this.classList.toggle('is-selected', this._selected);\n      this._elements.colorButton.setAttribute('aria-selected', this._selected);\n\n      this._elements.colorButton.tabIndex = this.tabIndex;\n      this.removeAttribute('tabindex');\n\n      this._elements.colorButton[this._selected ? 'setAttribute' : 'removeAttribute']('aria-label',\n        `${i18n.get('checked')} ${this._elements.colorButton.label.textContent}`);\n\n      this.trigger('coral-colorinput-swatch:_selectedchanged');\n    }\n  }\n\n  /**\n   The Coral.ColorInput.Item that the swatch is a visual representation of. It accepts a DOM element or a CSS selector.\n   If a CSS selector is provided, the first matching element will be used.\n\n   @type {HTMLElement|String}\n   @default null\n   @htmlattribute targetcolor\n   */\n  get targetColor() {\n    return this._targetColor || null;\n  }\n\n  set targetColor(value) {\n    if (typeof value === 'string') {\n      value = this.querySelector(value);\n    }\n\n    // Store new value\n    this._targetColor = value;\n\n    let cssColorValue = '';\n    let hexColorValue = '';\n\n    if (this._targetColor) {\n      const color = new Color();\n      color.value = this._targetColor.value;\n      cssColorValue = color.rgbaValue;\n      hexColorValue = color.hexValue;\n    }\n\n    // Update background color and text label for color swatch\n    if (cssColorValue) {\n      this._elements.colorButton.style.backgroundColor = cssColorValue;\n      this._elements.colorButton.label.textContent = hexColorValue;\n      this.setAttribute('data-value', hexColorValue);\n    } else {\n      this._elements.colorButton.classList.add('_coral-ColorInput-swatch-novalue');\n      this._elements.colorButton.label.textContent = i18n.get('unset');\n      this.setAttribute('data-value', '');\n    }\n  }\n\n  /**\n   Whether the color preview is disabled or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._elements.colorButton.disabled;\n  }\n\n  set disabled(value) {\n    this._elements.colorButton.disabled = value;\n    this._reflectAttribute('disabled', this.disabled);\n  }\n\n  /**\n   The tabindex of the color preview button.\n   So that we don't wind up with nested focusable elements,\n   the internal colorButton should should receive the tabIndex property,\n   while the coral-colorinput-swatch should reflect the value using the _tabindex attribute.\n\n   @type {Integer}\n   @default -1\n   @htmlattribute tabindex\n   @htmlattributereflected\n   */\n  get tabIndex() {\n    return this._elements.colorButton.tabIndex;\n  }\n\n  set tabIndex(value) {\n    this._elements.colorButton.tabIndex = value;\n    this.removeAttribute('tabindex');\n  }\n\n  /** @ignore */\n  _onColorInputChange() {\n    if (this.targetColor) {\n      // sync selections\n      this.selected = this.targetColor.selected;\n    }\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      tabindex: 'tabIndex',\n      targetcolor: 'targetColor'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'selected',\n      'tabindex',\n      'disabled',\n      'targetcolor'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, 'u-coral-clearFix');\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'presentation');\n\n    // Support cloneNode\n    const button = this.querySelector('[handle=\"colorButton\"]');\n    if (button) {\n      button.remove();\n    }\n\n    this.appendChild(this._elements.colorButton);\n  }\n});\n\nexport default ColorInputSwatch;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 708,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 709,
    "kind": "variable",
    "name": "ColorInputSwatch",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatch.js~ColorInputSwatch",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput Swatch component",
    "lineNumber": 31,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput.Swatch"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput Swatch component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput-swatch"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseColorInputAbstractSubview}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput-swatch></coral-colorinput-swatch>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput.Swatch();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 710,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseColorInputAbstractSubview from './BaseColorInputAbstractSubview';\nimport ColorInputSwatch from './ColorInputSwatch';\nimport Color from './Color';\nimport {SelectableCollection} from '../../../coral-collection';\nimport swatchesHeader from '../templates/swatchesHeader';\nimport {commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ColorInput-swatches';\n\n/**\n @class Coral.ColorInput.Swatches\n @classdesc A ColorInput Swatches component\n @htmltag coral-colorinput-swatches\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseColorInputAbstractSubview}\n */\nconst ColorInputSwatches = Decorator(class extends BaseColorInputAbstractSubview(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      'click coral-colorinput-swatch': '_onSwatchClicked',\n      'keydown ._coral-ColorInput-swatch': '_onKeyDown',\n      'capture:focus coral-colorinput-swatch': '_onFocus',\n\n      // private\n      'coral-colorinput-swatch:_selectedchanged': '_onItemSelectedChanged'\n    }));\n\n    // Templates\n    this._elements = {};\n    swatchesHeader.call(this._elements, {commons, i18n});\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-colorinput-swatch',\n        onItemAdded: this._validateSelection\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n\n    // Last selected item wins\n    item = item || selectedItems[selectedItems.length - 1];\n\n    if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      // update hidden fields\n      if (selectedItem) {\n        this.value = selectedItem.value;\n      }\n\n      this.trigger('coral-colorinput-swatches:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @ignore */\n  _beforeOverlayOpen() {\n    // relayout swatches if items have been added/removed/moved...\n    const colorElements = this._colorinput.items.getAll();\n    let colorsElementsChanged = false;\n    if (!this._cachedColorElements) {\n      colorsElementsChanged = true;\n    } else if (this._cachedColorElements.length !== colorElements.length) {\n      colorsElementsChanged = true;\n    } else if (this._cachedColorElements.length === colorElements.length) {\n      for (let i = 0 ; i < colorElements.length ; i++) {\n        if (this._cachedColorElements[i] !== colorElements[i]) {\n          colorsElementsChanged = true;\n          break;\n        }\n      }\n    }\n\n    this._cachedColorElements = colorElements;\n\n    if (colorsElementsChanged) {\n      this._layoutColorSwatch();\n    }\n\n    this._ensureKeyboardAccess();\n  }\n\n  /** @ignore */\n  _onColorInputChange() {\n    this._ensureKeyboardAccess();\n  }\n\n  /**\n   If no swatch is selected, make sure that the first swatch is tabbable\n   @ignore\n   */\n  _ensureKeyboardAccess() {\n    if (!this.querySelector('coral-colorinput-swatch[selected]')) {\n      const firstSwatch = this.querySelector('coral-colorinput-swatch');\n      if (firstSwatch) {\n        firstSwatch.tabIndex = 0;\n      }\n    }\n  }\n\n  /** @ignore */\n  _layoutColorSwatch() {\n    // Clear container before adding elements to avoid multiple addition\n    this._elements.swatchesContainer.innerHtml = '';\n    const colors = this._colorinput.items.getAll();\n\n    const colorsLength = colors.length;\n    let swatchSelected = false;\n    for (let colorCount = 0 ; colorCount < colorsLength ; colorCount++) {\n      const color = colors[colorCount];\n\n      const swatch = new ColorInputSwatch();\n      this._elements.swatchesContainer.appendChild(swatch);\n      swatch.targetColor = color;\n\n      if (color.selected) {\n        swatch[color.selected ? 'setAttribute' : 'removeAttribute']('selected', color.selected);\n        swatchSelected = true;\n      }\n\n      // Update color button tabindex depending on selected state\n      swatch.tabIndex = swatch.selected ? 0 : -1;\n    }\n\n    // If no swatch is selected, make sure that the first swatch is focusable\n    if (!swatchSelected) {\n      this._ensureKeyboardAccess();\n    }\n  }\n\n  /** @ignore */\n  _onSwatchClicked(event) {\n    event.stopPropagation();\n\n    const colorButton = event.target;\n    const swatch = colorButton.closest('coral-colorinput-swatch');\n\n    if (!swatch.selected) {\n      const color = new Color();\n      color.value = swatch.targetColor ? swatch.targetColor.value : '';\n      this._colorinput._setActiveColor(color);\n      swatch.selected = true;\n    }\n    swatch.firstChild.focus();\n  }\n\n  /** @ignore */\n  _onKeyDown(event) {\n    const overlay = this._colorinput._elements.overlay;\n\n    // only if overlay is open\n    if (!overlay.open) {\n      return;\n    }\n\n    const allItems = this.items.getAll();\n\n    const currentIndex = allItems.indexOf(event.matchedTarget);\n    let preventDefault = true;\n    let newIndex = currentIndex;\n\n    switch (event.which) {\n      // return\n      case 13:\n        // Wait a frame before closing so that focus is restored correctly\n        window.requestAnimationFrame(() => {\n          overlay.open = false;\n        });\n        break;\n      // left arrow\n      case 37:\n        newIndex -= 1;\n        break;\n      // up arrow\n      case 38:\n        newIndex -= 4;\n        break;\n      // right arrow\n      case 39:\n        newIndex += 1;\n        break;\n      // down arrow\n      case 40:\n        newIndex += 4;\n        break;\n      default:\n        preventDefault = false;\n        break;\n    }\n\n    // If any action has been taken prevent event propagation\n    if (preventDefault) {\n      event.preventDefault();\n\n      if (newIndex < 0 || newIndex >= allItems.length) {\n        return;\n      }\n\n      // show right page in carousel and focus right swatch\n      const swatch = allItems[newIndex];\n      const color = new Color();\n\n      color.value = swatch.targetColor ? swatch.targetColor.value : '';\n      this._colorinput._setActiveColor(color);\n      swatch.selected = true;\n\n      swatch.firstChild.focus();\n    }\n  }\n\n  /**\n   Ensure that only one swatch can receive tab focus at a time\n   @ignore\n   */\n  _onFocus(event) {\n    const allItems = this.items.getAll();\n\n    for (let i = 0 ; i < allItems.length ; i++) {\n      const swatch = allItems[i];\n      if (!swatch.contains(event.matchedTarget)) {\n        swatch.tabIndex = -1;\n      }\n    }\n\n    event.matchedTarget.tabIndex = 0;\n    if (document.activeElement !== event.matchedTarget.firstChild) {\n      event.matchedTarget.firstChild.focus();\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'listbox');\n\n    // Support cloneNode\n    const swatchesSubview = this.querySelector('._coral-ColorInput-swatchesSubview');\n    if (swatchesSubview) {\n      swatchesSubview.remove();\n    }\n\n    // add header\n    this.appendChild(this._elements.swatchesSubview);\n\n    // add accessibility label\n    this.setAttribute('aria-labelledby', this._elements.swatchesHeaderTitle.id);\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n});\n\nexport default ColorInputSwatches;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 711,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 712,
    "kind": "variable",
    "name": "ColorInputSwatches",
    "memberof": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorinput/src/scripts/ColorInputSwatches.js~ColorInputSwatches",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorInput}",
    "description": "A ColorInput Swatches component",
    "lineNumber": 32,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorInput.Swatches"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorInput Swatches component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorinput-swatches"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseColorInputAbstractSubview}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorinput-swatches></coral-colorinput-swatches>",
      "<caption>JS constructor</caption>\nnew Coral.ColorInput.Swatches();"
    ],
    "see": [
      "../examples/#colorinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 713,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {BaseComponent} from '../../../coral-base-component';\nimport colorArea from '../templates/colorArea';\nimport {validate, transform, events, commons, i18n, Keys} from '../../../coral-utils';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport colorUtil from \"./ColorUtil\";\n\nconst CLASSNAME = '_coral-ColorPicker-ColorArea';\n\n/**\n @class Coral.ColorPicker.ColorArea\n @classdesc A ColorPicker area component to select Saturation and Value\n @htmltag coral-colorpicker-colorarea\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ColorArea extends BaseComponent(HTMLElement) {\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      'key:up': '_handleKey',\n      'key:right': '_handleKey',\n      'key:down': '_handleKey',\n      'key:left': '_handleKey',\n      'key:pageUp': '_handleKey',\n      'key:pageDown': '_handleKey',\n      'key:home': '_handleKey',\n      'key:end': '_handleKey',\n      \n      'input': '_onInputChangeHandler',\n      \n      'touchstart': '_onMouseDown',\n      'mousedown': '_onMouseDown',\n      'capture:focus': '_focus',\n      'capture:blur': '_blur'\n    }));\n    \n    // Templates\n    this._elements = {};\n    colorArea.call(this._elements, {commons, i18n});\n    // default values\n    this._x = 1;\n    this._y = 1;\n    this._hue = 120;\n    this._minX = 0;\n    this._minY = 0;\n    this._maxX = 1;\n    this._maxY = 1;\n    this._stepX = 0.01;\n    this._stepY = 0.01;\n  }\n\n  /** @ignore */  \n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.colorAreaGradient);\n    frag.appendChild(this._elements.colorHandle);\n    frag.appendChild(this._elements.sliderX);\n    frag.appendChild(this._elements.sliderY);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } \n      else {\n        frag.appendChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n\n    // These should be used to set a property since property handler aren't called until elements are attached to dom.\n    // Attribute values are delivered to change-listeners even if element isn't attached to dom yet, so attributes \n    // can be set to e.g. this._elements.colorHandle.\n    this._handle = this.querySelector('._coral-ColorPicker-ColorArea-colorHandle');\n    this._sliderX = this.querySelector('._coral-ColorPicker-ColorArea-slider[name=\"x\"]');\n    this._sliderY = this.querySelector('._coral-ColorPicker-ColorArea-slider[name=\"y\"]');\n    this._gradient = this.querySelector('._coral-ColorPicker-ColorArea-gradient');\n    this._updateHue(this._hue);\n    this.x = this._x;\n    this.y = this._y;\n    this._updateHandle(this._hue, this.x, this.y, this.color);\n    this._reflectAttribute('color', this.color);\n  }\n\n  /**   \n   The ColorArea label.\n   @default ''\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get label() {\n     return this._label;\n  }\n  \n  set label(value) {\n    this._label = value;\n    this._reflectAttribute('label', this._label);\n    if(this._elements.sliderX.getAttribute('aria-label') !== this._label) {\n      this._elements.sliderX.setAttribute('aria-label', this._label);\n      this._elements.sliderY.setAttribute('aria-label', this._label);\n    }\n  } \n\n  /**   \n   The ColorArea x value. value should be in multiple of x-step size.\n   @default 1\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get x() {\n    return this._x;\n  }\n  \n  set x(value) {\n    let rawX =  Number(value, 10);\n    if(parseFloat(rawX).toFixed(3) !== parseFloat(this._x).toFixed(3)) {\n      if(isNaN(rawX)) {\n         rawX = this._minX;\n       } \n      this._x = this._snapValueToStep(rawX, this._minX, this._maxX,  this._stepX);\n      this._reflectAttribute('x', this._x);\n      this.color = this._toHsvString(this._hue, this._x, this.y);\n    }\n    this._elements.sliderX.setAttribute('aria-valuetext', `${i18n.get('Saturation')}: ${Math.round(this._x / (this._maxX - this._minX) * 100)}%`);\n    this._elements.sliderX.setAttribute('title', this.color);\n    this._elements.sliderX.setAttribute('value', this._x);\n  }\n\n  /** @private */\n  _toHsvString(hue, x, y) {\n      const s = `${Math.round(this._x / (this._maxX - this._minX) * 100)}%`;\n      const v = `${Math.round(this._y / (this._maxY - this._minY) * 100)}%`;\n      return `hsv(${this._hue}, ${s}, ${v})`;\n  }\n\n  /**   \n   The ColorArea y value. value should be in multiple of y-step size.\n   @default 1\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get y() {\n    return this._y;\n  }\n  \n  set y(value) {\n    let rawY = Number(value, 10);\n    if(parseFloat(rawY).toFixed(3) !== parseFloat(this._y).toFixed(3)) {\n      if(isNaN(rawY)) {\n        rawY = this._minY;\n      }\n      this._y = this._snapValueToStep(rawY, this._minY, this._maxY,  this._stepY);\n      this._reflectAttribute('y', this._y);\n      this.color = this._toHsvString(this._hue, this.x, this._y);\n    }\n    this._elements.sliderY.setAttribute('aria-valuetext', `${i18n.get('Brightness')}: ${Math.round(this._y / (this._maxY - this._minY) * 100)}%`);\n    this._elements.sliderY.setAttribute('title', this.color);\n    this._elements.sliderY.setAttribute('value', this._y);\n  }\n  \n  /**\n   The ColorArea color string in hsla format.\n   @default hsla(0, 100%, 50%, 1)\n   @type {String}\n   @htmlattribute color\n   @htmlattributereflected\n   */   \n  get color() {\n    return colorUtil.toHslString(this._hue, new TinyColor({h:this._hue, s:this.x, v:this.y}).toHslString());\n  }\n  \n  set color(value) {\n    let color = new TinyColor(value);\n    if(!color.isValid) {\n      color = new TinyColor(\"hsla(120, 100%, 50%, 1)\");\n      value = color.toHslString();\n    }\n    \n    // if  color strings are equal or colors are equivalent  \n    if(this.color === value || new TinyColor(this.color).toString(color.format) === color) {\n       return;\n    }\n\n    const {h,s,v} = colorUtil.extractHsv(value);\n    if(h !== this._hue) {\n      this._updateHue(colorUtil.getHue(value)); \n    }\n    if(s !== this._x) {\n      this.x = s;\n    }\n    if(v !== this.Y) {\n      this.y = v;\n    }\n    this._updateHandle(this._hue, this.x, this.y, this.color);\n    this._reflectAttribute('color', this.color);\n  }\n        \n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'label',\n      'x',\n      'y',\n      'disabled',\n      'color'\n    ]);\n  }  \n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.sliderX[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.sliderY[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.colorHandle[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n  }\n  \n  focus() {\n    this._sliderX.focus();\n  }\n\n  /** @private **/\n  _updateHue(hue) {\n    this._hue = hue;\n    if(this._gradient){\n      this._gradient.style.background = `linear-gradient(to top, black 0%, hsla(${this._hue}, 100%, 0%, 0) 100%),\n        linear-gradient(to right, white 0%, hsla(${this._hue}, 100%, 0%, 0) 100%),\n        hsl(${this._hue}, 100%, 50%)`;\n    }  \n  }\n\n  /** @private */  \n  _snapValueToStep(rawValue, min, max, step) {\n    const remainder = (rawValue - min) % step;\n    let snappedValue = rawValue;\n    \n    if (Math.abs(remainder) * 2 >= step) {\n      snappedValue = rawValue - remainder + step;\n    } \n    else {\n      snappedValue = rawValue - remainder;\n    }\n    if (snappedValue < min) {\n      snappedValue = min;\n    } \n    else if (snappedValue > max) {\n      snappedValue = min + Math.floor((max - min) / step) * step;\n    }\n    return snappedValue;\n  }\n  \n  /** @private */\n  _updateHandle(hue, x, y, colorStr) {\n    let percent = 100 - ((y - this._minY) / (this._maxY - this._minY) * 100);\n    if(this._handle) {\n      this._handle.style.top = `${percent}%`;\n    }\n    \n    percent = (x - this._minX) / (this._maxX - this._minX) * 100;\n    if(this._handle) {\n      this._handle.style.left = `${percent}%`;\n    }   \n    this._elements.colorHandle.setAttribute('color', colorStr); \n  }\n    \n  /** @private */  \n  _focusHandle(isFocused) {\n    if(this._handle) {\n       if(isFocused === true) {\n        this._handle.focus();  \n      } \n      else {\n        this._handle.blur(); \n      }\n    }\n  }\n\n  /** @private */ \n  _changeValue(x, y) {\n     if(this.x !== x || this.y !== y) {\n       var currX = this.x;\n       var currY = this.y;\n       this.x = x;\n       this.y = y;\n       if(this.x !== currX || this.y !== currY) {\n         this.trigger('change');\n       }\n     }\n  }\n\n  _focusX() {\n    this._sliderX.focus();\n  }\n\n  _focusY() {\n    this._sliderY.focus();\n  }  \n/******* Events Handling **************/\n\n  /** @private */\n  _onInputChangeHandler(event) {\n    this._focusHandle(true);\n    event.stopPropagation();\n    if(event.target === this._sliderX) {\n      this._changeValue(event.target.value, this.y);\n    } \n    else {\n      this._changeValue(this.x, event.target.value);\n    }\n  }\n\n  /** @private */\n  _handleKey(event) {\n    this._focusHandle(true);\n    event.preventDefault();\n    event.stopPropagation();\n    let y = this.y;\n    let x = this.x;\n    // increase\n    if (event.keyCode === Keys.keyToCode('up') ||\n      event.keyCode === Keys.keyToCode('pageUp')) {\n      y += this._stepY;\n      this._focusY();\n    }\n    // decrease\n    else if (event.keyCode === Keys.keyToCode('down') ||\n      event.keyCode === Keys.keyToCode('pageDown')) {\n      y -= this._stepY;\n      this._focusY();\n    }\n\n    // increase\n    if (event.keyCode === Keys.keyToCode('right')) {\n      x += this._stepX;\n      this._focusX();\n    }\n    // decrease\n    else if (event.keyCode === Keys.keyToCode('left')) {\n      x -= this._stepX;\n      this._focusX();\n    }\n        \n    // min\n    else if (event.keyCode === Keys.keyToCode('home')) {\n      x = this._minX;\n      y = this._minY;\n      this._focusX();\n    }\n    // max\n    else if (event.keyCode === Keys.keyToCode('end')) {\n      x = this._maxX;\n      y = this._maxY;\n      this._focusX();\n    }\n    \n    this._changeValue(x, y);  \n  }\n   \n  /** @private */\n  _onMouseDown() {\n    if (event instanceof MouseEvent) {\n      if ((event.which || event.button) !== 1) {\n        return;\n      }\n    }\n    event.preventDefault();\n    \n    this._handle.classList.add('is-dragged');\n    document.body.classList.add('u-coral-closedHand');\n    this.focus();\n    this._focusHandle(true);\n    \n    const {x,y} = this._getValuesFromCoord(this._getPoint(event));\n    this._changeValue(x, y);\n         \n    const classNameSelector = \".\" + CLASSNAME;\n    this._draggingHandler = this._handleDragging.bind(this);\n    this._mouseUpHandler = this._mouseUp.bind(this);    \n    \n    events.on('mousemove.CoralArea', this._draggingHandler);\n    events.on('mouseup.CoralArea', this._mouseUpHandler);\n\n    events.on('touchmove.CoralArea', this._draggingHandler);\n    events.on('touchend.CoralArea', this._mouseUpHandler);\n    events.on('touchcancel.CoralArea', this._mouseUpHandler);  \n  }\n\n  /**  @private */\n  _getValuesFromCoord(point) {\n    const boundingClientRect = this.getBoundingClientRect();\n    const height = boundingClientRect.height;\n    const width = boundingClientRect.width;\n    let posY = point.clientY;\n    let posX = point.clientX;\n    \n    if(posY < boundingClientRect.top) {\n      posY = boundingClientRect.top;\n    }\n    else if(posY > boundingClientRect.bottom) {\n      posY = boundingClientRect.bottom;\n    }\n\n    if(posX < boundingClientRect.left) {\n      posX = boundingClientRect.left;\n    }\n    else if(posX > boundingClientRect.right) {\n      posX = boundingClientRect.right;\n    }\n        \n    let positionFraction = (height -(posY - boundingClientRect.top)) / height; \n    const rawY = this._minY + positionFraction * (this._maxY - this._minY);\n\n    positionFraction =  (posX - boundingClientRect.left) / width; \n    const rawX = this._minX + positionFraction * (this._maxX - this._minX);\n       \n    return {x: rawX, y: rawY};\n  }\n    \n  /** @private */\n  _handleDragging(event) {\n    const {x,y} = this._getValuesFromCoord(this._getPoint(event));\n    this._changeValue(x, y);\n    event.preventDefault();\n  }  \n\n  /** @private */\n  _mouseUp(event) {\n    this._handle.style.cursor = 'grab';\n    this._handle.classList.remove('is-dragged');\n    document.body.classList.remove('u-coral-closedHand');\n    this._focusHandle(false); \n    const classNameSelector = \".\" + CLASSNAME;\n    \n    events.off('mousemove.CoralArea', this._draggingHandler);\n    events.off('touchmove.CoralArea', this._draggingHandler);\n    events.off('mouseup.CoralArea', this._mouseUpHandler);\n    events.off('touchend.CoralArea', this._mouseUpHandler);\n    events.off('touchcancel.CoralArea', this._mouseUpHandler);\n\n    this._currentHandle = null;\n    this._draggingHandler = null;\n    this._mouseUpHandler = null;  \n  }\n  \n  /**\n   @private\n   @return {Object} which contains the real coordinates\n   */\n  _getPoint(event) {\n    if (event.changedTouches && event.changedTouches.length > 0) {\n      return event.changedTouches[0];\n    } \n    else if (event.touches && event.touches.length > 0) {\n      return event.touches[0];\n    }\n\n    return event;\n  }\n\n  /**\n   Handles \"focusin\" event.\n\n   @private\n   */\n  _focus(event) {\n    this._focusHandle(true);\n  }\n  \n  /**\n   Handles \"focusout\" event.\n\n   @private\n   */\n  _blur(event) {\n    this._focusHandle(false);\n  }  \n}\nexport default ColorArea;",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 714,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 715,
    "kind": "class",
    "name": "ColorArea",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorPicker}",
    "description": "A ColorPicker area component to select Saturation and Value",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorPicker.ColorArea"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorPicker area component to select Saturation and Value"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorpicker-colorarea"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-colorpicker-colorarea></coral-colorpicker-colorarea>",
      "<caption>JS constructor</caption>\nnew Coral.ColorPicker.ColorArea();"
    ],
    "see": [
      "../examples/#colorpicker"
    ]
  },
  {
    "__docId__": 716,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "undocument": true
  },
  {
    "__docId__": 717,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 50,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 718,
    "kind": "member",
    "name": "_x",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_x",
    "access": "private",
    "description": null,
    "lineNumber": 53,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 719,
    "kind": "member",
    "name": "_y",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_y",
    "access": "private",
    "description": null,
    "lineNumber": 54,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 720,
    "kind": "member",
    "name": "_hue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_hue",
    "access": "private",
    "description": null,
    "lineNumber": 55,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 721,
    "kind": "member",
    "name": "_minX",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_minX",
    "access": "private",
    "description": null,
    "lineNumber": 56,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 722,
    "kind": "member",
    "name": "_minY",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_minY",
    "access": "private",
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 723,
    "kind": "member",
    "name": "_maxX",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_maxX",
    "access": "private",
    "description": null,
    "lineNumber": 58,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 724,
    "kind": "member",
    "name": "_maxY",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_maxY",
    "access": "private",
    "description": null,
    "lineNumber": 59,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 725,
    "kind": "member",
    "name": "_stepX",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_stepX",
    "access": "private",
    "description": null,
    "lineNumber": 60,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 726,
    "kind": "member",
    "name": "_stepY",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_stepY",
    "access": "private",
    "description": null,
    "lineNumber": 61,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 727,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#render",
    "access": "public",
    "description": null,
    "lineNumber": 65,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 728,
    "kind": "member",
    "name": "_handle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_handle",
    "access": "private",
    "description": null,
    "lineNumber": 94,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 729,
    "kind": "member",
    "name": "_sliderX",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_sliderX",
    "access": "private",
    "description": null,
    "lineNumber": 95,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 730,
    "kind": "member",
    "name": "_sliderY",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_sliderY",
    "access": "private",
    "description": null,
    "lineNumber": 96,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 731,
    "kind": "member",
    "name": "_gradient",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_gradient",
    "access": "private",
    "description": null,
    "lineNumber": 97,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 734,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#label",
    "access": "public",
    "description": "  \nThe ColorArea label.\n<ul><li><code>''</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 112,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "''"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 736,
    "kind": "member",
    "name": "_label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_label",
    "access": "private",
    "description": null,
    "lineNumber": 117,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 737,
    "kind": "member",
    "name": "x",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#x",
    "access": "public",
    "description": "  \nThe ColorArea x value. value should be in multiple of x-step size.\n<ul><li><code>1</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 132,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 741,
    "kind": "method",
    "name": "_toHsvString",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_toHsvString",
    "access": "private",
    "description": null,
    "lineNumber": 152,
    "ignore": true,
    "params": [
      {
        "name": "hue",
        "types": [
          "*"
        ]
      },
      {
        "name": "x",
        "types": [
          "*"
        ]
      },
      {
        "name": "y",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 742,
    "kind": "member",
    "name": "y",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#y",
    "access": "public",
    "description": "  \nThe ColorArea y value. value should be in multiple of y-step size.\n<ul><li><code>1</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 165,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 746,
    "kind": "member",
    "name": "color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#color",
    "access": "public",
    "description": "The ColorArea color string in hsla format.\n<ul><li><code>hsla(0, 100%, 50%, 1)</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 191,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "hsla(0, 100%, 50%, 1)"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "color"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 750,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 222,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 751,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 239,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 753,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 244,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 754,
    "kind": "method",
    "name": "focus",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#focus",
    "access": "public",
    "description": null,
    "lineNumber": 254,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 755,
    "kind": "method",
    "name": "_updateHue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_updateHue",
    "access": "private",
    "description": null,
    "lineNumber": 259,
    "ignore": true,
    "params": [
      {
        "name": "hue",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 757,
    "kind": "method",
    "name": "_snapValueToStep",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_snapValueToStep",
    "access": "private",
    "description": null,
    "lineNumber": 269,
    "ignore": true,
    "params": [
      {
        "name": "rawValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "min",
        "types": [
          "*"
        ]
      },
      {
        "name": "max",
        "types": [
          "*"
        ]
      },
      {
        "name": "step",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 758,
    "kind": "method",
    "name": "_updateHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_updateHandle",
    "access": "private",
    "description": null,
    "lineNumber": 289,
    "ignore": true,
    "params": [
      {
        "name": "hue",
        "types": [
          "*"
        ]
      },
      {
        "name": "x",
        "types": [
          "*"
        ]
      },
      {
        "name": "y",
        "types": [
          "*"
        ]
      },
      {
        "name": "colorStr",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 759,
    "kind": "method",
    "name": "_focusHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_focusHandle",
    "access": "private",
    "description": null,
    "lineNumber": 303,
    "ignore": true,
    "params": [
      {
        "name": "isFocused",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 760,
    "kind": "method",
    "name": "_changeValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_changeValue",
    "access": "private",
    "description": null,
    "lineNumber": 315,
    "ignore": true,
    "params": [
      {
        "name": "x",
        "types": [
          "*"
        ]
      },
      {
        "name": "y",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 763,
    "kind": "method",
    "name": "_focusX",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_focusX",
    "access": "private",
    "description": null,
    "lineNumber": 327,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 764,
    "kind": "method",
    "name": "_focusY",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_focusY",
    "access": "private",
    "description": null,
    "lineNumber": 331,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 765,
    "kind": "method",
    "name": "_onInputChangeHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_onInputChangeHandler",
    "access": "private",
    "description": null,
    "lineNumber": 337,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 766,
    "kind": "method",
    "name": "_handleKey",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_handleKey",
    "access": "private",
    "description": null,
    "lineNumber": 349,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 767,
    "kind": "method",
    "name": "_onMouseDown",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_onMouseDown",
    "access": "private",
    "description": null,
    "lineNumber": 396,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 768,
    "kind": "member",
    "name": "_draggingHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_draggingHandler",
    "access": "private",
    "description": null,
    "lineNumber": 413,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 769,
    "kind": "member",
    "name": "_mouseUpHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_mouseUpHandler",
    "access": "private",
    "description": null,
    "lineNumber": 414,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 770,
    "kind": "method",
    "name": "_getValuesFromCoord",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_getValuesFromCoord",
    "access": "private",
    "description": " @private",
    "lineNumber": 425,
    "ignore": true,
    "params": [
      {
        "name": "point",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "{\"x\": *, \"y\": *}"
      ]
    }
  },
  {
    "__docId__": 771,
    "kind": "method",
    "name": "_handleDragging",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_handleDragging",
    "access": "private",
    "description": null,
    "lineNumber": 456,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 772,
    "kind": "method",
    "name": "_mouseUp",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_mouseUp",
    "access": "private",
    "description": null,
    "lineNumber": 463,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 773,
    "kind": "member",
    "name": "_currentHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_currentHandle",
    "access": "private",
    "description": null,
    "lineNumber": 476,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 776,
    "kind": "method",
    "name": "_getPoint",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_getPoint",
    "access": "private",
    "description": "",
    "lineNumber": 485,
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "which contains the real coordinates"
    },
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ]
  },
  {
    "__docId__": 777,
    "kind": "method",
    "name": "_focus",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_focus",
    "access": "private",
    "description": "Handles \"focusin\" event.",
    "lineNumber": 501,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 778,
    "kind": "method",
    "name": "_blur",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorArea.js~ColorArea#_blur",
    "access": "private",
    "description": "Handles \"focusout\" event.",
    "lineNumber": 510,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 779,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorFormats.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n \n const ColorFormats = {\n  HSL: \"hsl\",\n  HSV: \"hsv\",\n  RGB: \"rgb\",\n  PRGB: \"prgb\",\n  HEX : \"hex\",\n  HEX3: \"hex3\",\n  HEX4: \"hex4\",\n  HEX8: \"hex8\",\n  NAME: \"name\" \n};\n\nexport default ColorFormats;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorFormats.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 780,
    "kind": "variable",
    "name": "ColorFormats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorFormats.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorFormats.js~ColorFormats",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorFormats}",
    "description": "Copyright 2021 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 13,
    "type": {
      "types": [
        "{\"HSL\": string, \"HSV\": string, \"RGB\": string, \"PRGB\": string, \"HEX\": string, \"HEX3\": string, \"HEX4\": string, \"HEX8\": string, \"NAME\": string}"
      ]
    }
  },
  {
    "__docId__": 781,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {BaseComponent} from '../../../coral-base-component';\nimport subView from '../templates/colorHandle';\nimport {validate, transform, commons, i18n} from '../../../coral-utils';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport colorUtil from \"./ColorUtil\";\n\nconst CLASSNAME = '_coral-ColorPicker-colorHandle';\n\n/**\n @class Coral.ColorPicker.ColorHandle\n @classdesc A ColorHandle component\n @htmltag coral-colorpicker-colorhandle\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ColorHandle extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n    }));\n\n    // Templates\n    this._elements = {};\n    subView.call(this._elements, {commons, i18n});\n    this._color = new TinyColor(\"hsla(0, 100%, 50%, 1)\");\n    this._hue = 0;\n  }\n  \n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.colorHandleSubView);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } \n      else {\n        frag.appendChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n    \n    this._subView = this.querySelector(\"._coral-ColorPicker-colorHandle-color\");\n    this.color = colorUtil.toHslString(this._hue, this._color.toHslString());\n  }\n  \n  /** @ignore */\n  focus() {\n    this.classList.add(\"is-focused\");\n  }\n  \n  /** @ignore */\n  blur() {\n    this.classList.remove(\"is-focused\");\n  }\n  \n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n  }\n\n  /**   \n   The ColorSlider color.\n   @default hsla(0, 100%, 50%, 1)\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get color() {\n    return this._color.toHslString();\n  }\n  \n  set color(value) {\n    let color = new TinyColor(value);\n    if(!color.isValid) {\n      color = new TinyColor(\"hsla(0, 100%, 50%, 1)\");\n      value = color.toHslString();\n    }\n    this._color = color;\n    this._hue = colorUtil.getHue(value);\n    this._reflectAttribute('color', colorUtil.toHslString(this._hue, this._color.toHslString()));  \n    if(this._subView){\n     this._subView.style[\"background-color\"] =  colorUtil.toHslString(this._hue, this._color.toHslString());\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'disabled',\n      'color'\n    ]);\n  }\n    \n}\nexport default ColorHandle;",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 782,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 783,
    "kind": "class",
    "name": "ColorHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorPicker}",
    "description": "A ColorHandle component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorPicker.ColorHandle"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorHandle component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorpicker-colorhandle"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-colorpicker-colorhandle></coral-colorpicker-colorhandle>",
      "<caption>JS constructor</caption>\nnew Coral.ColorPicker.ColorHandle();"
    ],
    "see": [
      "../examples/#colorpicker"
    ]
  },
  {
    "__docId__": 784,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 29,
    "ignore": true
  },
  {
    "__docId__": 785,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 786,
    "kind": "member",
    "name": "_color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#_color",
    "access": "private",
    "description": null,
    "lineNumber": 38,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 787,
    "kind": "member",
    "name": "_hue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#_hue",
    "access": "private",
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 788,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#render",
    "access": "public",
    "description": null,
    "lineNumber": 43,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 789,
    "kind": "member",
    "name": "_subView",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#_subView",
    "access": "private",
    "description": null,
    "lineNumber": 66,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 791,
    "kind": "method",
    "name": "focus",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#focus",
    "access": "public",
    "description": null,
    "lineNumber": 71,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 792,
    "kind": "method",
    "name": "blur",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#blur",
    "access": "public",
    "description": null,
    "lineNumber": 76,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 793,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 87,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 795,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 92,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 796,
    "kind": "member",
    "name": "color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle#color",
    "access": "public",
    "description": "  \nThe ColorSlider color.\n<ul><li><code>hsla(0, 100%, 50%, 1)</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 106,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "hsla(0, 100%, 50%, 1)"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 800,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorHandle.js~ColorHandle.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 125,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 801,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport ColorFormats from './ColorFormats';\nimport '../../../coral-component-textfield';\nimport '../../../coral-component-button';\nimport '../../../coral-component-popover';\nimport base from '../templates/base';\nimport {validate, transform, commons, i18n} from '../../../coral-utils';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport colorUtil from \"./ColorUtil\";\n\nconst CLASSNAME = '_coral-ColorPicker';\n\n/**\n @class Coral.ColorPicker\n @classdesc A ColorPicker component than can be used as a form field to select from a list of color options.\n @htmltag coral-colorpicker\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nclass ColorPicker extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {commons, i18n});\n\n    const overlay = this._elements.overlay;\n    const overlayId = overlay.id;\n\n    // Extend form field events\n    const events = commons.extend(this._events, {\n      'key:down ._coral-ColorPicker-input:not([readonly])': '_onKeyDown',\n      'key:down [handle=\"colorPreview\"]': '_onKeyDown',\n      'click [handle=\"colorPreview\"]': '_onColorPreviewClick',\n      'key:esc input': '_onKeyEsc',\n      'key:enter input': '_onKeyEsc',\n      'capture:change  [handle=\"input\"]': '_onColorInputChange',\n      'change [handle=\"propertiesView\"]': '_onPropertyChange'\n    });\n\n    // Overlay\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_beforeOverlayOpen';\n    events[`global:capture:coral-overlay:close #${overlayId}`] = '_onOverlayClose';\n    events[`global:key:esc #${overlayId}`] = '_onKeyEsc';\n\n    // Events\n    this._delegateEvents(events);\n    this.value = \"\";\n    this._format = ColorFormats.HSL;\n    this._sendChaneEvent = this._chaneEventDebounced();\n  }\n    \n  /** @ignore */  \n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n  \n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.setAttribute('role', 'group');\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.buttonWrapper);\n    frag.appendChild(this._elements.overlay);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } \n      else {\n        frag.appendChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n\n    // These should be used to set a property since property handler aren't called until elements are attached to dom.\n    // Attribute values are delivered to change-listeners even if element isn't attached to dom yet, so attributes \n    // can be set to e.g. this._elements.colorPreview.\n    this._input = this.querySelector(\"[handle='input']\");\n    this._preview = this.querySelector(\"[handle='colorPreview']\");\n    this._overlay = this.querySelector(\"[handle='overlay']\");\n    this._overlay.setAttribute('aria-live', 'off');\n    this._properties = this._overlay.querySelector(\"[handle='propertiesView']\");\n    this._update(this._value);\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'value',\n      'formats',\n      'disabled',\n      'label',\n      'labelledby',\n      'readonly'\n    ]);\n  } \n\n\n  /** @ignore */\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      labelledby: 'labelledBy',\n      readonly: 'readOnly'\n    });\n  } \n   /**   \n   The ColorPicker label.\n   @default 'Select Color'\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get label() {\n     return this._label || i18n.get('Color Picker');\n  }\n  \n  set label(value) {\n    this._label = value;\n    this._reflectAttribute('label', this.label);\n    this._elements.input.setAttribute('aria-label', this.label);\n  } \n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */  \n  get labelledBy() {\n     return super.labelledBy;\n  }\n  \n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    // Sync input aria-labelledby\n    this._elements.input[value ? 'setAttribute' : 'removeAttribute']('aria-labelledby', value);\n\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    if (this.labelledBy) {\n      this.setAttribute('aria-labelledby', this.labelledBy);\n      this._elements.colorPreview.setAttribute('aria-labelledby',\n        [this.labelledBy,\n          this._elements.colorPreview.label.id].join(' '));\n    } \n    else {\n      this.removeAttribute('aria-labelledby');\n      this._elements.colorPreview.removeAttribute('aria-labelledby');\n    }\n  } \n     \n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.colorPreview[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n    this._elements.input[this._readOnly ? 'setAttribute' : 'removeAttribute']('readonly', this._readOnly);\n    this._elements.colorPreview[(this.disabled || this._readOnly) ? 'setAttribute' : 'removeAttribute']('disabled', this.disabled || this._readOnly);\n  }\n    \n  /**   \n   The ColorPicker value. value should be a valid color in supported format.\n   @default Empty\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get value() {\n    return this._value;\n  }\n  \n  set value(value) {\n    this._update(value);\n  }  \n\n  /**\n   The ColorPicker formats. comma separated formats should be in supported formats.\n   Any invalid/unsupported format is ignored.\n   Values selected in any other format will be converted to this format.\n   @default ColorFormats.HSL\n   @type {String}\n   @htmlattribute formats\n   @htmlattributereflected\n   */   \n  get formats() {\n    return this._formats || \"\";\n  }\n  \n  set formats(value) {\n    let formats = value.split(',');\n    formats = colorUtil.getValidFormats(formats);\n    if(formats.length > 0) {\n      this._formats = formats;\n      this._format = formats[0];\n      this._reflectAttribute('formats', this._formats);\n      this._elements.propertiesView.setAttribute('formats', value);\n      // refresh color in this new format\n      this._update(colorUtil.formatColorString(this.value, this._format));\n    }\n  } \n    \n  /**  @private */\n  _update(value) {\n    if(this.value === value) {\n      return;\n    }\n    \n    // sync UI for empty value\n    this.classList[ (value == \"\") ? 'add' : 'remove']('_coral-ColorPicker--novalue');\n    this._elements.colorPreview.classList[ (value == \"\") ? 'add' : 'remove']('_coral-ColorPicker-preview--novalue');   \n    // Empty value isn't invalid.\n    let color = new TinyColor(value);\n    let isInvalid = (value !== \"\" && !color.isValid);\n    this[isInvalid ? 'setAttribute' : 'removeAttribute']('invalid', \"true\");\n    this._elements.input[isInvalid ? 'setAttribute' : 'removeAttribute']('invalid', \"true\"); \n    if(color.isValid && (!this._formats || this._formats.indexOf(color.format) !== -1)) {\n        this._format = color.format;\n    }\n    this._value = (value == \"\" || !color.isValid) ? value : colorUtil.formatColorString(value, this._format);\n    this._elements.input.value = this._value;\n    this._elements.propertiesView.setAttribute('color', this._value);\n    this._elements.colorPreview.style[\"background-color\"] = new TinyColor(this._value).toHslString();\n  }\n\n  _debounce(func, timeout = 1000) {\n    let timer;\n    return (...args) => {\n      clearTimeout(timer);\n      timer = setTimeout(() => { func.apply(this, args); }, timeout);\n    };\n  }\n\n  _chaneEventDebounced() {\n    var self = this;\n    return this._debounce(function() {\n      self.trigger('change');\n    }, 1000);  \n  }\n  \n  /**  @private */\n  _change(color) {\n    this._update(color);\n    var self = this;\n    this._sendChaneEvent();\n  }\n  /***************** Interaction handlers***********/\n  /**  @private */\n  _onKeyDown(event) {\n    event.stopPropagation();\n    // restore focus to appropriate element when overlay closes\n    this._elements.overlay.returnFocusTo(event.matchedTarget);\n    this._elements.overlay.open = true;\n  }\n  \n  /**  @private */\n  _onKeyEsc(event) {\n    if (!this._elements.overlay.open) {\n      return;\n    }\n\n    event.stopPropagation();\n\n    this._elements.overlay.open = false;\n  }\n  \n  /**  @private */\n  _onColorPreviewClick(event) {\n    // restore focus to appropriate element when overlay closes\n    this._elements.overlay.returnFocusTo(event.matchedTarget);\n  }  \n\n  /**  @private */\n  _beforeOverlayOpen() {\n    // set aria-expanded state\n    this._elements.input.setAttribute('aria-expanded', true);\n    this._elements.colorPreview.setAttribute('aria-expanded', true);\n  }\n  \n  _onOverlayClose() {\n    // set aria-expanded state\n    this._elements.input.setAttribute('aria-expanded', true);\n    this._elements.colorPreview.setAttribute('aria-expanded', false);\n  }\n  \n  /**  @private */      \n  _onColorInputChange(event) {\n    this._update(this._input.value);\n  }\n  \n  /**  @private */\n  _onPropertyChange(event) {\n    event.stopImmediatePropagation();\n    this._change(event.detail ? event.detail : this._properties.color);\n  }\n}\nexport default ColorPicker;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 802,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 803,
    "kind": "class",
    "name": "ColorPicker",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorPicker}",
    "description": "A ColorPicker component than can be used as a form field to select from a list of color options.",
    "lineNumber": 34,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorPicker"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorPicker component than can be used as a form field to select from a list of color options."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorpicker"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent",
      "BaseFormField"
    ],
    "expressionExtends": "BaseFormField(BaseComponent(HTMLElement))",
    "examples": [
      "<caption>Markup</caption>\n<coral-colorpicker></coral-colorpicker>",
      "<caption>JS constructor</caption>\nnew Coral.ColorPicker();"
    ],
    "see": [
      "../examples/#colorpicker"
    ]
  },
  {
    "__docId__": 804,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 36,
    "ignore": true
  },
  {
    "__docId__": 805,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 807,
    "kind": "member",
    "name": "_format",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_format",
    "access": "private",
    "description": null,
    "lineNumber": 64,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 808,
    "kind": "member",
    "name": "_sendChaneEvent",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_sendChaneEvent",
    "access": "private",
    "description": null,
    "lineNumber": 65,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 809,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 69,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 810,
    "kind": "method",
    "name": "disconnectedCallback",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#disconnectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 82,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 811,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#render",
    "access": "public",
    "description": null,
    "lineNumber": 94,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 812,
    "kind": "member",
    "name": "_input",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_input",
    "access": "private",
    "description": null,
    "lineNumber": 124,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 813,
    "kind": "member",
    "name": "_preview",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_preview",
    "access": "private",
    "description": null,
    "lineNumber": 125,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 814,
    "kind": "member",
    "name": "_overlay",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_overlay",
    "access": "private",
    "description": null,
    "lineNumber": 126,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 815,
    "kind": "member",
    "name": "_properties",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_properties",
    "access": "private",
    "description": null,
    "lineNumber": 128,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 816,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 133,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 817,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 146,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 818,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#label",
    "access": "public",
    "description": "  \nThe ColorPicker label.\n<ul><li><code>'Select Color'</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 159,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "'Select Color'"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 820,
    "kind": "member",
    "name": "_label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_label",
    "access": "private",
    "description": null,
    "lineNumber": 164,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 821,
    "kind": "member",
    "name": "labelledBy",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#labelledBy",
    "access": "public",
    "description": "Inherited from {@link BaseFormField#labelledBy}.",
    "lineNumber": 172,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 823,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 202,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 825,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 207,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 826,
    "kind": "member",
    "name": "readOnly",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#readOnly",
    "access": "public",
    "description": "Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 222,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "readonly"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 828,
    "kind": "member",
    "name": "_readOnly",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_readOnly",
    "access": "private",
    "description": null,
    "lineNumber": 227,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 829,
    "kind": "member",
    "name": "value",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#value",
    "access": "public",
    "description": "  \nThe ColorPicker value. value should be a valid color in supported format.\n<ul><li><code>Empty</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 240,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "Empty"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 831,
    "kind": "member",
    "name": "formats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#formats",
    "access": "public",
    "description": "The ColorPicker formats. comma separated formats should be in supported formats.\nAny invalid/unsupported format is ignored.\nValues selected in any other format will be converted to this format.\n<ul><li><code>ColorFormats.HSL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 257,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ColorFormats.HSL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "formats"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 833,
    "kind": "member",
    "name": "_formats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_formats",
    "access": "private",
    "description": null,
    "lineNumber": 265,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 835,
    "kind": "method",
    "name": "_update",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_update",
    "access": "private",
    "description": " @private",
    "lineNumber": 275,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 837,
    "kind": "member",
    "name": "_value",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_value",
    "access": "private",
    "description": null,
    "lineNumber": 291,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 838,
    "kind": "method",
    "name": "_debounce",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_debounce",
    "access": "private",
    "description": null,
    "lineNumber": 297,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "func",
        "types": [
          "*"
        ]
      },
      {
        "name": "timeout",
        "optional": true,
        "types": [
          "number"
        ],
        "defaultRaw": 1000,
        "defaultValue": "1000"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 839,
    "kind": "method",
    "name": "_chaneEventDebounced",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_chaneEventDebounced",
    "access": "private",
    "description": null,
    "lineNumber": 305,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 840,
    "kind": "method",
    "name": "_change",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_change",
    "access": "private",
    "description": " @private",
    "lineNumber": 313,
    "ignore": true,
    "params": [
      {
        "name": "color",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 841,
    "kind": "method",
    "name": "_onKeyDown",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onKeyDown",
    "access": "private",
    "description": " @private",
    "lineNumber": 320,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 842,
    "kind": "method",
    "name": "_onKeyEsc",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onKeyEsc",
    "access": "private",
    "description": " @private",
    "lineNumber": 328,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 843,
    "kind": "method",
    "name": "_onColorPreviewClick",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onColorPreviewClick",
    "access": "private",
    "description": " @private",
    "lineNumber": 339,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 844,
    "kind": "method",
    "name": "_beforeOverlayOpen",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_beforeOverlayOpen",
    "access": "private",
    "description": " @private",
    "lineNumber": 345,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 845,
    "kind": "method",
    "name": "_onOverlayClose",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onOverlayClose",
    "access": "private",
    "description": null,
    "lineNumber": 351,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 846,
    "kind": "method",
    "name": "_onColorInputChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onColorInputChange",
    "access": "private",
    "description": " @private",
    "lineNumber": 358,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 847,
    "kind": "method",
    "name": "_onPropertyChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorPicker.js~ColorPicker#_onPropertyChange",
    "access": "private",
    "description": " @private",
    "lineNumber": 363,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 848,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-select';\nimport ColorFormats from './ColorFormats';\nimport propertiesSubview from '../templates/colorProperties';\nimport {validate, transform, commons, i18n} from '../../../coral-utils';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport colorUtil from \"./ColorUtil\";\n\nconst CLASSNAME = '_coral-ColorPicker-properties';\n\n/**\n @class Coral.ColorPicker.ColorProperties\n @classdesc A ColorPicker Color properties component\n @htmltag coral-colorpicker-properties\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ColorProperties extends BaseComponent(HTMLElement) {\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n       'change [handle=\"propertyHue\"]': '_onHueChange',\n       'change [handle=\"propertySL\"]': '_onSLChange',\n       'change  [handle=\"formatSelector\"]': '_onFormatChange',\n       'capture:change  [handle=\"colorInput\"]': '_onColorInputChange',\n       'input  [handle=\"colorInput\"]': \"_onColorInputChange\"\n    }));\n    \n\n    // Templates\n    this._elements = {};\n    propertiesSubview.call(this._elements, {commons, i18n});\n    this._hue = 240; \n    this._s = 1;\n    this._l = 0.5;\n    this._a = 1;\n    this._format = ColorFormats.HSV;\n  }\n  \n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.propertiesSubview);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } \n      else {\n        frag.appendChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n    //these should be used to set a property since property handler aren't called until elements are attached to dom.\n    // Attribute values are delivered to change-listeners even if element isn't attached to dom yet.\n    this._colorArea = this.querySelector(\"[handle='propertySL']\");\n    this._colorSliderHue = this.querySelector(\"[handle='propertyHue']\");\n    this._formatSelector = this.querySelector(\"[handle='formatSelector']\");\n    this._colorInput = this.querySelector(\"[handle='colorInput']\");\n    // update color in all subviews\n    this._updateFormat(this._format);\n    this._updateHue(this._hue);\n    this._updateSL(this._s, this._l);\n    this._updateAlpha(this._a);\n    this._updateValue();\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.propertySL[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.propertyHue[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.formatSelector[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.colorInput[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n  }\n\n  /**\n   The ColorProperties formats. comma separated formats should be in supported formats.\n   First format will be used as default format.\n   Values selected in any other format will be converted to default format.\n   @default ColorFormats.HSL\n   @type {Array}\n   @htmlattribute formats\n   @htmlattributereflected\n   */   \n  get formats() {\n    return this._formats || \"\";\n  }\n  \n  set formats(value) {\n    if(value == \"\") {\n      return;\n    }\n    let formats = value.split(',');\n    formats = colorUtil.getValidFormats(formats);\n    if(formats.length > 0) {\n      this._formats = formats;\n      this._format = formats[0];\n      this._elements.formatSelector.setAttribute('value', this._format);\n      // update input value to this format\n      this._elements.colorInput.value = this.color;\n      // populate format selector list\n      let selList = this._elements.formatSelector.querySelectorAll('coral-select-item');\n      selList.forEach(function(element) {\n        if(formats.indexOf(element.value) == -1) {\n          element.remove();\n        }\n      });\n      this._reflectAttribute('formats', this._formats);\n    }\n  }\n    \n  /**\n   The ColorProperties color string.\n   @default hsla(0, 100%, 50%, 1)\n   @type {String}\n   @htmlattribute color\n   @htmlattributereflected\n   */   \n  get color() {\n    return colorUtil.formatColorString(colorUtil.toHslString(this._hue, this._getColorFromProps()), this._format);\n  }\n  \n  set color(value) {\n    let color = new TinyColor(value);\n    if(!color.isValid) {\n      color = new TinyColor(\"hsla(240, 100%, 50%, 1)\");\n      value = color.toHslString();\n    }\n    \n    if(this.color === value) {\n       return;\n    }\n        \n    this._updateFormat(color.format);\n    this._updateHue(colorUtil.getHue(value));\n    this._updateSL(color.toHsl().s, color.toHsl().l);\n    this._updateAlpha(color.a);\n    this._updateValue();\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'disabled',\n      'color',\n      'formats'\n    ]);\n  }  \n\n  /** @private */\n  _onHueChange(event) {\n    event.stopImmediatePropagation();\n    this._updateHue(this._colorSliderHue.value);\n    this.trigger('change');\n  }\n\n  /** @private */\n  _onSLChange(event) {\n    event.stopImmediatePropagation();\n    const color = new TinyColor({h: this._hue, s: this._colorArea.x, v: this._colorArea.y});\n    this._updateSL(color.toHsl().s, color.toHsl().l);\n    this.trigger('change');\n  }\n  \n  /** @private */\n  _onFormatChange(event) {\n    event.stopImmediatePropagation();\n    this._updateFormat(this._formatSelector.value);\n    this.trigger('change');\n  }\n\n  /** @private */\n  _onColorInputChange(event) {\n    const inputColorText = this._colorInput.value;\n    const color = new TinyColor(inputColorText);\n    if (!color.isValid) {\n      return;\n    }\n    const cursorLoc = event.target.selectionStart;\n    event.stopImmediatePropagation();\n    this.color = this._colorInput.value;\n    // trigger picker change event & send input color as event details to set it in picker input\n    this.trigger('change', inputColorText);\n    // restore user input color text in textfield\n    this._colorInput.value = inputColorText;\n    // set cursor to last user input location\n    event.target.setSelectionRange(cursorLoc, cursorLoc);\n  }\n      \n  /** @private */\n  _updateFormat(format) {\n    this._format  = format;\n    this._elements.formatSelector.setAttribute('value', this._format);\n    this._updateValue();\n  }\n\n  /** @private */\n  _updateHue(hue) {\n    this._hue = Math.round(hue);\n    const color = this._getColorFromProps();\n    this._elements.propertyHue.setAttribute('color', colorUtil.toHslString(this._hue, color.toHslString()));\n    // need to update hue in ColorArea but not s and v, so get s and v  from ColorArea\n    this._elements.propertySL.setAttribute('color', this._toHsvString(this._hue, this._elements.propertySL.x, this._elements.propertySL.y));\n    this._updateValue();\n  }\n    \n  /** @private */\n  _updateSL(s, l) {\n    this._s = s;\n    this._l = l;\n    const color = new TinyColor({h:this._hue, s:this._s, l:this._l});\n    this._elements.propertySL.setAttribute('color', colorUtil.toHslString(this._hue, color.toHslString()));\n    this._updateValue();\n  }\n  \n  /** @private */\n  _updateAlpha(a) {\n    this._a = a;\n    this._updateValue();\n  }\n\n  /** @private */\n  _toHsvString(hue, x, y) {\n      const s = `${Math.round(x * 100)}%`;\n      const v = `${Math.round(y * 100)}%`;\n      return `hsv(${this._hue}, ${s}, ${v})`;\n  }\n    \n  /** @private */\n  _getColorFromProps() {\n    return  new TinyColor({h:this._hue, s:this._s, l:this._l, a:this._a});\n  }\n  \n  /** @private */ \n  _updateValue() {\n    this._reflectAttribute('color', this.color);\n    this._elements.colorInput.value = this.color;\n  }\n}\n\nexport default ColorProperties;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 849,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 850,
    "kind": "class",
    "name": "ColorProperties",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorPicker}",
    "description": "A ColorPicker Color properties component",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorPicker.ColorProperties"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorPicker Color properties component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorpicker-properties"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-colorpicker-properties></coral-colorpicker-properties>",
      "<caption>JS constructor</caption>\nnew Coral.ColorPicker.ColorProperties();"
    ],
    "see": [
      "../examples/#colorpicker"
    ]
  },
  {
    "__docId__": 851,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 31,
    "undocument": true
  },
  {
    "__docId__": 852,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 44,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 853,
    "kind": "member",
    "name": "_hue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_hue",
    "access": "private",
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 854,
    "kind": "member",
    "name": "_s",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_s",
    "access": "private",
    "description": null,
    "lineNumber": 47,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 855,
    "kind": "member",
    "name": "_l",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_l",
    "access": "private",
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 856,
    "kind": "member",
    "name": "_a",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_a",
    "access": "private",
    "description": null,
    "lineNumber": 49,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 857,
    "kind": "member",
    "name": "_format",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_format",
    "access": "private",
    "description": null,
    "lineNumber": 50,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 858,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#render",
    "access": "public",
    "description": null,
    "lineNumber": 53,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 859,
    "kind": "member",
    "name": "_colorArea",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_colorArea",
    "access": "private",
    "description": null,
    "lineNumber": 77,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 860,
    "kind": "member",
    "name": "_colorSliderHue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_colorSliderHue",
    "access": "private",
    "description": null,
    "lineNumber": 78,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 861,
    "kind": "member",
    "name": "_formatSelector",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_formatSelector",
    "access": "private",
    "description": null,
    "lineNumber": 79,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 862,
    "kind": "member",
    "name": "_colorInput",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_colorInput",
    "access": "private",
    "description": null,
    "lineNumber": 80,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 863,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 96,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 865,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 101,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 866,
    "kind": "member",
    "name": "formats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#formats",
    "access": "public",
    "description": "The ColorProperties formats. comma separated formats should be in supported formats.\nFirst format will be used as default format.\nValues selected in any other format will be converted to default format.\n<ul><li><code>ColorFormats.HSL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 121,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ColorFormats.HSL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "formats"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Array"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 868,
    "kind": "member",
    "name": "_formats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_formats",
    "access": "private",
    "description": null,
    "lineNumber": 132,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 870,
    "kind": "member",
    "name": "color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#color",
    "access": "public",
    "description": "The ColorProperties color string.\n<ul><li><code>hsla(0, 100%, 50%, 1)</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 155,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "hsla(0, 100%, 50%, 1)"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "color"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 872,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 178,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 873,
    "kind": "method",
    "name": "_onHueChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_onHueChange",
    "access": "private",
    "description": null,
    "lineNumber": 187,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 874,
    "kind": "method",
    "name": "_onSLChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_onSLChange",
    "access": "private",
    "description": null,
    "lineNumber": 194,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 875,
    "kind": "method",
    "name": "_onFormatChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_onFormatChange",
    "access": "private",
    "description": null,
    "lineNumber": 202,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 876,
    "kind": "method",
    "name": "_onColorInputChange",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_onColorInputChange",
    "access": "private",
    "description": null,
    "lineNumber": 209,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 878,
    "kind": "method",
    "name": "_updateFormat",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_updateFormat",
    "access": "private",
    "description": null,
    "lineNumber": 227,
    "ignore": true,
    "params": [
      {
        "name": "format",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 880,
    "kind": "method",
    "name": "_updateHue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_updateHue",
    "access": "private",
    "description": null,
    "lineNumber": 234,
    "ignore": true,
    "params": [
      {
        "name": "hue",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 882,
    "kind": "method",
    "name": "_updateSL",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_updateSL",
    "access": "private",
    "description": null,
    "lineNumber": 244,
    "ignore": true,
    "params": [
      {
        "name": "s",
        "types": [
          "*"
        ]
      },
      {
        "name": "l",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 885,
    "kind": "method",
    "name": "_updateAlpha",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_updateAlpha",
    "access": "private",
    "description": null,
    "lineNumber": 253,
    "ignore": true,
    "params": [
      {
        "name": "a",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 887,
    "kind": "method",
    "name": "_toHsvString",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_toHsvString",
    "access": "private",
    "description": null,
    "lineNumber": 259,
    "ignore": true,
    "params": [
      {
        "name": "hue",
        "types": [
          "*"
        ]
      },
      {
        "name": "x",
        "types": [
          "*"
        ]
      },
      {
        "name": "y",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 888,
    "kind": "method",
    "name": "_getColorFromProps",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_getColorFromProps",
    "access": "private",
    "description": null,
    "lineNumber": 266,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 889,
    "kind": "method",
    "name": "_updateValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorProperties.js~ColorProperties#_updateValue",
    "access": "private",
    "description": null,
    "lineNumber": 271,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 890,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {BaseComponent} from '../../../coral-base-component';\nimport view from '../templates/colorSlider';\nimport {validate, transform, events, commons, i18n, Keys} from '../../../coral-utils';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport colorUtil from \"./ColorUtil\";\n\nconst CLASSNAME = '_coral-ColorPicker-ColorSlider';\n\n/**\n @@base ColorSlider\n @classdesc A ColorPicker color slider component\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ColorSlider extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      'key:up': '_handleKey',\n      'key:right': '_handleKey',\n      'key:down': '_handleKey',\n      'key:left': '_handleKey',\n      'key:pageUp': '_handleKey',\n      'key:pageDown': '_handleKey',\n      'key:home': '_handleKey',\n      'key:end': '_handleKey',\n      \n      'input': '_onInputChangeHandler',\n      \n      'touchstart': '_onMouseDown',\n      'mousedown': '_onMouseDown',\n      'capture:focus': '_focus',\n      'capture:blur': '_blur'\n    }));\n\n    // Templates\n    this._elements = {};\n    view.call(this._elements, {commons, i18n});\n    \n    // default value\n    this._label = \"\";\n    this._value = 180;\n    this._color = new TinyColor(\"hsla(180, 100%, 50%, 1)\");\n    this._hue = 180;\n    this._min = 0;\n    this._max = 100;\n    this._step = 1;\n  }\n  \n  /** @ignore */ \n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.checkerboard);\n    frag.appendChild(this._elements.colorHandle);\n    frag.appendChild(this._elements.slider);\n\n    // Support cloneNode\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.ELEMENT_NODE && child.hasAttribute('handle')) {\n        this.removeChild(child);\n      } \n      else {\n        frag.appendChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n    \n    this._syncInputSliderAttrs();\n    // These should be used to set a property since property handler aren't called until elements are attached to dom.\n    // Attribute values are delivered to change-listeners even if element isn't attached to dom yet, so attributes \n    // can be set to e.g. this._elements.colorHandle.    \n    this._handle = this.querySelector('._coral-ColorPicker-ColorSlider-colorHandle');\n    this._slider = this.querySelector('._coral-ColorPicker-ColorSlider-slider');\n    this._updateValue(this._hue);\n  }\n\n  /**   \n   The ColorSlider label.\n   @default 'Hue'\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get label() {\n     return this._label;\n  }\n  \n  set label(value) {\n    this._label = value;\n    this._reflectAttribute('label', this._label);\n    this._syncInputSliderAttrs();\n  } \n\n  /**   \n   The ColorSlider value. value should be in multiple of step size.\n   @default 0\n   @type {String}\n   @htmlattribute label\n   @htmlattributereflected\n   */   \n  get value() {\n    return this._value;\n  }\n  \n  set value(value) {\n    if(this._value !== value) {\n      this._updateValue(value);\n    }\n  }\n\n  /**\n   The ColorSlider color string in hsla format.\n   @default hsla(0, 100%, 50%, 1)\n   @type {String}\n   @htmlattribute color\n   @htmlattributereflected\n   */   \n  get color() {\n    return colorUtil.toHslString(this._hue, this._color.toHslString());\n  }\n  \n  set color(value) {\n    if(this.color === value) {\n       return;\n    }\n    let color = new TinyColor(value);\n    if(!color.isValid) {\n      color = new TinyColor(\"hsla(180, 100%, 50%, 1)\");\n      value = color.toHslString();\n    }\n    this._hue = colorUtil.getHue(value);\n    this._updateValue(this._hue);\n  }\n        \n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'label',\n      'value',\n      'disabled',\n      'color'\n    ]);\n  }  \n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.slider[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n    this._elements.colorHandle[this._disabled ? 'setAttribute' : 'removeAttribute']('disabled', this._disabled);\n  }\n  \n  focus() {\n    this._slider.focus();\n  }\n\n  /** @private */ \n  _colorFromValue(value) {\n    return new TinyColor({ h: value, s: 1, l: .5, a:1 });\n  }\n      \n  /** @private */\n  _syncInputSliderAttrs() {\n    if(Number(this._elements.slider.getAttribute('min')) !== this._min) {\n      this._elements.slider.setAttribute('min', this._min);\n    }\n    \n    if(Number(this._elements.slider.getAttribute('max')) !== this._max) {\n      this._elements.slider.setAttribute('max', this._max);\n    }\n    \n    if(Number(this._elements.slider.getAttribute('step')) !== this._step) {\n      this._elements.slider.setAttribute('step', this._step);\n    }  \n    \n    if(this._elements.slider.getAttribute('aria-label') !== this._label) {\n      this._elements.slider.setAttribute('aria-label', this._label);\n    }\n  }\n\n  /** @private */  \n  _snapValueToStep(rawValue, min, max, step) {\n    const remainder = (rawValue - min) % step;\n    let snappedValue = rawValue;\n    \n    if (Math.abs(remainder) * 2 >= step) {\n      snappedValue = rawValue - remainder + step;\n    } \n    else {\n      snappedValue = rawValue - remainder;\n    }\n    if (snappedValue < min) {\n      snappedValue = min;\n    } \n    else if (snappedValue > max) {\n      snappedValue = min + Math.floor((max - min) / step) * step;\n    }\n    return snappedValue;\n  }\n  \n  /** @private */\n  _updateHandlePosition() {\n    const percent = 100 - ((this._value - this._min) / (this._max - this._min) * 100);\n    if(this._handle) {\n      this._handle.style.top = `${percent}%`;\n    }\n  }\n    \n  /** @private */  \n  _focusHandle(isFocused) {\n    if(this._handle) {\n       if(isFocused === true) {\n        this._handle.focus();  \n      } \n      else {\n        this._handle.blur(); \n      }\n    }\n  }\n\n  /** @private */ \n  _updateValue(value) {\n    let rawValue = Number(value, 10);\n    if(isNaN(rawValue)) {\n      rawValue = this._min;\n    }\n    \n    this._value = this._snapValueToStep(rawValue, this._min, this._max,  this._step);\n    this._hue = this._value;\n    // update color\n    this._color = this._colorFromValue(this._value);\n    this._elements.colorHandle.setAttribute('color', colorUtil.toHslString(this._hue, this._color.toHslString()));\n    this._reflectAttribute('color', colorUtil.toHslString(this._hue, this._color.toHslString()));\n    this._reflectAttribute('value', this._value);\n    this._elements.slider.setAttribute('value', this._value);\n    this._updateHandlePosition();\n  }\n\n  /** @private */ \n  _changeValue(value) {\n     if(value !== this.value) {\n      var currVal = this.value;\n      this._updateValue(value);\n      if(currVal !== this.value) {\n        this.trigger('change');\n      }\n     }\n  }\n\n/******* Events Handling **************/\n\n  /** @private */\n  _onInputChangeHandler(event) {\n    this.focus();\n    this._focusHandle(true);\n    event.stopPropagation();\n    this._changeValue(event.target.value);\n  }\n\n  /** @private */\n  _handleKey(event) {\n    this.focus();\n    this._focusHandle(true);\n    event.preventDefault();\n    event.stopPropagation();\n    let value = this._value;\n    // increase\n    if (event.keyCode === Keys.keyToCode('up') ||\n      event.keyCode === Keys.keyToCode('right') ||\n      event.keyCode === Keys.keyToCode('pageUp')) {\n      value += this._step;\n    }\n    // decrease\n    else if (event.keyCode === Keys.keyToCode('down') ||\n      event.keyCode === Keys.keyToCode('left') ||\n      event.keyCode === Keys.keyToCode('pageDown')) {\n      value -= this._step;\n    }\n    // min\n    else if (event.keyCode === Keys.keyToCode('home')) {\n      value = this._min;\n    }\n    // max\n    else if (event.keyCode === Keys.keyToCode('end')) {\n      value = this._max;\n    }\n    this._changeValue(value);  \n  }\n   \n  /** @private */\n  _onMouseDown() {\n    if (event instanceof MouseEvent) {\n      if ((event.which || event.button) !== 1) {\n        return;\n      }\n    }\n    event.preventDefault();\n    \n    this._handle.classList.add('is-dragged');\n    document.body.classList.add('u-coral-closedHand');\n    this.focus();\n    this._focusHandle(true);\n    this._changeValue(this._getValueFromCoord(this._getPoint(event).clientY));\n         \n    const classNameSelector = \".\" + CLASSNAME;\n    this._draggingHandler = this._handleDragging.bind(this);\n    this._mouseUpHandler = this._mouseUp.bind(this);    \n    \n    events.on('mousemove.CoralSlider', this._draggingHandler);\n    events.on('mouseup.CoralSlider', this._mouseUpHandler);\n\n    events.on('touchmove.CoralSlider', this._draggingHandler);\n    events.on('touchend.CoralSlider', this._mouseUpHandler);\n    events.on('touchcancel.CoralSlider', this._mouseUpHandler);  \n  }\n\n  /**  @private */\n  _getValueFromCoord(posY) {\n    const boundingClientRect = this.getBoundingClientRect();\n    const height = boundingClientRect.height;\n    if(posY < boundingClientRect.top) {\n      posY = boundingClientRect.top;\n    }\n    else if(posY > boundingClientRect.bottom) {\n      posY = boundingClientRect.bottom;\n    }\n    const positionFraction = (height -(posY - boundingClientRect.top)) / height; \n    const rawValue = this._min + positionFraction * (this._max - this._min);\n    return this._snapValueToStep(rawValue, this._min, this._max, this._step);\n  }\n    \n  /** @private */\n  _handleDragging(event) {\n    this._changeValue(this._getValueFromCoord(this._getPoint(event).clientY));\n    event.preventDefault();\n  }  \n\n  /** @private */\n  _mouseUp(event) {\n    this._handle.style.cursor = 'grab';\n    this._handle.classList.remove('is-dragged');\n    document.body.classList.remove('u-coral-closedHand');\n    this._focusHandle(false); \n    const classNameSelector = \".\" + CLASSNAME;\n    \n    events.off('mousemove.CoralSlider', this._draggingHandler);\n    events.off('touchmove.CoralSlider', this._draggingHandler);\n    events.off('mouseup.CoralSlider', this._mouseUpHandler);\n    events.off('touchend.CoralSlider', this._mouseUpHandler);\n    events.off('touchcancel.CoralSlider', this._mouseUpHandler);\n\n    this._currentHandle = null;\n    this._draggingHandler = null;\n    this._mouseUpHandler = null;  \n  }\n  \n  /**\n   @private\n   @return {Object} which contains the real coordinates\n   */\n  _getPoint(event) {\n    if (event.changedTouches && event.changedTouches.length > 0) {\n      return event.changedTouches[0];\n    } \n    else if (event.touches && event.touches.length > 0) {\n      return event.touches[0];\n    }\n\n    return event;\n  }\n\n  /**\n   Handles \"focusin\" event.\n\n   @private\n   */\n  _focus(event) {\n    this._focusHandle(true);\n  }\n  \n  /**\n   Handles \"focusout\" event.\n\n   @private\n   */\n  _blur(event) {\n    this._focusHandle(false);\n  }\n        \n}\nexport default ColorSlider;",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 891,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 892,
    "kind": "class",
    "name": "ColorSlider",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorSlider}",
    "description": "A ColorPicker color slider component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorPicker color slider component"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)"
  },
  {
    "__docId__": 893,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 894,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 50,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 895,
    "kind": "member",
    "name": "_label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_label",
    "access": "private",
    "description": null,
    "lineNumber": 54,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 896,
    "kind": "member",
    "name": "_value",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_value",
    "access": "private",
    "description": null,
    "lineNumber": 55,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 897,
    "kind": "member",
    "name": "_color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_color",
    "access": "private",
    "description": null,
    "lineNumber": 56,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 898,
    "kind": "member",
    "name": "_hue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_hue",
    "access": "private",
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 899,
    "kind": "member",
    "name": "_min",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_min",
    "access": "private",
    "description": null,
    "lineNumber": 58,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 900,
    "kind": "member",
    "name": "_max",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_max",
    "access": "private",
    "description": null,
    "lineNumber": 59,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 901,
    "kind": "member",
    "name": "_step",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_step",
    "access": "private",
    "description": null,
    "lineNumber": 60,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 902,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#render",
    "access": "public",
    "description": null,
    "lineNumber": 64,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 903,
    "kind": "member",
    "name": "_handle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_handle",
    "access": "private",
    "description": null,
    "lineNumber": 93,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 904,
    "kind": "member",
    "name": "_slider",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_slider",
    "access": "private",
    "description": null,
    "lineNumber": 94,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 905,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#label",
    "access": "public",
    "description": "  \nThe ColorSlider label.\n<ul><li><code>'Hue'</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 105,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "'Hue'"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 908,
    "kind": "member",
    "name": "value",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#value",
    "access": "public",
    "description": "  \nThe ColorSlider value. value should be in multiple of step size.\n<ul><li><code>0</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 122,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "0"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "label"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 910,
    "kind": "member",
    "name": "color",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#color",
    "access": "public",
    "description": "The ColorSlider color string in hsla format.\n<ul><li><code>hsla(0, 100%, 50%, 1)</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 139,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "hsla(0, 100%, 50%, 1)"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "color"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 913,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 157,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 914,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 173,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 916,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 178,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 917,
    "kind": "method",
    "name": "focus",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#focus",
    "access": "public",
    "description": null,
    "lineNumber": 187,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 918,
    "kind": "method",
    "name": "_colorFromValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_colorFromValue",
    "access": "private",
    "description": null,
    "lineNumber": 192,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 919,
    "kind": "method",
    "name": "_syncInputSliderAttrs",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_syncInputSliderAttrs",
    "access": "private",
    "description": null,
    "lineNumber": 197,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 920,
    "kind": "method",
    "name": "_snapValueToStep",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_snapValueToStep",
    "access": "private",
    "description": null,
    "lineNumber": 216,
    "ignore": true,
    "params": [
      {
        "name": "rawValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "min",
        "types": [
          "*"
        ]
      },
      {
        "name": "max",
        "types": [
          "*"
        ]
      },
      {
        "name": "step",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 921,
    "kind": "method",
    "name": "_updateHandlePosition",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_updateHandlePosition",
    "access": "private",
    "description": null,
    "lineNumber": 236,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 922,
    "kind": "method",
    "name": "_focusHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_focusHandle",
    "access": "private",
    "description": null,
    "lineNumber": 244,
    "ignore": true,
    "params": [
      {
        "name": "isFocused",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 923,
    "kind": "method",
    "name": "_updateValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_updateValue",
    "access": "private",
    "description": null,
    "lineNumber": 256,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 927,
    "kind": "method",
    "name": "_changeValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_changeValue",
    "access": "private",
    "description": null,
    "lineNumber": 274,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 928,
    "kind": "method",
    "name": "_onInputChangeHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_onInputChangeHandler",
    "access": "private",
    "description": null,
    "lineNumber": 287,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 929,
    "kind": "method",
    "name": "_handleKey",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_handleKey",
    "access": "private",
    "description": null,
    "lineNumber": 295,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 930,
    "kind": "method",
    "name": "_onMouseDown",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_onMouseDown",
    "access": "private",
    "description": null,
    "lineNumber": 325,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 931,
    "kind": "member",
    "name": "_draggingHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_draggingHandler",
    "access": "private",
    "description": null,
    "lineNumber": 340,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 932,
    "kind": "member",
    "name": "_mouseUpHandler",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_mouseUpHandler",
    "access": "private",
    "description": null,
    "lineNumber": 341,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 933,
    "kind": "method",
    "name": "_getValueFromCoord",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_getValueFromCoord",
    "access": "private",
    "description": " @private",
    "lineNumber": 352,
    "ignore": true,
    "params": [
      {
        "name": "posY",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 934,
    "kind": "method",
    "name": "_handleDragging",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_handleDragging",
    "access": "private",
    "description": null,
    "lineNumber": 367,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 935,
    "kind": "method",
    "name": "_mouseUp",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_mouseUp",
    "access": "private",
    "description": null,
    "lineNumber": 373,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 936,
    "kind": "member",
    "name": "_currentHandle",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_currentHandle",
    "access": "private",
    "description": null,
    "lineNumber": 386,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 939,
    "kind": "method",
    "name": "_getPoint",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_getPoint",
    "access": "private",
    "description": "",
    "lineNumber": 395,
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "which contains the real coordinates"
    },
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ]
  },
  {
    "__docId__": 940,
    "kind": "method",
    "name": "_focus",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_focus",
    "access": "private",
    "description": "Handles \"focusin\" event.",
    "lineNumber": 411,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 941,
    "kind": "method",
    "name": "_blur",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSlider.js~ColorSlider#_blur",
    "access": "private",
    "description": "Handles \"focusout\" event.",
    "lineNumber": 420,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 942,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport ColorSlider from './ColorSlider';\nimport { TinyColor } from '@ctrl/tinycolor';\n\nconst CLASSNAME = '_coral-ColorPicker-ColorSlider-hue';\n\n/**\n @class Coral.ColorPicker.ColorSliderHue\n @classdesc A ColorPicker color slider hue component to select Hue\n @htmltag coral-colorpicker-colorsliderhue\n @extends {ColorSlider}\n */\nclass ColorSliderHue extends ColorSlider {\n  /** @ignore */\n  constructor() {\n    super();\n    this._min = 0;\n    this._max = 360;\n    this._step = 1;    \n  }\n\n  /** @private */ \n  _updateValue(value) {\n    super._updateValue(value);\n    this._elements.slider.setAttribute('aria-valuetext', `${this.value}°`);\n  }\n  \n  /** @ignore */ \n  render() {\n    super.render();\n    this.classList.add(CLASSNAME);\n    this._updateValue(this.value);\n  }\n\n  /** @private */ \n  _colorFromValue(value) {\n    return new TinyColor({ h: value, s: 1, l: .50, a:1 });\n  }  \n}\nexport default ColorSliderHue;",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 943,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 944,
    "kind": "class",
    "name": "ColorSliderHue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColorPicker}",
    "description": "A ColorPicker color slider hue component to select Hue",
    "lineNumber": 23,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColorPicker.ColorSliderHue"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColorPicker color slider hue component to select Hue"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-colorpicker-colorsliderhue"
      }
    ],
    "interface": false,
    "extends": [
      "ColorSlider"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-colorpicker-colorsliderhue></coral-colorpicker-colorsliderhue>",
      "<caption>JS constructor</caption>\nnew Coral.ColorPicker.ColorSliderHue();"
    ],
    "see": [
      "../examples/#colorpicker"
    ]
  },
  {
    "__docId__": 945,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 25,
    "ignore": true
  },
  {
    "__docId__": 946,
    "kind": "member",
    "name": "_min",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#_min",
    "access": "private",
    "description": null,
    "lineNumber": 27,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 947,
    "kind": "member",
    "name": "_max",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#_max",
    "access": "private",
    "description": null,
    "lineNumber": 28,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 948,
    "kind": "member",
    "name": "_step",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#_step",
    "access": "private",
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 949,
    "kind": "method",
    "name": "_updateValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#_updateValue",
    "access": "private",
    "description": null,
    "lineNumber": 33,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 950,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#render",
    "access": "public",
    "description": null,
    "lineNumber": 39,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 951,
    "kind": "method",
    "name": "_colorFromValue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorSliderHue.js~ColorSliderHue#_colorFromValue",
    "access": "private",
    "description": null,
    "lineNumber": 46,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 952,
    "kind": "file",
    "name": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { TinyColor } from '@ctrl/tinycolor';\nimport ColorFormats from './ColorFormats';\n\nclass ColorUtil {\n\n  constructor() {}\n  /**\n   Utility function to convert a color to Hsl string.\n\n   @param {String} hue\n   The hue value  which is preserved in color conversion.\n   @param {String} colorString\n   The color string\n   */\n  toHslString(hue, colorString) {\n    const color =  new TinyColor(colorString);\n    const hueExp = /(^hs[v|l]a?\\()\\d{1,3}/; \n    return color.toHslString().replace(hueExp, `$1${hue}`);\n  }\n\n  /**\n   Utility function to convert a color to Hsv string.\n\n   @param {String} hue\n   The hue value  which is preserved in color conversion.\n   @param {String} colorString\n   The color string\n   */\n  toHsvString(hue, colorString) {\n    const color =  new TinyColor(colorString);\n    const hueExp = /(^hs[v|l]a?\\()\\d{1,3}/; \n    return color.toHsvString().replace(hueExp, `$1${hue}`);\n  }\n\n  /**\n   Utility function to extract  h,s and v from a color string.\n   @param {String} colorString\n   The color string\n   */\n  extractHsv(colorString) {\n    const exp = /^hsva?\\((\\d{1,3}),\\s*(\\d{1,3}%),\\s*(\\d{1,3}%)/;\n    if(!colorString.startsWith(\"hsv\")) {\n      colorString = new TinyColor(colorString).toHsvString();\n    } \n    let groups = exp.exec(colorString);\n    const h = parseInt(groups[1]);\n    const s = parseInt(groups[2])/100;\n    const v = parseInt(groups[3])/100;\n    return {h:h, s:s, v:v};\n  }\n    \n  /**\n  Utility function to extract hue.\n  @param {String} colorString\n  The color string\n  */\n  getHue(colorString) {\n    if(colorString.startsWith('hs')) {\n      const hueExp = /^hs[v|l]a?\\((\\d{1,3})/;\n      const values = hueExp.exec(colorString);\n      const [, h] = values;\n      return Number(h);\n    }  \n    else {\n      return new TinyColor(colorString).toHsv().h;\n    }  \n  }\n\n  /**\n  Utility function to validate given formats in supported formats and return a list of formats.\n  Any invalid/unsupported format is ignored.\n  @param {Array} formats \n  An  array of formats to validate\n  */  \n  getValidFormats(formats) {\n    const supportedFormats = Object.values(ColorFormats);\n    let validFormats = [];\n    formats.forEach(function(value){\n      if(supportedFormats.indexOf(value) !== -1) {\n        validFormats.push(value);\n      }\n    });\n    return validFormats;\n  }\n\n  /**\n  Utility function to convert a color into a desired format.\n  @param {String} color \n  The color string\n  @param {String} format\n  A color format\n  */  \n  formatColorString(color, format) {\n    const hue = this.getHue(color);\n    if(format === ColorFormats.HSV) {\n      return this.toHsvString(hue, color);\n    }\n    else if(format === ColorFormats.HSL) {\n      return this.toHslString(hue, color);\n    } \n    else {\n      return new TinyColor(color).toString(format);\n    }\n  }\n    \n}\n\nconst colorUtil = new ColorUtil();\nexport default colorUtil;\n ",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 953,
    "kind": "class",
    "name": "ColorUtil",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "pseudoExport": true,
    "undocument": true,
    "interface": false
  },
  {
    "__docId__": 954,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 17,
    "undocument": true
  },
  {
    "__docId__": 955,
    "kind": "method",
    "name": "toHslString",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#toHslString",
    "access": "public",
    "description": "Utility function to convert a color to Hsl string.",
    "lineNumber": 26,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hue",
        "description": "The hue value  which is preserved in color conversion."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "colorString",
        "description": "The color string"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 956,
    "kind": "method",
    "name": "toHsvString",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#toHsvString",
    "access": "public",
    "description": "Utility function to convert a color to Hsv string.",
    "lineNumber": 40,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "hue",
        "description": "The hue value  which is preserved in color conversion."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "colorString",
        "description": "The color string"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 957,
    "kind": "method",
    "name": "extractHsv",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#extractHsv",
    "access": "public",
    "description": "Utility function to extract  h,s and v from a color string.",
    "lineNumber": 51,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "colorString",
        "description": "The color string"
      }
    ],
    "return": {
      "types": [
        "{\"h\": *, \"s\": *, \"v\": *}"
      ]
    }
  },
  {
    "__docId__": 958,
    "kind": "method",
    "name": "getHue",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#getHue",
    "access": "public",
    "description": "Utility function to extract hue.",
    "lineNumber": 68,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "colorString",
        "description": "The color string"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 959,
    "kind": "method",
    "name": "getValidFormats",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#getValidFormats",
    "access": "public",
    "description": "Utility function to validate given formats in supported formats and return a list of formats.\nAny invalid/unsupported format is ignored.",
    "lineNumber": 86,
    "params": [
      {
        "nullable": null,
        "types": [
          "Array"
        ],
        "spread": false,
        "optional": false,
        "name": "formats",
        "description": "An  array of formats to validate"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 960,
    "kind": "method",
    "name": "formatColorString",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil#formatColorString",
    "access": "public",
    "description": "Utility function to convert a color into a desired format.",
    "lineNumber": 104,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "color",
        "description": "The color string"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "format",
        "description": "A color format"
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 961,
    "kind": "variable",
    "name": "colorUtil",
    "memberof": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~colorUtil",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{colorUtil}",
    "description": null,
    "lineNumber": 120,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-component-colorpicker/src/scripts/ColorUtil.js~ColorUtil"
      ]
    }
  },
  {
    "__docId__": 962,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport accessibilityState from '../templates/accessibilityState';\nimport {BaseComponent} from '../../../coral-base-component';\nimport ColumnViewCollection from './ColumnViewCollection';\nimport isInteractiveTarget from './isInteractiveTarget';\nimport selectionMode from './selectionMode';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-MillerColumns';\n\nconst scrollTo = (element, to, duration, scrollCallback) => {\n  if (duration <= 0) {\n    if (scrollCallback) {\n      scrollCallback();\n    }\n    return;\n  }\n\n  const difference = to - element.scrollLeft;\n  const perTick = difference / duration * 10;\n\n  window.setTimeout(() => {\n    element.scrollLeft = element.scrollLeft + perTick;\n    if (element.scrollLeft === to) {\n      if (scrollCallback) {\n        scrollCallback();\n      }\n    } else {\n      scrollTo(element, to, duration - 10, scrollCallback);\n    }\n  }, 10);\n};\n\n/**\n @class Coral.ColumnView\n @classdesc A ColumnView component to display and allow users to browse and select items in a dynamic tree structure\n (e.g. a filesystem or multi-level navigation).\n @htmltag coral-columnview\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ColumnView = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Content zone\n    this._elements = {\n      accessibilityState: this.querySelector('span[handle=\"accessibilityState\"]')\n    };\n\n    if (!this._elements.accessibilityState) {\n      // Templates\n      accessibilityState.call(this._elements, {commons});\n      this._elements.accessibilityState.removeAttribute('aria-hidden');\n      this._elements.accessibilityState.hidden = true;\n    }\n\n    // Events\n    this._delegateEvents({\n      // Prevents text selection while selecting multiple items\n      'global:keyup': '_onGlobalKeyUp',\n      'global:keydown': '_onGlobalKeyDown',\n\n      'key:up': '_onKeyUp',\n      'key:down': '_onKeyDown',\n      'key:right': '_onKeyRight',\n      'key:left': '_onKeyLeft',\n      'key:shift+up': '_onKeyShiftAndUp',\n      'key:shift+down': '_onKeyShiftAndDown',\n      'key:space': '_onKeySpace',\n      'key:control+a': '_onKeyCtrlA',\n      'key:command+a': '_onKeyCtrlA',\n      'key:control+shift+a': '_onKeyCtrlShiftA',\n      'key:command+shift+a': '_onKeyCtrlShiftA',\n      'key:esc': '_onKeyCtrlShiftA',\n\n      'capture:focus coral-columnview-item': '_onItemFocus',\n\n      'mousedown coral-columnview-item': '_onItemMouseDown',\n      'mouseup coral-columnview-item': '_onItemMouseUp',\n\n      // column events\n      'coral-columnview-column:_loaditems': '_onColumnLoadItems',\n      'coral-columnview-column:_activeitemchanged': '_onColumnActiveItemChanged',\n      'coral-columnview-column:_selecteditemchanged': '_onColumnSelectedItemChanged'\n    });\n\n    // Defaults\n    this._oldActiveItem = null;\n    this._oldSelection = [];\n\n    // default value of inner flag to process events\n    this._bulkSelectionChange = false;\n\n    // initializes the mutation observer that used to detect when new items are added or removed\n    this._observer = new MutationObserver(this._handleMutation.bind(this));\n    this._observer.observe(this, {\n      // only watch the childList, items will tell us if selected/value/content changes\n      childList: true\n    });\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n    this.columns._startHandlingItems(true);\n  }\n\n  /**\n   Collection that holds all the columns inside the ColumnView.\n\n   @type {ColumnViewCollection}\n   @readonly\n   */\n  get columns() {\n    // constructs the collection on first request\n    if (!this._columns) {\n      this._columns = new ColumnViewCollection({\n        host: this,\n        itemTagName: 'coral-columnview-column',\n        onlyHandleChildren: true\n      });\n    }\n\n    return this._columns;\n  }\n\n  /**\n   Collection used to represent the coral-columnview-item across all columns.\n\n   @type {ColumnViewCollection}\n   @readonly\n\n   @private\n   */\n  get items() {\n    // constructs the collection on first request\n    if (!this._items) {\n      this._items = new ColumnViewCollection({\n        host: this,\n        itemTagName: 'coral-columnview-item'\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Selection mode of the ColumnView. See {@link ColumnViewSelectionModeEnum}.\n\n   @type {String}\n   @default ColumnViewSelectionModeEnum.NONE\n   @htmlattribute selectionmode\n   @htmlattributereflected\n   */\n  get selectionMode() {\n    return this._selectionMode || selectionMode.NONE;\n  }\n\n  set selectionMode(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(selectionMode)(value) && value || selectionMode.NONE;\n\n    this._reflectAttribute('selectionmode', value);\n    \n    if(validate.valueMustChange(this._selectionMode, value)) {\n      this._selectionMode = value;\n\n      // propagates the selection mode to the columns\n      let columns = this.columns.getAll();\n      columns.forEach((item) => {\n        item.setAttribute('_selectionmode', value);\n      });\n  \n      this.classList.remove(`${CLASSNAME}--selection`);\n  \n      if (value !== selectionMode.NONE) {\n        this.classList.add(`${CLASSNAME}--selection`);\n      }\n  \n      // @a11y\n      this.setAttribute('aria-multiselectable', value === selectionMode.MULTIPLE);\n    }\n  }\n\n  /**\n   First selected item of the ColumnView.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.selectionMode !== selectionMode.NONE ? this.items._getFirstSelected() : null;\n  }\n\n  /**\n   Array containing the set selected items. The items will match only one column since selection across columns is\n   not allowed.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.selectionMode !== selectionMode.NONE ? this.items._getAllSelected() : [];\n  }\n\n  /**\n   Active Item that corresponds to the last item in the path.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get activeItem() {\n    return this.items._getAllActive().pop() || null;\n  }\n\n  /** @private */\n  _onColumnActiveItemChanged(event) {\n    // this is a private event and should not leave the column view\n    event.stopImmediatePropagation();\n\n    // ignores event handling due to bulk select operation\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    const column = event.target;\n\n    // clears the internal selection cursor\n    this._handleKeyboardMultiselect(null);\n\n    this._bulkSelectionChange = true;\n\n    if (!event.detail.activeItem) {\n      // all items to the right must be removed. we do this at the end to be able to extract the values before\n      // removing everything\n      this._afterItemSelectedInColumn(column);\n    } else {\n      // when there is an active item, selection must not exist\n      this.items._deselectAllExcept();\n\n      // we need to deactivate every item to the right of the new active item to keep a correct DOM representation\n      let nextColumn = column.nextElementSibling;\n      while (nextColumn) {\n        // We ignore preview columns\n        if (nextColumn.tagName === 'CORAL-COLUMNVIEW-COLUMN' && nextColumn.items) {\n          nextColumn.items._deactivateAll();\n        }\n\n        nextColumn = nextColumn.nextElementSibling;\n      }\n    }\n\n    this._bulkSelectionChange = false;\n\n    // we trigger the appropiate events\n    this._validateColumnViewChange();\n  }\n\n  /**\n   Requests external data to be loaded.\n\n   @emits {coral-columnview:loaditems}\n\n   @private\n   */\n  _onColumnLoadItems(event) {\n    // this is a private event and should not leave the column view\n    event.stopImmediatePropagation();\n\n    this._updateAriaLevel(event.target);\n    this._ensureTabbableItem();\n\n    // triggers an event to indicate more data could be loaded\n    this.trigger('coral-columnview:loaditems', {\n      column: event.target,\n      start: event.detail.start,\n      item: event.detail.item\n    });\n  }\n\n  /**\n   Handle when first selectable item is added and make sure it is tabbable.\n   @param {HTMLElement} [item]\n   @private\n   */\n  _onItemAdd() {\n    window.requestAnimationFrame(() => this._ensureTabbableItem());\n  }\n\n  /**\n   Handle when item is removed, make sure that at least one element is tabbable, or if there are no items, and add listener to handle when item is added.\n   @param {HTMLElement} [item]\n   Item that was removed.\n   @private\n   */\n  _onItemRemoved() {\n    window.requestAnimationFrame(() => this._ensureTabbableItem());\n  }\n\n  /* @private */\n  _ensureTabbableItem() {\n    this._vent.off('coral-collection:add', this._onItemAdd);\n    this._vent.off('coral-collection:remove', this._onItemRemoved);\n    // Ensures that item will receive focus\n    if (!this.selectedItem && !this.activeItem) {\n      const selectableItems = this.items._getSelectableItems();\n      // If there are no selectable items, stop listening for items being removed and start listening for the next item added.\n      if (!selectableItems.length) {\n        this._vent.off('coral-collection:remove', this._onItemRemoved);\n        this._vent.on('coral-collection:add', this._onItemAdd);\n      } else {\n        // Otherwise, if there is a selectable item, make sure it has a tabIndex.\n        selectableItems[0].tabIndex = 0;\n        // Listen for item removal so that we can handle the edge case where all items have been removed.\n        this._vent.on('coral-collection:remove', this._onItemRemoved);\n      }\n    } else if (this.selectedItem && this.selectedItem.tabIndex !== 0) {\n      // If the selectedItem is not tabbable, make sure that it has tabIndex === 0\n      this.selectedItem.tabIndex = 0;\n    } else if (this.activeItem && this.activeItem.tabIndex !== 0) {\n      // If the activeItem is not tabbable, make sure that it has tabIndex === 0\n      this.activeItem.tabIndex = 0;\n    }\n  }\n\n  /** @private */\n  _onColumnSelectedItemChanged(event) {\n    // this is a private event and should not leave the column view\n    event.stopImmediatePropagation();\n\n    // ignores event handling due to bulk select operation\n    if (this._bulkSelectionChange || this.selectionMode === selectionMode.NONE) {\n      return;\n    }\n\n    this._bulkSelectionChange = true;\n    // we need to deselect any other selection that is not part of the same column\n    this._oldSelection.forEach((el) => {\n      if (event.detail.selection.indexOf(el) === -1) {\n        el.removeAttribute('selected');\n      }\n    });\n    this._bulkSelectionChange = false;\n\n    // we trigger the appropiate events\n    this._validateColumnViewChange();\n  }\n\n  /** @private */\n  _onGlobalKeyUp(event) {\n    // removes the class to stop selection\n    if (event.keyCode === 16 && !isInteractiveTarget(event.target)) {\n      this.classList.remove('is-unselectable');\n    }\n  }\n\n  /** @private */\n  _onGlobalKeyDown(event) {\n    // adds a class that prevents the text selection, otherwise shift + click would select the text\n    if (event.keyCode === 16 || !isInteractiveTarget(event.target)) {\n      this.classList.add('is-unselectable');\n    }\n  }\n\n  /** @private */\n  _onKeyShiftAndUp(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't select items when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.selectionMode === selectionMode.NONE) {\n      this._onKeyUp(event);\n      return;\n    }\n\n    // using _oldSelection since it should be equivalent to this.items._getSelectedItems() but faster\n    const oldSelectedItems = this._oldSelection;\n\n    this._isKeyBoardMultiselect = true;\n\n    // first make sure to select the active item as we want to multiselect\n    if (oldSelectedItems.length === 0) {\n      const activeItem = this.activeItem;\n\n      if (activeItem) {\n        activeItem.setAttribute('selected', '');\n      }\n    }\n\n    // gets all the selected items of the active column. calling _getSelectedItems() will include the active item\n    // if it was selected\n    const selectedItems = this.items._getAllSelected();\n    // reference of the last selected item to know the direction of the selection while using the multiselection\n    const lastSelected = this._lastSelected;\n\n    let selectedItem;\n    // when no previous selection is stored we need to initialize it with the current information\n    if (!lastSelected) {\n      selectedItem = selectedItems[0].previousElementSibling;\n      // selects the item\n      selectedItem.setAttribute('selected', '');\n    } else if (lastSelected.item) {\n      selectedItem = lastSelected.item;\n\n      // we have reached the upper selection limit\n      if (selectedItem.matches(':first-child')) {\n        this._isKeyBoardMultiselect = false;\n        return;\n      }\n\n      if (!lastSelected.direction || lastSelected.direction === 'up') {\n        selectedItem = selectedItem.previousElementSibling;\n        selectedItem.setAttribute('selected', '');\n      } else {\n        if (selectedItem !== lastSelected.firstSelectedItem) {\n          selectedItem.removeAttribute('selected');\n        } else {\n          // switches the direction if this was the last item selected\n          lastSelected.direction = 'up';\n        }\n\n        selectedItem = selectedItem.previousElementSibling;\n        selectedItem.setAttribute('selected', '');\n      }\n    }\n\n    // stores the reference and direction to be able to perform the multiple selection correctly\n    this._lastSelected = {\n      item: selectedItem,\n      direction: lastSelected && lastSelected.direction ? lastSelected.direction : 'up',\n      firstSelectedItem: lastSelected && lastSelected.firstSelectedItem ?\n        lastSelected.firstSelectedItem :\n        selectedItem.nextElementSibling\n    };\n\n    if (selectedItem && selectedItem !== document.activeElement) {\n      selectedItem.focus();\n    }\n\n    this._isKeyBoardMultiselect = false;\n  }\n\n  /** @private */\n  _onKeyShiftAndDown(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't select items when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.selectionMode === selectionMode.NONE) {\n      this._onKeyDown(event);\n      return;\n    }\n\n    // using _oldSelection since it should be equivalent to this.items._getSelectedItems() but faster\n    const oldSelectedItems = this._oldSelection;\n\n    this._isKeyBoardMultiselect = true;\n\n    // first make sure to select the active item as we want to multiselect\n    if (oldSelectedItems.length === 0) {\n      const activeItem = this.activeItem;\n\n      if (activeItem) {\n        activeItem.setAttribute('selected', '');\n      }\n    }\n\n    // gets all the selected items of the active column. calling _getSelectedItems() will include the active item\n    // if it was selected\n    const selectedItems = this.items._getAllSelected();\n\n    // reference of the last selected item to know the direction of the selection while using the multiselection\n    const lastSelected = this._lastSelected;\n\n    let selectedItem;\n    // when no previous selection is stored we need to initialize it with the current information\n    if (!lastSelected) {\n      selectedItem = selectedItems[selectedItems.length - 1].nextElementSibling;\n      // selects the item\n      selectedItem.setAttribute('selected', '');\n    } else if (lastSelected.item) {\n      selectedItem = lastSelected.item;\n\n      // we have reached the lower selection limit\n      if (selectedItem.matches(':last-child')) {\n        this._isKeyBoardMultiselect = false;\n        return;\n      }\n\n      if (!lastSelected.direction || lastSelected.direction === 'down') {\n        selectedItem = selectedItem.nextElementSibling;\n        selectedItem.setAttribute('selected', '');\n      } else {\n        if (selectedItem !== lastSelected.firstSelectedItem) {\n          selectedItem.removeAttribute('selected');\n        } else {\n          // switches the direction if this was the last item selected\n          lastSelected.direction = 'down';\n        }\n\n        selectedItem = selectedItem.nextElementSibling;\n        selectedItem.setAttribute('selected', '');\n      }\n    }\n\n    // stores the reference and direction to be able to perform the multiple selection correctly\n    this._lastSelected = {\n      item: selectedItem,\n      direction: lastSelected && lastSelected.direction ? lastSelected.direction : 'down',\n      firstSelectedItem: lastSelected && lastSelected.firstSelectedItem ?\n        lastSelected.firstSelectedItem :\n        selectedItem.previousElementSibling\n    };\n\n    if (selectedItem && selectedItem !== document.activeElement) {\n      selectedItem.focus();\n    }\n\n    this._isKeyBoardMultiselect = false;\n  }\n\n  /** @private */\n  _onKeyUp(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't navigate items when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // selection will win over active buttons, because they are the right most item. using _oldSelection since it\n    // should be equivalent to this.items._getSelectedItems() but faster\n    const selectedItems = this._oldSelection;\n\n    let item;\n    if (selectedItems.length !== 0) {\n      const selectedItem = matchedTarget;\n\n      item = selectedItem.previousElementSibling;\n      if (!item) {\n        item = selectedItem;\n      }\n    }\n      // when there is no active item to select, we get the last item of the column. this way users can interact with\n    // the column view when there is nothing selected or activated\n    else if (this._oldActiveItem === null) {\n      item = this.items._getLastSelectable();\n    } else {\n      item = this._oldActiveItem.previousElementSibling;\n    }\n\n    // we use click instead of selected to force the deselection of the other items\n    if (item && item !== document.activeElement) {\n      item.focus();\n      if (this.selectionMode === selectionMode.NONE ||\n        selectedItems.length === 0 ||\n        // For use case in cascading schema editor,\n        // where the focused item is not in the same column as the selected items,\n        // we should activate the item so that coral-columnview:activeitemchange gets called.\n        item.parentElement !== selectedItems[0].parentElement) {\n        item.click();\n      }\n    }\n  }\n\n  /** @private */\n  _onKeyDown(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't navigate items when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // selection will win over active buttons, because they are the right most item. using _oldSelection since it\n    // should be equivalent to this.items._getSelectedItems() but faster\n    const selectedItems = this._oldSelection;\n\n    let item;\n    if (selectedItems.length !== 0) {\n      const selectedItem = matchedTarget;\n\n      item = selectedItem.nextElementSibling;\n\n      // when\n      if (!item) {\n        item = matchedTarget;\n      }\n    }\n      // when there is no active item to select, we get the first item of the column. this way users can interact with\n    // the column view when there is nothing selected or activated\n    else if (this._oldActiveItem === null) {\n      item = this.items._getFirstSelectable();\n    } else {\n      item = this._oldActiveItem.nextElementSibling;\n    }\n\n    // we use click instead of selected to force the deselection of the other items\n    if (item && item !== document.activeElement) {\n      item.focus();\n      if (this.selectionMode === selectionMode.NONE ||\n        selectedItems.length === 0 ||\n        // For use case in cascading schema editor,\n        // where the focused item is not in the same column as the selected items,\n        // we should activate the item so that coral-columnview:activeitemchange gets called.\n        item.parentElement !== selectedItems[0].parentElement) {\n        item.click();\n      }\n    }\n  }\n\n  /** @private */\n  _onKeyRight(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    if (matchedTarget.variant !== ColumnView.Item.variant.DRILLDOWN) {\n      return false;\n    }\n\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // we can only navigate right when there is a column on the right side to navigate to\n    let nextColumn;\n    // using _oldSelection since it should be equivalent to this.items._getSelectedItems() but faster\n    let selectedItems = this._oldSelection;\n\n    // when there is an active item, we use the item containing the active item as reference\n    if (matchedTarget) {\n      nextColumn = matchedTarget.closest('coral-columnview-column').nextElementSibling;\n    }\n    // otherwise when there is selection, we use the item containing the selected items as reference\n    else if (selectedItems.length !== 0) {\n      nextColumn = selectedItems[0].closest('coral-columnview-column').nextElementSibling;\n    }\n\n    if (nextColumn && nextColumn.tagName === 'CORAL-COLUMNVIEW-COLUMN') {\n      // we need to make sure the column is initialized\n      commons.ready(nextColumn, () => this._focusAndActivateFirstSelectableItem(nextColumn));\n    }\n  }\n\n  /** @private */\n  _onKeyLeft(event) {\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // we can only navigate left when there is a column on the left side to navigate to\n    let previousColumn;\n    // using _oldSelection since it should be equivalent to this.items._getSelectedItems() but faster\n    const selectedItems = this._oldSelection;\n\n    // when there is selection, we use the previous column as a reference\n    if (selectedItems.length !== 0) {\n      previousColumn = selectedItems[0].closest('coral-columnview-column').previousElementSibling;\n    }\n    // otherwise we use the activeItems as a reference\n    else if (this.activeItem) {\n      const col = this.activeItem.closest('coral-columnview-column');\n      previousColumn = event.target.closest('coral-columnview-preview') ? col : col.previousElementSibling;\n    }\n\n    if (previousColumn && previousColumn.tagName === 'CORAL-COLUMNVIEW-COLUMN') {\n      // we need to make sure the column is initialized\n      const activeDescendant = previousColumn.activeItem || previousColumn.items._getFirstSelected() || previousColumn.items._getFirstSelectable();\n      if (activeDescendant && activeDescendant !== document.activeElement) {\n        activeDescendant.focus();\n        if (this.selectionMode === selectionMode.NONE ||\n          selectedItems.length === 0) {\n          activeDescendant.click();\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _onKeySpace(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't select item when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // using _oldSelection since it should be equivalent to this.items._getSelectedItems() but faster\n    const selectedItems = this._oldSelection;\n    let activeDescendant;\n\n    // when there is a selection, we need to activate the first item of the selection\n    if (selectedItems.length !== 0) {\n      activeDescendant = matchedTarget;\n      if (activeDescendant.hasAttribute('selected', '')) {\n        if (selectedItems.length === 1) {\n          activeDescendant.setAttribute('active', '');\n        } else {\n          activeDescendant.removeAttribute('selected', '');\n        }\n      } else {\n        activeDescendant.setAttribute('selected', '');\n      }\n    } else {\n      const activeItem = this.activeItem || matchedTarget;\n      // toggles the selection between active and selected\n      if (activeItem && this.selectionMode !== selectionMode.NONE) {\n        // select the item\n        activeItem.setAttribute('selected', '');\n        activeDescendant = activeItem;\n      }\n    }\n  }\n\n  /** @private */\n  _onKeyCtrlA(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't select item when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.selectionMode === selectionMode.MULTIPLE) {\n      const currentColumn = matchedTarget.closest('coral-columnview-column');\n      currentColumn.items._selectAll();\n    } else if (this.selectionMode === selectionMode.SINGLE) {\n      if (!matchedTarget.hasAttribute('selected')) {\n        matchedTarget.setAttribute('selected', '');\n      }\n    }\n  }\n\n  /** @private */\n  _onKeyCtrlShiftA(event) {\n    const matchedTarget = this._getRealMatchedTarget(event);\n\n    // don't select item when focus is within the preview\n    if (matchedTarget.closest('coral-columnview-preview') || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.selectionMode !== selectionMode.NONE) {\n      const currentColumn = matchedTarget.closest('coral-columnview-column');\n      currentColumn.items._deselectAndDeactivateAllExcept(matchedTarget);\n      if (!matchedTarget.hasAttribute('active')) {\n        matchedTarget.setAttribute('active', '');\n      }\n    }\n  }\n\n  /** @private */\n  _onItemFocus(event) {\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    const matchedTarget = this._getRealMatchedTarget(event);\n    if (!this.activeItem && !this._oldSelection.length && !matchedTarget._flagMouseDown) {\n      matchedTarget.setAttribute('active', '');\n    }\n    this.items._getSelectableItems().forEach(item => {\n      item.tabIndex = item === matchedTarget ? 0 : -1;\n    });\n\n    if (matchedTarget.contains(document.activeElement)) {\n      matchedTarget.focus();\n    }\n  }\n\n  /** @ignore */\n  _onItemMouseDown(event) {\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n    var matchedTarget = this._getRealMatchedTarget(event);\n    matchedTarget._flagMouseDown = true;\n  }\n\n  /** @ignore */\n  _onItemMouseUp(event) {\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n    var matchedTarget = this._getRealMatchedTarget(event);\n    delete matchedTarget._flagMouseDown;\n  }\n\n  /** @ignore */\n  _updateAriaLevel(column) {\n    const colIndex = this.columns.getAll().indexOf(column);\n    const level = colIndex + 1;\n    if (column.items) {\n      let items = column.items.getAll();\n      items.filter((item, index) => {\n        item.setAttribute('aria-posinset', index + 1);\n        item.setAttribute('aria-setsize', items.length);\n        return !item.hasAttribute('aria-level');\n      }).forEach((item) => {\n        item.setAttribute('aria-level', level);\n      });\n    }\n\n    // root column has role=\"presentation\"\n    if (colIndex === 0) {\n      column.setAttribute('role', 'presentation');\n      // and should not be labeled.\n      return;\n    }\n\n    // Make sure the column group has a label so that it can be navigated with VoiceOver\n    if (!column.hasAttribute('aria-labelledby')) {\n      if (!column.hasAttribute('aria-label')) {\n        column.setAttribute('aria-label', (this.getAttribute('aria-label') || '…'));\n      }\n    } else if (column.getAttribute('aria-label') === (this.getAttribute('aria-label') || '…')) {\n      column.removeAttribute('aria-label');\n    }\n  }\n\n  /** @private */\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  /** @private */\n  _handleKeyboardMultiselect(newSelectedItem) {\n    if (!this._isKeyBoardMultiselect) {\n      this._lastSelected = undefined;\n\n      // if there is a new selected item save this (but without direction info)\n      if (newSelectedItem) {\n        this._lastSelected = {\n          item: newSelectedItem,\n          direction: null,\n          firstSelectedItem: newSelectedItem\n        };\n      }\n    }\n  }\n\n  /**\n   Scrolls the given {@link Coral.ColumnView.Column} into view.\n\n   @param {HTMLElement} column\n   The column that needs to be scrolled into view.\n   @param {Boolean} clearEmptyColumns\n   Remove empty columns once animation is done.\n   @param {Boolean} triggerEvent\n\n   @private\n   */\n  _scrollColumnIntoView(column, clearEmptyColumns, triggerEvent) {\n    // @todo: improve animation effect when key is kept press\n    let left = 0;\n    let duration;\n\n    // we return if the column is not inside the current column view\n    if (!this.contains(column)) {\n      return;\n    }\n\n    // make sure to clear columns next to this column if animation is done\n    const completeCallback = () => {\n      if (clearEmptyColumns) {\n        this._removeEmptyColumnsWithSmoothTransition(triggerEvent);\n      }\n    };\n\n    // scroll right to the given column\n    if (column.getBoundingClientRect().left + column.offsetWidth >= this.offsetWidth) {\n      let next = column.nextElementSibling;\n      while (next) {\n        next.parentNode.removeChild(next);\n        next = column.nextElementSibling;\n      }\n\n      left = this.scrollWidth - this.offsetWidth;\n      duration = left - this.scrollLeft;\n      scrollTo(this, left, duration, completeCallback);\n    } else if (clearEmptyColumns) {\n      this._removeEmptyColumnsWithSmoothTransition(triggerEvent);\n    }\n  }\n\n  /**\n   Handling of the column view after selecting an item.\n\n   @param {HTMLElement} column\n\n   @private\n   */\n  _afterItemSelectedInColumn(column) {\n    // @todo: emptying the columns allows them to be queried\n    this._emptyColumnsNextToColumn(column);\n    this._scrollColumnIntoView(column, true, true);\n  }\n\n  /**\n   Empties all the columns to the right of the provided column.\n\n   @param {HTMLElement} column\n\n   @private\n   */\n  _emptyColumnsNextToColumn(column) {\n    if (column !== null) {\n      let next = column.nextElementSibling;\n      while (next && next.innerHTML.length) {\n        next.innerHTML = '';\n        next = next.nextElementSibling;\n      }\n    }\n  }\n\n  /**\n   Remove all empty columns with a smooth transition. Optionally the navigate event is triggered when all the extra\n   columns are removed from the DOM.\n\n   @param {Boolean} triggerEvent\n   Whether the navigate event must be triggered.\n\n   @private\n   */\n  _removeEmptyColumnsWithSmoothTransition(triggerEvent) {\n    // fade width of empty items to 0 before removing the columns (for better usability while navigating)\n    const emptyColumns = Array.prototype.filter.call(this.querySelectorAll('coral-columnview-column, coral-columnview-preview'), el => !el.firstChild);\n\n    if (emptyColumns.length) {\n      emptyColumns.forEach((column, i) => {\n        column.style.visibility = 'hidden';\n        column.classList.add('is-collapsing');\n        commons.transitionEnd(column, () => {\n          column.remove();\n          if (i === emptyColumns.length - 1 && triggerEvent) {\n            this._validateNavigation(this.columns.last());\n          }\n        });\n        column.style.width = 0;\n      });\n    } else if (triggerEvent) {\n      this._validateNavigation(this.columns.last());\n    }\n  }\n\n  /** @private */\n  _triggerCollectionEvents(addedNodes, removedNodes) {\n    let item;\n    const addedNodesCount = addedNodes.length;\n    for (let i = 0 ; i < addedNodesCount ; i++) {\n      item = addedNodes[i];\n      if (this.activeItem) {\n        // @a11y add aria-owns attribute to active item to express relationship of added column to the active item\n        this.activeItem.setAttribute('aria-owns', item.id);\n\n        // @a11y column or preview should be labelled by active item\n        item.setAttribute('aria-labelledby', this.activeItem.content.id);\n\n        // @a11y preview should provide description for active item\n        if (item.tagName === 'CORAL-COLUMNVIEW-PREVIEW') {\n          this.activeItem.setAttribute('aria-describedby', item.id);\n        }\n      }\n\n      if (item.tagName === 'CORAL-COLUMNVIEW-COLUMN') {\n        // we use the property since the item may not be ready\n        item.setAttribute('_selectionmode', this.selectionMode);\n        this.trigger('coral-collection:add', {item});\n        this._updateAriaLevel(item);\n      }\n    }\n\n    // @todo: check if special handling is needed when selected column is removed\n    const removedNodesCount = removedNodes.length;\n    for (let j = 0 ; j < removedNodesCount ; j++) {\n      item = removedNodes[j];\n      // @todo: should I handle it specially if it was selected? should a selection and active event be triggered?\n      if (item.tagName === 'CORAL-COLUMNVIEW-COLUMN') {\n        this.trigger('coral-collection:remove', {item});\n      }\n    }\n  }\n\n  /** @private */\n  _setStateFromDOM() {\n    // @todo: should I trigger change events?\n    // initial state of the columnview\n    this._oldActiveItem = this.activeItem;\n    this._oldSelection = this.selectedItems;\n\n    this._ensureTabbableItem();\n\n    if (this.columns) {\n      var columns = this.columns.getAll();\n      var self = this;\n      columns.forEach(function (column) {\n        self._updateAriaLevel(column);\n      });\n    }\n  }\n\n  /** @private */\n  _handleMutation(mutations) {\n    const mutationsCount = mutations.length;\n    for (let i = 0 ; i < mutationsCount ; i++) {\n      const mutation = mutations[i];\n\n      // we handle the collection events\n      this._triggerCollectionEvents(mutation.addedNodes, mutation.removedNodes);\n    }\n\n    // sets the internal state based on the existing columns\n    this._setStateFromDOM();\n  }\n\n  /**\n   Determines if something of the internal state of the component has changed. Active item event is always triggered\n   first and then the selection event.\n\n   @private\n   */\n  _validateColumnViewChange() {\n    // we evaluate first the active event since we always need to trigger active first and then selection\n    const activeItem = this.activeItem;\n    const oldActiveItem = this._oldActiveItem;\n\n    // same column events are only triggered if the active item changed, otherwise they are ignored\n    if (activeItem !== oldActiveItem) {\n      this.trigger('coral-columnview:activeitemchange', {activeItem, oldActiveItem});\n\n      // we cache the old active item to be able to report correct change events\n      this._oldActiveItem = activeItem;\n    }\n\n    // when there is no selection we avoid triggering any change event but we do not stop items from having the\n    // selected attribute\n    if (this.selectionMode === selectionMode.NONE) {\n      return;\n    }\n\n    const newSelection = this.selectedItems;\n    const oldSelection = this._oldSelection || [];\n\n    // use first newly selected item for new selection\n    const newSelectedItems = newSelection.filter((item) => oldSelection.indexOf(item) === -1);\n    this._handleKeyboardMultiselect(newSelectedItems.length > 0 ? newSelectedItems[0] : null);\n\n    if (this._arraysAreDifferent(newSelection, oldSelection)) {\n      this.trigger('coral-columnview:change', {\n        selection: newSelection,\n        oldSelection: oldSelection\n      });\n\n      // changes the old selection array since we selected something new\n      this._oldSelection = newSelection;\n\n      // announce the selection state for the focused item\n      this._announceActiveElementState();\n    }\n  }\n\n  /**\n   Triggers the navigation event. Navigation would happen when a) a new column is added, and it is ready to be\n   used or b) columns are removed and the active changed. In case the column is actually a preview column, the event\n   will only be triggered when there is no selection (meanning a real navigation was performed).\n\n   @param {HTMLElement} column\n   Last column of the ColumnView.\n\n   @emits {coral-columnview:navigate}\n\n   @private\n   */\n  _validateNavigation(column) {\n    // we use _oldSelection because it is faster\n    if (column.tagName === 'CORAL-COLUMNVIEW-PREVIEW' && this._oldSelection.length !== 0) {\n      return;\n    }\n\n    this.trigger('coral-columnview:navigate', {\n      activeItem: this.activeItem,\n      column: column\n    });\n  }\n\n  /* @private */\n  _announceActiveElementState() {\n    // @a11y Add live region element to ensure announcement of selected state\n    const accessibilityState = this._elements.accessibilityState;\n\n    // @a11y accessibility state string should announce in document lang, rather than item lang.\n    accessibilityState.setAttribute('lang', i18n.locale);\n\n    // @a11y append live region content element\n    if (!this.contains(accessibilityState)) {\n      this.appendChild(accessibilityState);\n    }\n\n    // utility method to clean up accessibility state\n    function resetAccessibilityState() {\n      accessibilityState.hidden = true;\n      accessibilityState.setAttribute('aria-live', 'off');\n      accessibilityState.innerHTML = '';\n    }\n\n    resetAccessibilityState();\n\n    if (this._addTimeout || this._removeTimeout) {\n      clearTimeout(this._addTimeout);\n      clearTimeout(this._removeTimeout);\n    }\n\n    // we use setTimeout instead of nextFrame to give screen reader\n    // more time to respond to live region update in order to announce\n    // complete text content when the state changes.\n    this._addTimeout = window.setTimeout(() => {\n      const activeElement = document.activeElement.closest('coral-columnview-item') || document.activeElement;\n\n      if (!this.contains(activeElement) || activeElement.tagName !== 'CORAL-COLUMNVIEW-ITEM') {\n        return;\n      }\n\n      const span = document.createElement('span');\n      const contentSpan = document.createElement('span');\n      const lang = !activeElement.hasAttribute('lang') && activeElement.closest('[lang]') ? activeElement.closest('[lang]').getAttribute('lang') : activeElement.getAttribute('lang');\n      if (lang && lang !== i18n.locale) {\n        contentSpan.setAttribute('lang', lang);\n      }\n      contentSpan.innerText = activeElement._elements.content.innerText;\n      span.appendChild(contentSpan);\n      span.appendChild(\n        document.createTextNode(\n          i18n.get(activeElement.selected ? ', checked' : ', unchecked')\n        )\n      );\n      accessibilityState.hidden = false;\n      accessibilityState.setAttribute('aria-live', 'assertive');\n      accessibilityState.appendChild(span);\n\n      // give screen reader 2 secs before clearing the live region, to provide enough time for announcement\n      this._removeTimeout = window.setTimeout(() => {\n        resetAccessibilityState();\n        if(accessibilityState.parentNode) {\n          this._elements.accessibilityState = accessibilityState.parentNode.removeChild(accessibilityState);\n        }\n      }, 2000);\n    }, 20);\n  }\n\n  /**\n   * Helper function to extract the correct matchedTarget from the event.\n   *\n   * Tests can interact with ColumnView directly where the key events are triggered on\n   * the ColumnView itself. In that case the event.matchedTarget point to the ColumnView\n   * instead of the ColumnViewItem, in other word the active or selected element.\n   *\n   * @private\n   **/\n  _getRealMatchedTarget(event) {\n    if (event.matchedTarget.nodeName !== 'CORAL-COLUMNVIEW') {\n      return event.matchedTarget;\n    }\n    if (event.matchedTarget.contains(document.activeElement) && document.activeElement.nodeName === 'CORAL-COLUMNVIEW-ITEM') {\n      return document.activeElement;\n    }\n    if (event.matchedTarget.selectedItem) {\n      return event.matchedTarget.selectedItem;\n    }\n    if (event.matchedTarget.activeItem) {\n      return event.matchedTarget.activeItem;\n    }\n  }\n\n  _focusAndActivateFirstSelectableItem(column) {\n    let item;\n    let selectedItems = this.selectedItems;\n\n    if (column.items) {\n      item = column.items._getFirstSelectable();\n    } else if (column.tagName === 'CORAL-COLUMNVIEW-PREVIEW') {\n      item = selectedItems[0] || this.activeItem;\n    }\n\n    if (item && item !== document.activeElement) {\n      item.focus();\n      if (this.selectionMode === selectionMode.NONE ||\n        this._oldSelection.length === 0 ||\n        selectedItems.length === 0 ||\n        // For use case in cascading schema editor,\n        // where the focused item is not in the same column as the selected items,\n        // we should activate the item so that coral-columnview:activeitemchange gets called.\n        item.parentElement !== selectedItems[0].parentElement) {\n        item.click();\n      }\n    }\n  }\n\n  /** @ignore */\n  focus() {\n    // selected items go first because there is no active item in a column with selection\n    const item = this.selectedItems[0] || this.activeItem;\n    if (item && item !== document.activeElement) {\n      item.focus();\n    }\n  }\n\n  /**\n   Sets the next column given a reference column. This will handle cleaning the DOM and removing any columns as\n   required.\n\n   @param {HTMLElement} newColumn\n   The new column to add to the column view. It will be placed next to the <code>referenceColumn</code> if\n   provided.\n   @param {HTMLElement} referenceColumn\n   The column that will be used as a reference to place the new column. This column needs to be already inside the\n   DOM.\n   @param {Boolean} [scrollToColumn = true]\n   Whether the columnview show scroll to have the <code>newColumn</code> visible.\n\n   @emits {coral-columnview:navigate}\n   */\n  setNextColumn(newColumn, referenceColumn, scrollToColumn) {\n    scrollToColumn = typeof scrollToColumn === 'undefined' || scrollToColumn;\n\n    const column = referenceColumn || null;\n\n    let columnReplacedContainedFocus = false;\n\n    // handles the case where the first column needs to be added\n    if (column === null || !this.contains(column)) {\n      this.appendChild(newColumn);\n    } else {\n      const nextColumn = column.nextElementSibling;\n\n      if (nextColumn) {\n        columnReplacedContainedFocus = nextColumn.contains(document.activeElement);\n        this._emptyColumnsNextToColumn(column);\n        const before = nextColumn.nextElementSibling;\n        this.removeChild(nextColumn);\n        this.insertBefore(newColumn, before);\n      } else {\n        this.appendChild(newColumn);\n      }\n    }\n\n    // if we want to scroll to it, we need for it to be ready due to measurements\n    commons.ready(newColumn, () => {\n      if (scrollToColumn) {\n        // event is not triggered because it is handled separately\n        this._scrollColumnIntoView(newColumn, true, false);\n      }\n\n      // we notify that the columnview navigated and it is ready to be used\n      this._validateNavigation(newColumn);\n\n      // if the column the newColumn replaces contained focus, restore focus to an item in the newColumn\n      if (columnReplacedContainedFocus && !newColumn.contains(document.activeElement)) {\n        this._focusAndActivateFirstSelectableItem(newColumn);\n      }\n    });\n  }\n\n  /**\n   Returns {@link ColumnView} selection options.\n\n   @return {ColumnViewSelectionModeEnum}\n   */\n  static get selectionMode() {\n    return selectionMode;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      selectionmode: 'selectionMode'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'selectionmode'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // @a11y\n    this.setAttribute('role', 'tree');\n    // @a11y: the columnview needs to be focusable to handle a11y properly\n    this.tabIndex = -1;\n    // @a11y: the columnview should be labelled so that its entire content\n    // is not read as its accessibility name\n    if (!this.hasAttribute('aria-label') && !this.hasAttribute('aria-labelledby')) {\n      this.setAttribute('aria-label', i18n.get('Column View'));\n    }\n\n    // Default reflect attributes\n    if (!this._selectionMode) {\n      this._selectionMode = selectionMode.NONE;\n    }\n\n    // no need to wait for the mutation observers\n    this._setStateFromDOM();\n  }\n\n  /**\n   Triggered when additional items can be loaded into the {@link ColumnView}. This will happen when the current column can\n   still hold more items, when the user scrolls down the current column or when a new column needs to be loaded. If\n   <code>preventDefault()</code> is called, then a loading indicator will be shown.\n   {@link ColumnViewColumn#loading} should be set to false to indicate that the data has been successfully\n   loaded.\n\n   @typedef {CustomEvent} coral-columnview:loaditems\n\n   @property {ColumnViewColumn} detail.column\n   The column that is requesting more items. While doing pagination, it will become the target of the loaded items.\n   @property {Number} detail.start\n   Indicates the current amount of items in the <code>column</code> to do pagination. If <code>item</code> is\n   available, start will be 0 to denote that the column should be loaded from the start.\n   @property {ColumnViewItem} detail.item\n   The item that initialized the load. If item is provided, it means that a new column needs to be added after\n   the load is performed. In this scenario, <code>column</code> will be refer to the column that holds the item.\n   */\n\n  /**\n   Triggered when the selection inside the {@link ColumnViewColumn} changes. In case both the selection and the active item change,\n   the <code>coral-columnview:activeitemchange</code> will be triggered first.\n\n   @typedef {CustomEvent} coral-columnview:change\n\n   @property {ColumnViewColumn} detail.column\n   The column whose selection changed.\n   @property {ColumnViewItem|Array.<ColumnViewItem>} detail.selection\n   The new selection of the Column.\n   @property {ColumnViewItem|Array.<ColumnViewItem>} detail.oldSelection\n   The old selection of the Column.\n   */\n\n  /**\n   Triggered when the active item of the {@link ColumnViewColumn} changes.\n\n   @typedef {CustomEvent} coral-columnview:activeitemchange\n\n   @property {ColumnViewColumn} detail.column\n   The column whose active item has changed.\n   @property {ColumnViewItem} detail.activeItem\n   The currently active item of the column.\n   @property {ColumnViewItem} detail.oldActiveItem\n   The item of the column that was active before.\n   */\n\n  /**\n   Triggered when the {@link ColumnView} navigation is complete and the new columns are ready.\n\n   @typedef {CustomEvent} coral-columnview:navigate\n\n   @property {ColumnViewColumn} detail.column\n   The last Column of the ColumnView that is used to determine the path. If the navigate was triggered because a\n   new {@link ColumnViewColumn} was added, then it will match that column. In case the path was\n   reduced, the column will match the last column.\n   @property {ColumnViewItem} detail.activeItem\n   The currently active item of the ColumnView.\n   */\n});\n\nexport default ColumnView;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 963,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 964,
    "kind": "function",
    "name": "scrollTo",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~scrollTo",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "params": [
      {
        "name": "element",
        "types": [
          "*"
        ]
      },
      {
        "name": "to",
        "types": [
          "*"
        ]
      },
      {
        "name": "duration",
        "types": [
          "*"
        ]
      },
      {
        "name": "scrollCallback",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 965,
    "kind": "variable",
    "name": "ColumnView",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~ColumnView",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "A ColumnView component to display and allow users to browse and select items in a dynamic tree structure\n(e.g. a filesystem or multi-level navigation).",
    "lineNumber": 54,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColumnView component to display and allow users to browse and select items in a dynamic tree structure\n(e.g. a filesystem or multi-level navigation)."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview></coral-columnview>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 966,
    "kind": "typedef",
    "name": "coral-columnview:loaditems",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~coral-columnview:loaditems",
    "access": "public",
    "description": "Triggered when additional items can be loaded into the {@link ColumnView}. This will happen when the current column can\nstill hold more items, when the user scrolls down the current column or when a new column needs to be loaded. If\n<code>preventDefault()</code> is called, then a loading indicator will be shown.\n{@link ColumnViewColumn#loading} should be set to false to indicate that the data has been successfully\nloaded.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "ColumnViewColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The column that is requesting more items. While doing pagination, it will become the target of the loaded items."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.start",
        "description": "Indicates the current amount of items in the <code>column</code> to do pagination. If <code>item</code> is\navailable, start will be 0 to denote that the column should be loaded from the start."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The item that initialized the load. If item is provided, it means that a new column needs to be added after\nthe load is performed. In this scenario, <code>column</code> will be refer to the column that holds the item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-columnview:loaditems"
    }
  },
  {
    "__docId__": 967,
    "kind": "typedef",
    "name": "coral-columnview:change",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~coral-columnview:change",
    "access": "public",
    "description": "Triggered when the selection inside the {@link ColumnViewColumn} changes. In case both the selection and the active item change,\nthe <code>coral-columnview:activeitemchange</code> will be triggered first.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "ColumnViewColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The column whose selection changed."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem",
          "Array.<ColumnViewItem>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The new selection of the Column."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem",
          "Array.<ColumnViewItem>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The old selection of the Column."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-columnview:change"
    }
  },
  {
    "__docId__": 968,
    "kind": "typedef",
    "name": "coral-columnview:activeitemchange",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~coral-columnview:activeitemchange",
    "access": "public",
    "description": "Triggered when the active item of the {@link ColumnViewColumn} changes.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "ColumnViewColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The column whose active item has changed."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.activeItem",
        "description": "The currently active item of the column."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldActiveItem",
        "description": "The item of the column that was active before."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-columnview:activeitemchange"
    }
  },
  {
    "__docId__": 969,
    "kind": "typedef",
    "name": "coral-columnview:navigate",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnView.js~coral-columnview:navigate",
    "access": "public",
    "description": "Triggered when the {@link ColumnView} navigation is complete and the new columns are ready.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "ColumnViewColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The last Column of the ColumnView that is used to determine the path. If the navigate was triggered because a\nnew {@link ColumnViewColumn} was added, then it will match that column. In case the path was\nreduced, the column will match the last column."
      },
      {
        "nullable": null,
        "types": [
          "ColumnViewItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.activeItem",
        "description": "The currently active item of the ColumnView."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-columnview:navigate"
    }
  },
  {
    "__docId__": 970,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {SelectableCollection} from '../../../coral-collection';\n\n/**\n @class Coral.ColumnView.Collection\n @classdesc The ColumnView collection\n @extends {SelectableCollection}\n */\nclass ColumnViewCollection extends SelectableCollection {\n  _deselectAndDeactivateAllExcept(item) {\n    this\n      .getAll()\n      .forEach((el) => {\n        if (el.hasAttribute('selected') || el.hasAttribute('active')) {\n          el.removeAttribute('selected');\n          if (el !== item) {\n            el.removeAttribute('active');\n          }\n        }\n      });\n  }\n\n  _deactivateAll() {\n    this._deselectAllExcept(null, 'active');\n  }\n\n  _deactivateAllExceptFirst() {\n    this._deselectAllExceptFirst('active');\n  }\n\n  _getAllActive() {\n    return this._getAllSelected('active');\n  }\n\n  _selectAll() {\n    this\n      .getAll()\n      .forEach((el) => {\n        if (!el.hasAttribute('selected')) {\n          el.setAttribute('selected', '');\n        }\n      });\n  }\n}\n\nexport default ColumnViewCollection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 971,
    "kind": "class",
    "name": "ColumnViewCollection",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "The ColumnView collection",
    "lineNumber": 20,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Collection"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The ColumnView collection"
      }
    ],
    "interface": false,
    "extends": [
      "SelectableCollection"
    ],
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Collection();"
    ],
    "see": [
      "../examples/#columnview"
    ]
  },
  {
    "__docId__": 972,
    "kind": "method",
    "name": "_deselectAndDeactivateAllExcept",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection#_deselectAndDeactivateAllExcept",
    "access": "private",
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 973,
    "kind": "method",
    "name": "_deactivateAll",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection#_deactivateAll",
    "access": "private",
    "description": null,
    "lineNumber": 34,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 974,
    "kind": "method",
    "name": "_deactivateAllExceptFirst",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection#_deactivateAllExceptFirst",
    "access": "private",
    "description": null,
    "lineNumber": 38,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 975,
    "kind": "method",
    "name": "_getAllActive",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection#_getAllActive",
    "access": "private",
    "description": null,
    "lineNumber": 42,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 976,
    "kind": "method",
    "name": "_selectAll",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewCollection.js~ColumnViewCollection#_selectAll",
    "access": "private",
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 977,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport ColumnViewCollection from './ColumnViewCollection';\nimport isInteractiveTarget from './isInteractiveTarget';\nimport selectionMode from './selectionMode';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-MillerColumns-item';\n\n// The number of milliseconds for which scroll events should be debounced.\nconst SCROLL_DEBOUNCE = 100;\n\n// Height if every item to avoid using offsetHeight during calculations.\nconst ITEM_HEIGHT = 40;\n\n// Flag to check if window load was called\nlet WINDOW_LOAD = false;\nwindow.addEventListener('load', () => {\n  WINDOW_LOAD = true;\n});\n\n/**\n @class Coral.ColumnView.Column\n @classdesc A ColumnView Column component\n @htmltag coral-columnview-column\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ColumnViewColumn = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      // we need to use capture as scroll events do not bubble\n      'capture:scroll coral-columnview-column-content': '_onContentScroll',\n      'click coral-columnview-column-content': '_onColumnContentClick',\n\n      // item interaction\n      'click coral-columnview-item': '_onItemClick',\n      'click [coral-columnview-itemselect]': '_onItemSelectClick',\n\n      // item events\n      'coral-columnview-item:_activechanged coral-columnview-item': '_onItemActiveChange',\n      'coral-columnview-item:_selectedchanged coral-columnview-item': '_onItemSelectedChange'\n    });\n\n    // Content zone\n    this._elements = {\n      content: this.querySelector('coral-columnview-column-content') || document.createElement('coral-columnview-column-content')\n    };\n\n    // default values\n    this._bulkSelectionChange = false;\n    this._oldSelection = [];\n    this._oldActiveItem = null;\n\n    // cache bound event handler functions\n    this._onDebouncedScroll = this._onDebouncedScroll.bind(this);\n    this._toggleItemSelection = this._toggleItemSelection.bind(this);\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The current active item.\n\n   @type {HTMLElement}\n   @readonly\n   @default null\n   */\n  get activeItem() {\n    return this.items._getAllActive()[0] || null;\n  }\n\n  /**\n   The content of the column. This container is where the items should be added and is responsible for handling the\n   scrolling.\n\n   @type {ColumnViewColumnContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-columnview-column-content',\n      insert: function (content) {\n        content.classList.add('_coral-AssetList');\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {ColumnViewCollection}\n   @readonly\n   */\n  get items() {\n    // we do lazy initialization of the collection\n    if (!this._items) {\n      this._items = new ColumnViewCollection({\n        host: this,\n        container: this._elements.content,\n        itemTagName: 'coral-columnview-item',\n        onItemAdded: this._toggleItemSelection,\n        onCollectionChange: this._handleMutation\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Returns the first selected item in the ColumnView. The value <code>null</code> is returned if no element is\n   selected.\n\n   @type {?HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this._selectionMode !== selectionMode.NONE ? this.items._getFirstSelected() : null;\n  }\n\n  /**\n   Returns an Array containing the set selected items inside this Column.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this._selectionMode !== selectionMode.NONE ? this.items._getAllSelected() : [];\n  }\n\n  /**\n   Private property that indicates the selection mode. If the <code>Coral.ColumnView.Column</code> is not inside\n   a <code>Coral.ColumnView</code> this value will be <code>undefined</code>.\n   See {@link ColumnViewSelectionModeEnum}.\n\n   @type {String}\n   @htmlattribute _selectionmode\n   @htmlattributereflected\n   @private\n   */\n  get _selectionMode() {\n    return this.__selectionMode;\n  }\n\n  set _selectionMode(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(selectionMode)(value) && value || null;\n\n    this._reflectAttribute('_selectionmode', value);\n    \n    if(validate.valueMustChange(this.__selectionMode, value)) {\n      this.__selectionMode = value;\n      let items = this.items.getAll();\n      items.forEach(item => this._toggleItemSelection(item));\n      this._setStateFromDOM();\n    }\n  }\n\n  /**\n   Returns an Array containing the last selected items inside this Column in selected order.\n\n   @type {Array.<HTMLElement>}\n   @private\n   */\n  get _lastSelectedItems() {\n    return this.__lastSelectedItems || this.selectedItems;\n  }\n\n  set _lastSelectedItems(value) {\n    this.__lastSelectedItems = value;\n  }\n\n  /** @private */\n  _onItemClick(event) {\n    if (isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    // since transform will kill the modification, we trigger the event manually\n    if (event.matchedTarget.hasAttribute('active')) {\n      // directly calls the event since setting the attribute will not trigger an event\n      this._onItemActiveChange(event);\n    } else {\n      // sets the item as active. while handling mouse interaction, items are not toggled\n      event.matchedTarget.active = true;\n    }\n  }\n\n  _toggleItemSelection(item) {\n    item[this._selectionMode !== selectionMode.NONE ? 'setAttribute' : 'removeAttribute']('_selectable', '');\n  }\n\n  /** @private */\n  _onItemSelectClick(event) {\n    if (this._selectionMode && this._selectionMode !== selectionMode.NONE) {\n      // stops propagation so that active is not called as well\n      event.stopPropagation();\n\n      const item = event.matchedTarget.parentElement;\n\n      // toggles the selection of the item\n      const isSelected = item.hasAttribute('selected');\n\n      // Handle multi-selection with shiftKey\n      if (!isSelected && event.shiftKey && this._selectionMode === selectionMode.MULTIPLE) {\n        const lastSelectedItem = this._lastSelectedItems[this._lastSelectedItems.length - 1];\n\n        if (lastSelectedItem) {\n          const items = this.items.getAll();\n          const lastSelectedItemIndex = items.indexOf(lastSelectedItem);\n          const selectedItemIndex = items.indexOf(item);\n\n          // true : selection goes up, false : selection goes down\n          const direction = selectedItemIndex < lastSelectedItemIndex;\n          const selectionRange = [];\n          let selectionIndex = lastSelectedItemIndex;\n\n          // Retrieve all items in the range\n          while (selectedItemIndex !== selectionIndex) {\n            selectionIndex = direction ? selectionIndex - 1 : selectionIndex + 1;\n            selectionRange.push(items[selectionIndex]);\n          }\n\n          // Select all items in the range silently\n          selectionRange.forEach((rangeItem) => {\n            // Except for item which is needed to trigger the selection change event\n            if (rangeItem !== item) {\n              rangeItem.set('selected', true, true);\n            }\n          });\n        }\n      }\n\n      item[isSelected ? 'removeAttribute' : 'setAttribute']('selected', '');\n\n      // if item was selected, make it active\n      if (isSelected && !this._lastSelectedItems.length) {\n        item.setAttribute('active', '');\n      }\n    }\n  }\n\n  /**\n   Handles the item activation, this causes the current item to get active and sets the next column to the item's\n   src.\n\n   @private\n   */\n  _onItemActiveChange(event) {\n    // we stop propagation since it is a private event\n    event.stopImmediatePropagation();\n\n    // ignores event handling due to bulk select operation\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    const item = event.matchedTarget;\n\n    this._bulkSelectionChange = true;\n    // clears the selection and keeps the item active. this force only 1 item to be active per column\n    this.items._deselectAndDeactivateAllExcept(item);\n    this._bulkSelectionChange = false;\n\n    // we check if the selection requires an event to be triggered\n    this._validateColumnChange(item);\n\n    // loads data using the item as the activator and 0 as the start since it is a new column\n    this._loadItems(0, item);\n  }\n\n  /**\n   Handles selecting multiple items in the same column. Selection could result in none, a single or multiple selected\n   items.\n\n   @private\n   */\n  _onItemSelectedChange(event) {\n    // we stop propagation since it is a private event\n    event.stopImmediatePropagation();\n\n    // item that was selected\n    const item = event.target;\n    const isSelected = item.selected;\n\n    if (isSelected) {\n      // Remember the last selected item\n      this._lastSelectedItems.push(item);\n    } else {\n      const removedItemIndex = this._lastSelectedItems.indexOf(item);\n      if (removedItemIndex !== -1) {\n        this._lastSelectedItems = this._lastSelectedItems.splice(removedItemIndex, 1);\n      }\n    }\n\n    // ignores event handling due to bulk select operation\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    // when the item is selected, we need to enforce the selection mode\n    if (isSelected) {\n      this._bulkSelectionChange = true;\n      // when there is selection, no item can be active\n      this.items._deactivateAll();\n\n      // enforces the selection mode\n      if (this._selectionMode === selectionMode.SINGLE) {\n        this.items._deselectAllExcept(item);\n      }\n      this._bulkSelectionChange = false;\n    }\n\n    // we make sure the change event is triggered before the load event.\n    this._validateColumnChange();\n  }\n\n  /** @ignore */\n  _tryToLoadAdditionalItems() {\n    // makes sure that not too many events are triggered (only one per frame)\n    if (this._bulkCollectionChange) {\n      return;\n    }\n\n    this._bulkCollectionChange = true;\n\n    // we use setTimeout instead of nextFrame because macrotasks allow for more flexibility since they are less\n    // aggressive in executing the code\n    window.setTimeout(() => {\n      // trigger 'coral-columnview:loaditems' asynchronously in order to be sure the application is done\n      // adding/removing elements. Also make sure that only one event is triggered at once\n\n      // bulkCollectionChange has to be reset before loading new items\n      this._bulkCollectionChange = false;\n      this._loadFittingAdditionalItems();\n    }, 0);\n  }\n\n  /** @private */\n  _onContentScroll() {\n    window.clearTimeout(this._scrollTimeout);\n    this._scrollTimeout = window.setTimeout(this._onDebouncedScroll, SCROLL_DEBOUNCE);\n  }\n\n  /**\n   Handles the column click. When the column body is clicked, we need to deselect everything up to that column.\n\n   @private\n   */\n  _onColumnContentClick(event) {\n    // we make sure the content was clicked directly and not an item\n    if (event.target !== event.matchedTarget || isInteractiveTarget(event.target)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    // ignores event handling due to bulk select operation\n    if (this._bulkSelectionChange) {\n      return false;\n    }\n\n    this._bulkSelectionChange = true;\n    // clears the current column\n    this.items._deselectAndDeactivateAllExcept();\n    this._bulkSelectionChange = false;\n\n    // we check if the selection requires an event to be triggered\n    this._validateColumnChange();\n  }\n\n  /** @private */\n  _onDebouncedScroll() {\n    const threshold = 20;\n    if (this.content.scrollTop + this.offsetHeight >= this.content.scrollHeight - threshold) {\n      this._loadItems(this.items.length, undefined);\n    }\n  }\n\n  /** @private */\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  /** @private */\n  _validateColumnChange(item) {\n    const newActiveItem = this.activeItem;\n    const oldActiveItem = this._oldActiveItem || null;\n\n    // we have to force the event in case the same active item was clicked again, but still try to avoid triggering as\n    // less events as possible\n    if (newActiveItem !== oldActiveItem || item === newActiveItem) {\n      this.trigger('coral-columnview-column:_activeitemchanged', {\n        activeItem: newActiveItem,\n        oldActiveItem: oldActiveItem\n      });\n\n      // we cache the active item for the next time\n      this._oldActiveItem = newActiveItem;\n    }\n\n    const newSelection = this.selectedItems;\n    const oldSelection = this._oldSelection;\n\n    if (this._arraysAreDifferent(newSelection, oldSelection)) {\n      this.trigger('coral-columnview-column:_selecteditemchanged', {\n        selection: newSelection,\n        oldSelection: oldSelection\n      });\n\n      // changes the old selection array since we selected something new\n      this._oldSelection = newSelection;\n    }\n  }\n\n  /**\n   Loads additional Items if the current items of the column to not exceed its height and a path this.next is given.\n\n   @private\n   */\n  _loadFittingAdditionalItems() {\n    const itemsCount = this.items.length;\n    // this value must match $columnview-item-height\n    const itemsHeight = itemsCount * ITEM_HEIGHT;\n\n    // we request more items if there is still space for them. in case the values are the same, we request more data\n    // just to be sure, specially when the value is 0\n    if (itemsHeight <= this.offsetHeight) {\n      this._loadItems(itemsCount, undefined);\n    }\n  }\n\n  /**\n   Loads additional items. If the given item is not <code>active</code>, no data will be requested.\n\n   @param {Number} count\n   Amount of items in the column.\n   @param {?HTMLElement} item\n   Item that triggered the load.\n\n   @private\n   */\n  _loadItems(count, item) {\n    // if the given item is not active, it should not request data\n    if (!item || item.hasAttribute('active')) {\n      this.trigger('coral-columnview-column:_loaditems', {\n        start: count,\n        item: item\n      });\n    }\n  }\n\n  /**\n   Updates the active and selected options from the DOM.\n\n   @ignore\n   */\n  _setStateFromDOM() {\n    // if the selection mode has not been set, we do no try to force selection\n    if (this._selectionMode) {\n      // single: only the last item is selected\n      if (this._selectionMode === selectionMode.SINGLE) {\n        this.items._deselectAllExceptLast();\n      }\n      // none: deselects everything\n      else if (this._selectionMode === selectionMode.NONE) {\n        this.items._deselectAllExcept();\n      }\n\n      // makes sure only one item is active\n      this.items._deactivateAllExceptFirst();\n    }\n  }\n\n  /** @private */\n  _handleMutation() {\n    this._setStateFromDOM();\n\n    // in case items were added removed and selection changed\n    this._validateColumnChange();\n\n    // checks if more items can be added after the childlist change\n    this._tryToLoadAdditionalItems();\n  }\n\n  get _contentZones() {\n    return {'coral-columnview-column-content': 'content'};\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      _selectionmode: '_selectionMode'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      '_selectionmode'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n    // @a11y\n    if (!this.hasAttribute('role')) {\n      this.setAttribute('role', 'group');\n    }\n\n    this.id = this.id || commons.getUID();\n\n    // @todo: initial collection items needs to be triggered\n\n    const content = this._elements.content;\n\n    // when the content zone was not created, we need to make sure that everything is added inside it as a content.\n    // this stops the content zone from being voracious\n    if (!content.parentNode) {\n      // move the contents of the item into the content zone\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // @a11y\n    content.setAttribute('role', 'presentation');\n\n    // Call content zone insert\n    this.content = content;\n\n    // handles the initial selection\n    this._setStateFromDOM();\n\n    // we keep a list of the last selection to determine if something changed. we need to do this after\n    // validateSelection since it modifies the initial state based on the option\n    this._oldSelection = this.selectedItems;\n    this._oldActiveItem = this.activeItem;\n\n    if (!WINDOW_LOAD) {\n      // instead of being super aggressive on requesting data, we use window onload so it is scheduled after\n      // all the code has been executed, this way events can be added before\n      window.addEventListener('load', () => {\n        this._loadFittingAdditionalItems();\n      });\n    } else {\n      // macro-task is necessary for the same reasons as listed above\n      window.setTimeout(() => {\n        this._loadFittingAdditionalItems();\n      });\n    }\n  }\n});\n\nexport default ColumnViewColumn;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 978,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 979,
    "kind": "variable",
    "name": "SCROLL_DEBOUNCE",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js~SCROLL_DEBOUNCE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 980,
    "kind": "variable",
    "name": "ITEM_HEIGHT",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js~ITEM_HEIGHT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 26,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 981,
    "kind": "variable",
    "name": "WINDOW_LOAD",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js~WINDOW_LOAD",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "type": {
      "types": [
        "boolean"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 982,
    "kind": "variable",
    "name": "ColumnViewColumn",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumn.js~ColumnViewColumn",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "A ColumnView Column component",
    "lineNumber": 41,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Column"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColumnView Column component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-column"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-column></coral-columnview-column>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Column();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 983,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumnContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Column.Content\n @classdesc ColumnView's Column content component\n @htmltag coral-columnview-column-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-column-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumnContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 984,
    "kind": "function",
    "name": "ColumnViewColumnContent",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumnContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewColumnContent.js~ColumnViewColumnContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's Column content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Column.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's Column content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-column-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-column-content></coral-columnview-column-content>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Column.Content();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 985,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport accessibilityState from '../templates/accessibilityState';\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseLabellable} from '../../../coral-base-labellable';\nimport {Icon} from '../../../coral-component-icon';\nimport {Checkbox} from '../../../coral-component-checkbox';\nimport {commons, i18n, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-AssetList-item';\n\n/**\n Enumeration for {@link ColumnViewItem} variants.\n\n @typedef {Object} ColumnViewItemVariantEnum\n\n @property {String} DEFAULT\n Default item variant. Contains no special decorations.\n @property {String} DRILLDOWN\n An item with a right arrow indicating that the navigation will go one level down.\n */\nconst variant = {\n  DEFAULT: 'default',\n  DRILLDOWN: 'drilldown'\n};\n\n/**\n Utility that identifies Chrome on macOS, which announces drilldown items as \"row 1 expanded\" or \"row 1 collapsed\" when navigating between items.\n */\nconst isChromeMacOS = !!window && !!window.chrome && /Mac/i.test(window.navigator.platform);\n\n/**\n @class Coral.ColumnView.Item\n @classdesc A ColumnView Item component\n @htmltag coral-columnview-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ColumnViewItem = Decorator(class extends BaseLabellable(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Content zone\n    this._elements = {\n      content: this.querySelector('coral-columnview-item-content') || document.createElement('coral-columnview-item-content'),\n      thumbnail: this.querySelector('coral-columnview-item-thumbnail') || document.createElement('coral-columnview-item-thumbnail'),\n      accessibilityState: this.querySelector('span[handle=\"accessibilityState\"]')\n    };\n\n    if (!this._elements.accessibilityState) {\n      // Templates\n      accessibilityState.call(this._elements, {commons});\n    }\n  }\n\n  /**\n   The content of the item.\n\n   @type {ColumnViewItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-columnview-item-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}Label`);\n        // Insert before chevron\n        this.insertBefore(content, this.querySelector('._coral-AssetList-itemChildIndicator'));\n      }\n    });\n  }\n\n  /**\n   The thumbnail of the item. It is used to hold an icon or an image.\n\n   @type {ColumnViewItemThumbnail}\n   @contentzone\n   */\n  get thumbnail() {\n    return this._getContentZone(this._elements.thumbnail);\n  }\n\n  set thumbnail(value) {\n    this._setContentZone('thumbnail', value, {\n      handle: 'thumbnail',\n      tagName: 'coral-columnview-item-thumbnail',\n      insert: function (thumbnail) {\n        thumbnail.classList.add(`${CLASSNAME}Thumbnail`);\n        // Insert before content\n        this.insertBefore(thumbnail, this.content || null);\n      }\n    });\n  }\n\n  /**\n   The item's variant. See {@link ColumnViewItemVariantEnum}.\n\n   @type {String}\n   @default ColumnViewItemVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n\n    this._reflectAttribute('variant', value);\n\n    if(validate.valueMustChange(this._variant, value)) {\n      this._variant = value;\n\n      if (value === variant.DRILLDOWN) {\n        // Render chevron on demand\n        const childIndicator = this.querySelector('._coral-AssetList-itemChildIndicator');\n        if (!childIndicator) {\n          this.insertAdjacentHTML('beforeend', Icon._renderSVG('spectrum-css-icon-ChevronRightMedium', ['_coral-AssetList-itemChildIndicator', '_coral-UIIcon-ChevronRightMedium']));\n        }\n  \n        this.classList.add('is-branch');\n  \n        // @a11y Update aria-expanded. Active drilldowns should be expanded.\n        // Note: Omit aria-expanded on Chrome for macOS, because with VoiceOver tends\n        // to announce drilldown items as \"row 1 expanded\" or \"row 1 collapsed\" when\n        // navigating between items.\n        if (this.selected || (isChromeMacOS && this.getAttribute('aria-level') === '1')) {\n          this.removeAttribute('aria-expanded');\n        } else {\n          this.setAttribute('aria-expanded', this.active);\n        }\n      } else {\n        this.classList.remove('is-branch');\n        this.removeAttribute('aria-expanded');\n      }\n    }\n  }\n\n  /**\n   Specifies the icon that will be placed inside the thumbnail. The size of the icon is always controlled by the\n   component.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    value = transform.string(value);\n    \n    this._reflectAttribute('icon', value);\n\n    if(validate.valueMustChange(this._icon, value)) {\n      this._icon = value;\n\n      // ignored if it is an empty string\n      if (value) {\n        // creates a new icon element\n        if (!this._elements.icon) {\n          this._elements.icon = new Icon();\n          // register observer only if there present an icon field.\n          super._observeLabel();\n        }\n  \n        this._elements.icon.icon = this.icon;\n        this._elements.icon.size = Icon.size.SMALL;\n  \n        // removes all the items, since the icon attribute has precedence\n        this._elements.thumbnail.innerHTML = '';\n  \n        // adds the newly created icon\n        this._elements.thumbnail.appendChild(this._elements.icon);\n      }\n  \n      super._toggleIconAriaHidden();\n    }\n  }\n\n  /**\n   Whether the item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n    this._reflectAttribute('selected', value);\n\n    if(validate.valueMustChange(this._selected, value)) {\n      this._selected = value;\n      this.trigger('coral-columnview-item:_selectedchanged');\n  \n      // wait a frame before updating attributes\n      commons.nextFrame(() => {\n        this.classList.toggle('is-selected', value);\n        this.setAttribute('aria-selected', value);\n  \n        // @a11y Update aria-expanded. Active drilldowns should be expanded.\n        // Note: Omit aria-expanded on Chrome for macOS, because with VoiceOver tends\n        // to announce drilldown items as \"row 1 expanded\" or \"row 1 collapsed\" when\n        // navigating between items.\n        if (value === variant.DRILLDOWN) {\n          if (this._selected || (isChromeMacOS && this.getAttribute('aria-level') === '1')) {\n            this.removeAttribute('aria-expanded');\n          } else {\n            this.setAttribute('aria-expanded', this.active);\n          }\n        }\n  \n        let accessibilityState = this._elements.accessibilityState;\n  \n        if (value) {\n  \n          // @a11y Panels to right of selected item are removed, so remove aria-owns and aria-describedby attributes.\n          this.removeAttribute('aria-owns');\n          this.removeAttribute('aria-describedby');\n  \n          // @a11y Update content to ensure that checked state is announced by assistive technology when the item receives focus\n          accessibilityState.innerHTML = i18n.get(', checked');\n  \n          // @a11y append live region content element\n          if (!this.contains(accessibilityState)) {\n            this.appendChild(accessibilityState);\n          }\n        }\n        // @a11y If deselecting from checked state,\n        else {\n  \n          // @a11y remove, but retain reference to accessibilityState state\n          if (accessibilityState.parentNode) {\n            this._elements.accessibilityState = accessibilityState.parentNode.removeChild(accessibilityState);\n          }\n  \n          // @a11y Update content to remove checked state\n          this._elements.accessibilityState.innerHTML = '';\n        }\n  \n        // @a11y Item should be labelled by thumbnail, content, and if appropriate accessibility state.\n        let ariaLabelledby = this._elements.thumbnail.id + ' ' + this._elements.content.id;\n        this.setAttribute('aria-labelledby', this.selected ? `${ariaLabelledby} ${accessibilityState.id}` : ariaLabelledby);\n  \n        // Sync checkbox item selector\n        const itemSelector = this.querySelector('coral-checkbox[coral-columnview-itemselect]');\n        if (itemSelector) {\n          itemSelector[value ? 'setAttribute' : 'removeAttribute']('checked', '');\n        }\n      });\n    }\n  }\n\n  /**\n   Whether the item is active.\n\n   @type {Boolean}\n   @default false\n   @htmlattribut active\n   @htmlattributereflected\n   */\n  get active() {\n    return this._active || false;\n  }\n\n  set active(value) {\n    value = transform.booleanAttr(value);\n    this._reflectAttribute('active', value);\n\n    if(validate.valueMustChange(this._active, value)) {\n      this._active = value;\n\n      this.classList.toggle('is-navigated', value);\n      this.setAttribute('aria-selected', this.hasAttribute('_selectable') ? this.selected : value);\n  \n      // @a11y Update aria-expanded. Active drilldowns should be expanded.\n      // Note: Omit aria-expanded on Chrome for macOS, because with VoiceOver tends\n      // to announce drilldown items as \"row 1 expanded\" or \"row 1 collapsed\" when\n      // navigating between items.\n      if (this.variant === variant.DRILLDOWN) {\n        if (this.selected || (isChromeMacOS && this.getAttribute('aria-level') === '1')) {\n          this.removeAttribute('aria-expanded');\n        } else {\n          this.setAttribute('aria-expanded', this.active);\n        }\n      }\n  \n      if (!value) {\n        // @a11y Inactive items are not expanded, so remove aria-owns and aria-describedby attributes.\n        this.removeAttribute('aria-owns');\n        this.removeAttribute('aria-describedby');\n      }\n  \n      this.trigger('coral-columnview-item:_activechanged');\n    }\n  }\n\n  get _contentZones() {\n    return {\n      'coral-columnview-item-content': 'content',\n      'coral-columnview-item-thumbnail': 'thumbnail'\n    };\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_selectable') {\n      // Disable selection\n      if (value === null) {\n        this.classList.remove('is-selectable');\n      }\n      // Enable selection\n      else {\n        this.classList.add('is-selectable');\n        let itemSelector = this.querySelector('[coral-columnview-itemselect]');\n\n        // Render checkbox on demand\n        if (!itemSelector) {\n          itemSelector = new Checkbox();\n          itemSelector.setAttribute('coral-columnview-itemselect', '');\n          if (this.classList.contains('is-selected')) {\n            itemSelector.setAttribute('checked', '');\n          }\n          itemSelector._elements.input.tabIndex = -1;\n          itemSelector.setAttribute('labelledby', this._elements.content.id);\n\n          // Add the item selector as first child\n          this.insertBefore(itemSelector, this.firstChild);\n        }\n      }\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /**\n   Returns {@link ColumnViewItem} variants.\n\n   @return {ColumnViewItemVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'variant',\n      'icon',\n      'selected',\n      'active',\n      '_selectable'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // @a11y\n    this.setAttribute('role', 'treeitem');\n\n    this.id = this.id || commons.getUID();\n\n    // only set tabIndex if it is not already set\n    if (!this.hasAttribute('tabindex')) {\n      this.tabIndex = this.active || this.selected ? 0 : -1;\n    }\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    const thumbnail = this._elements.thumbnail;\n    const content = this._elements.content;\n\n    const contentZoneProvided = content.parentNode || thumbnail.parentNode;\n\n    if (!contentZoneProvided) {\n      // move the contents of the item into the content zone\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Assign content zones\n    this.content = content;\n    this.thumbnail = thumbnail;\n\n    // @a11y thumbnail img element should have alt attribute\n    const thumbnailImg = thumbnail.querySelector('img:not([alt])');\n    if (thumbnailImg) {\n      thumbnailImg.setAttribute('alt', '');\n    }\n\n    // @ally add aria-labelledby so that JAWS/IE announces item correctly\n    thumbnail.id = thumbnail.id || commons.getUID();\n\n    content.id = content.id || commons.getUID();\n\n    // @a11y Add live region element to ensure announcement of selected state\n    const accessibilityState = this._elements.accessibilityState;\n\n    // @a11y accessibility state string should announce in document lang, rather than item lang.\n    accessibilityState.setAttribute('lang', i18n.locale);\n\n    // @a11y Item should be labelled by thumbnail, content, and accessibility state.\n    this.setAttribute('aria-labelledby', thumbnail.id + ' ' + content.id);\n\n    //adding html title, on hovering over textcontent title will be visible\n    this.setAttribute('title', this.content.textContent.trim());\n  }\n});\n\nexport default ColumnViewItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 986,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 987,
    "kind": "typedef",
    "name": "ColumnViewItemVariantEnum",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js~ColumnViewItemVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link ColumnViewItem} variants.",
    "lineNumber": 33,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Default item variant. Contains no special decorations."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DRILLDOWN",
        "description": "An item with a right arrow indicating that the navigation will go one level down."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColumnViewItemVariantEnum"
    }
  },
  {
    "__docId__": 988,
    "kind": "variable",
    "name": "isChromeMacOS",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js~isChromeMacOS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Utility that identifies Chrome on macOS, which announces drilldown items as \"row 1 expanded\" or \"row 1 collapsed\" when navigating between items.",
    "lineNumber": 41,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 989,
    "kind": "variable",
    "name": "ColumnViewItem",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItem.js~ColumnViewItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "A ColumnView Item component",
    "lineNumber": 50,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColumnView Item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-item></coral-columnview-item>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Item();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 990,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Item.Content\n @classdesc ColumnView's Item content component\n @htmltag coral-columnview-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 991,
    "kind": "function",
    "name": "ColumnViewItemContent",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemContent.js~ColumnViewItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's Item content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's Item content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-item-content></coral-columnview-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Item.Content();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 992,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemThumbnail.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Item.Thumbnail\n @classdesc ColumnView's Item thumbnail component\n @htmltag coral-columnview-item-thumbnail\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-item-thumbnail');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemThumbnail.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 993,
    "kind": "function",
    "name": "ColumnViewItemThumbnail",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemThumbnail.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewItemThumbnail.js~ColumnViewItemThumbnail",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's Item thumbnail component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Item.Thumbnail"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's Item thumbnail component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-item-thumbnail"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-item-thumbnail></coral-columnview-item-thumbnail>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Item.Thumbnail();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 994,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-MillerColumns-item';\n\n/**\n @class Coral.ColumnView.Preview\n @classdesc A ColumnView Preview component\n @htmltag coral-columnview-preview\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ColumnViewPreview = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Content zone\n    this._elements = {\n      content: this.querySelector('coral-columnview-preview-content') || document.createElement('coral-columnview-preview-content')\n    };\n  }\n\n  /**\n   The content of the Preview.\n\n   @type {ColumnViewPreviewContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-columnview-preview-content',\n      insert: function (content) {\n        content.classList.add('coral-Body--small');\n        this.appendChild(content);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {'coral-columnview-preview-content': 'content'};\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.setAttribute('role', 'group');\n\n    this.id = this.id || commons.getUID();\n\n    this.classList.add(CLASSNAME);\n\n    const content = this._elements.content;\n\n    // when the content zone was not created, we need to make sure that everything is added inside it as a content.\n    // this stops the content zone from being voracious\n    if (!content.parentNode) {\n      // move the contents of the item into the content zone\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Call content zone insert\n    this.content = content;\n\n    this._makeAccessible();\n  }\n\n  /** @ignore */\n  _makeAccessible() {\n\n    // @a11y For item values with a label, identify the value as a focusable, readOnly textbox labeled by the label.\n    let elements = this.content.querySelectorAll('coral-columnview-preview-label + coral-columnview-preview-value');\n    let length = elements.length;\n    let i;\n    let element;\n    let elementLabel;\n\n    // @a11y If the previous column has selected items,\n    // do not include item values in the tab order,\n    // so that a keyboard user can quickly advance to a subsequent toolbar.\n\n    for (i = 0 ; i < length ; i++) {\n      element = elements[i];\n      elementLabel = element.previousElementSibling;\n      elementLabel.id = elementLabel.id || commons.getUID();\n\n      // force ChromeVox to read value of textbox\n      if (window.cvox) {\n        element.setAttribute('aria-valuetext', element.textContent);\n      }\n    }\n\n    // @a11y Expose separator as a horizontally-oriented separator.\n    elements = this.content.querySelectorAll('coral-columnview-preview-separator');\n    length = elements.length;\n    for (i = 0 ; i < length ; i++) {\n      element = elements[i];\n      element.setAttribute('role', 'separator');\n      element.setAttribute('aria-orientation', 'horizontal');\n    }\n\n    // @a11y If the preview asset image does not include an alt attribute, set alt=\"\", so that screen readers do not announce the image url.\n    elements = this.content.querySelectorAll('coral-columnview-preview-asset > img:not([alt])');\n    length = elements.length;\n    for (i = 0 ; i < length ; i++) {\n      element = elements[i];\n      element.setAttribute('alt', '');\n    }\n  }\n});\n\nexport default ColumnViewPreview;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 995,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 996,
    "kind": "variable",
    "name": "ColumnViewPreview",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreview.js~ColumnViewPreview",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "A ColumnView Preview component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ColumnView Preview component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview></coral-columnview-preview>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 997,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewAsset.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Preview.Asset\n @classdesc ColumnView's preview asset component\n @htmltag coral-columnview-preview-asset\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-preview-asset');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewAsset.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 998,
    "kind": "function",
    "name": "ColumnViewPreviewAsset",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewAsset.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewAsset.js~ColumnViewPreviewAsset",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's preview asset component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview.Asset"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's preview asset component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview-asset"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview-asset></coral-columnview-preview-asset>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview.Asset();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 999,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Preview.Content\n @classdesc ColumnView's preview content component\n @htmltag coral-columnview-preview-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-preview-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1000,
    "kind": "function",
    "name": "ColumnViewPreviewContent",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewContent.js~ColumnViewPreviewContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's preview content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's preview content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview-content></coral-columnview-preview-content>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview.Content();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 1001,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Preview.Label\n @classdesc ColumnView's preview label component\n @htmltag coral-columnview-preview-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-preview-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1002,
    "kind": "function",
    "name": "ColumnViewPreviewLabel",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewLabel.js~ColumnViewPreviewLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's preview label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's preview label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview-label></coral-columnview-preview-label>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview.Label();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 1003,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewSeparator.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Preview.Separator\n @classdesc ColumnView's preview separator component\n @htmltag coral-columnview-preview-separator\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-preview-separator');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewSeparator.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1004,
    "kind": "function",
    "name": "ColumnViewPreviewSeparator",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewSeparator.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewSeparator.js~ColumnViewPreviewSeparator",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's preview separator component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview.Separator"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's preview separator component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview-separator"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview-separator></coral-columnview-preview-separator>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview.Separator();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 1005,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewValue.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.ColumnView.Preview.Value\n @classdesc ColumnView's preview value component\n @htmltag coral-columnview-preview-value\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-columnview-preview-value');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewValue.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1006,
    "kind": "function",
    "name": "ColumnViewPreviewValue",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewValue.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/ColumnViewPreviewValue.js~ColumnViewPreviewValue",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ColumnView}",
    "description": "ColumnView's preview value component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ColumnView.Preview.Value"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "ColumnView's preview value component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-columnview-preview-value"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-columnview-preview-value></coral-columnview-preview-value>",
      "<caption>JS constructor</caption>\nnew Coral.ColumnView.Preview.Value();"
    ],
    "see": [
      "../examples/#columnview"
    ],
    "params": []
  },
  {
    "__docId__": 1007,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/isInteractiveTarget.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n\n/**\n * Helper function to test whether event.target is explicitly marked as interactive.\n *\n * Interactive elements included in an Item should respond to keyboard events without the event being handled by the Item as well.\n *\n * @private\n */\nconst isInteractiveTarget = (target) => {\n  return target.hasAttribute('coral-interactive') || target.closest('[coral-interactive]') !== null;\n};\n\nexport default isInteractiveTarget;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/isInteractiveTarget.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1008,
    "kind": "function",
    "name": "isInteractiveTarget",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/isInteractiveTarget.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/isInteractiveTarget.js~isInteractiveTarget",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{isInteractiveTarget}",
    "description": "Helper function to test whether event.target is explicitly marked as interactive.\n\nInteractive elements included in an Item should respond to keyboard events without the event being handled by the Item as well.",
    "lineNumber": 21,
    "ignore": true,
    "params": [
      {
        "name": "target",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1009,
    "kind": "file",
    "name": "coral-spectrum/coral-component-columnview/src/scripts/selectionMode.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Enumeration for {@link ColumnView} selection options.\n\n @typedef {Object} ColumnViewSelectionModeEnum\n\n @property {String} NONE\n None is default, selection of items does not happen based on click.\n @property {String} SINGLE\n Single selection mode, only one item per column can be selected.\n @property {String} MULTIPLE\n Multiple selection mode, multiple items per column can be selected.\n */\nconst selectionMode = {\n  NONE: 'none',\n  SINGLE: 'single',\n  MULTIPLE: 'multiple'\n};\n\nexport default selectionMode;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-columnview/src/scripts/selectionMode.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1010,
    "kind": "typedef",
    "name": "ColumnViewSelectionModeEnum",
    "memberof": "coral-spectrum/coral-component-columnview/src/scripts/selectionMode.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-columnview/src/scripts/selectionMode.js~ColumnViewSelectionModeEnum",
    "access": "public",
    "description": "Enumeration for {@link ColumnView} selection options.",
    "lineNumber": 25,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "None is default, selection of items does not happen based on click."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SINGLE",
        "description": "Single selection mode, only one item per column can be selected."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MULTIPLE",
        "description": "Multiple selection mode, multiple items per column can be selected."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ColumnViewSelectionModeEnum"
    }
  },
  {
    "__docId__": 1011,
    "kind": "file",
    "name": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-popover';\nimport '../../../coral-component-button';\nimport CycleButtonItem from './CycleButtonItem';\nimport {Icon} from '../../../coral-component-icon';\nimport {ButtonList, SelectList} from '../../../coral-component-list';\nimport {SelectableCollection} from '../../../coral-collection';\nimport base from '../templates/base';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link CycleButton} display options.\n\n @typedef {Object} CycleButtonDisplayModeEnum\n\n @property {String} ICON\n Icon display mode.\n @property {String} TEXT\n Text display mode.\n @property {String} ICON_TEXT\n Icon and text display mode.\n */\nconst displayMode = {\n  ICON: 'icon',\n  TEXT: 'text',\n  ICON_TEXT: 'icontext'\n};\n\n/**\n Regex used to remove whitespace from selectedItem label for use as an aria-label for accessibility.\n\n @ignore\n */\nconst WHITESPACE_REGEX = /[\\t\\n\\r ]+/g;\n\n/** @ignore */\nconst ACTION_TAG_NAME = 'coral-cyclebutton-action';\n\nconst CLASSNAME = '_coral-CycleSelect';\n\n/**\n @class Coral.CycleButton\n @classdesc A CycleButton component is a simple multi-state toggle button that toggles between the possible items below\n a certain threshold, and shows them in a popover selector when above.\n @htmltag coral-cyclebutton\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CycleButton = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._id = this.id || commons.getUID();\n\n    // Templates\n    this._elements = {};\n    base.call(this._elements, {Icon, commons, id: this._id});\n\n    const events = {\n      'click button[is=\"coral-button\"]': '_onMouseDown',\n      'click ._coral-CycleSelect-button': '_onItemClick',\n      'click coral-cyclebutton-item': '_onItemClick',\n      'key:down ._coral-CycleSelect-button[aria-expanded=false]': '_onItemClick',\n\n      // private\n      'coral-cyclebutton-item:_selectedchanged': '_onItemSelectedChanged',\n      'coral-cyclebutton-item:_validateselection': '_onValidateSelection',\n      'coral-cyclebutton-item:_iconchanged coral-cyclebutton-item[selected]': '_onSelectedItemPropertyChange',\n      'coral-cyclebutton-item:_displaymodechanged coral-cyclebutton-item[selected]': '_onSelectedItemPropertyChange',\n\n      'key:pageup coral-selectlist-item, [coral-list-item]': '_onFocusPreviousItem',\n      'key:left coral-selectlist-item, [coral-list-item]': '_onFocusPreviousItem',\n      'key:up coral-selectlist-item, [coral-list-item]': '_onFocusPreviousItem',\n      'key:pagedown coral-selectlist-item, [coral-list-item]': '_onFocusNextItem',\n      'key:right coral-selectlist-item, [coral-list-item]': '_onFocusNextItem',\n      'key:down coral-selectlist-item, [coral-list-item]': '_onFocusNextItem',\n      'key:home coral-selectlist-item, [coral-list-item]': '_onFocusFirstItem',\n      'key:end coral-selectlist-item, [coral-list-item]': '_onFocusLastItem',\n\n      'capture:focus coral-selectlist-item, [coral-list-item]': '_onItemFocus',\n      'capture:blur coral-selectlist-item, [coral-list-item]': '_onItemBlur',\n\n      'coral-overlay:open': '_onOverlayOpen',\n      'coral-overlay:close': '_onOverlayClose'\n    };\n\n    const overlay = this._elements.overlay;\n    const overlayId = overlay.id;\n\n    // Overlay\n    events[`global:capture:click #${overlayId} button[is=\"coral-buttonlist-item\"]`] = '_onActionClick';\n    events[`global:capture:coral-selectlist:beforechange #${overlayId}`] = '_onSelectListBeforeChange';\n    events[`global:capture:coral-selectlist:change #${overlayId}`] = '_onSelectListChange';\n    // Keyboard interaction\n    events[`global:keypress #${overlayId}`] = '_onOverlayKeyPress';\n\n    // Attach events\n    this._delegateEvents(events);\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n    this.actions._startHandlingItems(true);\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-cyclebutton-item',\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item in the CycleButton.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /**\n   General icon of the CycleButton. The icon will be displayed no matter the selection. If the selected item has\n   its own icon, it will be overwritten.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    this._icon = transform.string(value);\n    this._reflectAttribute('icon', this._icon);\n\n    const selectedItem = this.selectedItem;\n    if (selectedItem) {\n      this._renderSelectedItem(selectedItem);\n    }\n  }\n\n  /**\n   Number of items that can be directly cycled through before collapsing. If <code>0</code> is used, the items\n   will never be collapsed.\n\n   @type {Number}\n   @default 3\n   @htmlattribute threshold\n   @htmlattributereflected\n   */\n  get threshold() {\n    return typeof this._threshold === 'number' ? this._threshold : 3;\n  }\n\n  set threshold(value) {\n    value = transform.number(value);\n    if (value > -1) {\n      this._threshold = value;\n      this._checkExtended();\n    }\n  }\n\n  /**\n   The Collection Interface that allows interaction with the {@link CycleButtonAction} elements.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get actions() {\n    if (!this._actions) {\n      this._actions = new SelectableCollection({\n        host: this,\n        itemTagName: ACTION_TAG_NAME,\n        itemSelector: ACTION_TAG_NAME,\n        onCollectionChange: this._checkExtended\n      });\n    }\n    return this._actions;\n  }\n\n  /**\n   The CycleButton's displayMode. This defines how the selected item is displayed. If the selected item does not\n   have the necessary icon or text information then fallback to show whichever is available. The appearance of\n   collapsed items in the popover are not affected by this property. The displayMode property can be set on an\n   item to override the component level value when that item is selected.\n   See {@link CycleButtonDisplayModeEnum}.\n\n   @type {String}\n   @default CycleButtonDisplayModeEnum.ICON\n   @htmlattribute displaymode\n   @htmlattributereflected\n   */\n  get displayMode() {\n    return this._displayMode || displayMode.ICON;\n  }\n\n  set displayMode(value) {\n    value = transform.string(value).toLowerCase();\n    this._displayMode = validate.enumeration(displayMode)(value) && value || displayMode.ICON;\n    this._reflectAttribute('displaymode', this._displayMode);\n\n    const selectedItem = this.selectedItem;\n    if (selectedItem) {\n      this._renderSelectedItem(selectedItem);\n    }\n  }\n\n  /** @private */\n  _hasMenuItemRadioGroup() {\n    return this.items.getAll().length > 0 && this.actions.getAll().length > 0;\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    if (!this.selectedItem) {\n      item.setAttribute('selected', '');\n    }\n    else {\n      this._validateSelection(item);\n    }\n\n    this._checkExtended();\n  }\n\n  /** @private */\n  _onItemRemoved() {\n    if (!this.selectedItem) {\n      this._selectFirstItem();\n    }\n\n    this._checkExtended();\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _onValidateSelection(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection();\n  }\n\n  /** @private */\n  _selectFirstItem() {\n    const item = this.items._getFirstSelectable();\n    if (item) {\n      item.setAttribute('selected', '');\n    }\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n\n    if (item) {\n      // Deselected item\n      if (!item.hasAttribute('selected') && !selectedItems.length) {\n        const siblingItem = this.items._getNextSelectable(item);\n        // Next selectable item is forced to be selected if selection is cleared\n        if (item !== siblingItem) {\n          siblingItem.setAttribute('selected', '');\n        }\n      }\n      // Selected item\n      else if (item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    }\n    else if (selectedItems.length > 1) {\n      // If multiple items are selected, the last one wins\n      item = selectedItems[selectedItems.length - 1];\n\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n    // First selectable item is forced to be selected if no selection at all\n    else if (!selectedItems.length) {\n      this._selectFirstItem();\n    }\n\n    this._renderSelectedItem(this.selectedItem);\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-cyclebutton:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  _onMouseDown(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this._trackEvent('click', 'coral-cyclebutton', event);\n  }\n\n  /** @private */\n  _onItemClick(event) {\n    event.preventDefault();\n\n    const items = this.items.getAll();\n    const itemCount = items.length;\n\n    // When we have more than a specified number of items, use the overlay selection. If threshold is 0, then we never\n    // show the popover. If there are actions, we always show the popover.\n    if (this._isExtended()) {\n      // we toggle the overlay if it was already open\n      this[this._elements.overlay.classList.contains('is-open') ? '_hideOverlay' : '_showOverlay']();\n    }\n    // Unless this is the only item we have, select the next item in line:\n    else if (itemCount > 1) {\n      const neighbor = this.selectedItem.nextElementSibling;\n      const nextItem = neighbor.nodeName === 'CORAL-CYCLEBUTTON-ITEM' ? neighbor : items[0];\n\n      this._selectCycleItem(nextItem);\n      this._focusItem(this._elements.button);\n    }\n  }\n\n  /**\n   Render the provided item as selected according to resolved icon and displayMode properties.\n\n   @private\n   */\n  _renderSelectedItem(item) {\n    if (!item || !item.content) {\n      return;\n    }\n\n    // resolve effective values by checking for item and component level properties\n    let effectiveDisplayMode = this.displayMode;\n    const effectiveIcon = item.icon || this.icon || '';\n\n    if (item.displayMode !== CycleButtonItem.displayMode.INHERIT) {\n      effectiveDisplayMode = item.displayMode;\n    }\n    if (!item.content.textContent.trim() || !effectiveIcon.trim()) {\n      // if icon or text missing then we fallback to showing whichever is available\n      effectiveDisplayMode = displayMode.ICON_TEXT;\n    }\n\n    // manipulate button sub-component depending on display mode\n    if (effectiveDisplayMode === displayMode.ICON) {\n      this._elements.button.icon = effectiveIcon;\n      this._elements.button.label.innerHTML = '';\n\n      // @a11y\n      const ariaLabel = item.content.textContent.replace(WHITESPACE_REGEX, ' ');\n      this._elements.button.setAttribute('aria-label', ariaLabel);\n      this._elements.button.setAttribute('title', ariaLabel);\n      if (ariaLabel && effectiveIcon !== '' && this._elements.button._elements.icon) {\n        this._elements.button._elements.icon.setAttribute('aria-hidden', true);\n      }\n    }\n    else {\n      // handle display modes that include text\n      if (effectiveDisplayMode === displayMode.TEXT) {\n        this._elements.button.icon = '';\n      }\n      if (effectiveDisplayMode === displayMode.ICON_TEXT) {\n        this._elements.button.icon = effectiveIcon;\n        if (effectiveIcon !== '' && this._elements.button._elements.icon) {\n          this._elements.button._elements.icon.setAttribute('aria-hidden', true);\n        }\n      }\n      this._elements.button.label.innerHTML = item.content.innerHTML;\n\n      // @a11y we do not require aria attributes since we already show text\n      this._elements.button.removeAttribute('aria-label');\n      this._elements.button.removeAttribute('title');\n    }\n  }\n\n  /**\n   Update currently selected item if it's <code>icon</code> or <code>displayMode</code> properties have changed.\n\n   @private\n   */\n  _onSelectedItemPropertyChange(event) {\n    // stops propagation because the event is internal to the component\n    event.stopImmediatePropagation();\n    this._renderSelectedItem(event.target);\n  }\n\n  /** @private */\n  _onSelectListBeforeChange(event) {\n    if (event.detail.item.selected) {\n      event.preventDefault();\n      if (!this._isPopulatingLists) {\n        // Hide the overlay, cleanup will be done before overlay.show()\n        this._hideOverlay();\n      }\n    }\n  }\n\n  /** @private */\n  _onSelectListChange(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n\n    let origNode;\n    const selectListItem = event.detail.selection;\n    if (selectListItem) {\n      origNode = selectListItem._originalItem;\n\n      this._selectCycleItem(origNode);\n\n      if (!this._isPopulatingLists) {\n        // Hide the overlay, cleanup will be done before overlay.show()\n        this._hideOverlay();\n      }\n    }\n\n    this._trackEvent('selected', 'coral-cyclebutton-item', event, origNode);\n  }\n\n  _onOverlayKeyPress(event) {\n    // Focus on item which text starts with pressed keys\n    this._elements.selectList._onKeyPress(event);\n  }\n\n  /** @private */\n  _onActionClick(event) {\n    event.stopPropagation();\n\n    const item = event.matchedTarget;\n    const proxyEvent = item._originalItem.trigger('click');\n\n    if (!proxyEvent.defaultPrevented) {\n      this._hideOverlay();\n    }\n\n    this._trackEvent('selected', 'coral-cyclebutton-action', event, item);\n  }\n\n  /** @private */\n  _isExtended() {\n    const hasActions = this.actions.getAll().length > 0;\n    return this.threshold > 0 && this.items.getAll().length >= this.threshold || hasActions;\n  }\n\n  /** @private */\n  _checkExtended() {\n    const isExtended = this._isExtended();\n    this.classList.toggle(`${CLASSNAME}--extended`, isExtended);\n\n    // @a11y\n    if (isExtended) {\n      this._elements.button.setAttribute('aria-controls', this._elements.overlay.id);\n      this._elements.button.setAttribute('aria-haspopup', true);\n      this._elements.button.setAttribute('aria-expanded', false);\n\n      // Assign the button as the target for the overlay\n      this._elements.overlay.target = this._elements.button;\n      this._elements.overlay.hidden = false;\n\n      // Regions within the overlay should have role=presentation\n      this._elements.overlay.content.setAttribute('role', 'presentation');\n    }\n    else {\n      this._elements.button.removeAttribute('aria-controls');\n      this._elements.button.removeAttribute('aria-haspopup');\n      this._elements.button.removeAttribute('aria-expanded');\n\n      // Remove target and hide overlay\n      this._elements.overlay.target = null;\n      this._elements.overlay.hidden = true;\n    }\n  }\n\n  /** @ignore */\n  _focusItem(item) {\n    if (item) {\n      item.focus();\n    }\n  }\n\n  /** @private */\n  _onFocusPreviousItem(event) {\n    event.preventDefault();\n    const items = this._getSelectableItems();\n    if (items.length > 1) {\n      const el = event.matchedTarget;\n      const index = items.indexOf(el);\n      if (index > 0) {\n        this._focusItem(items[index - 1]);\n      }\n      else if (document.activeElement !== el) {\n        // make sure ButtonList doesn't wrap focus\n        this._focusItem(el);\n      }\n    }\n  }\n\n  /** @private */\n  _onFocusNextItem(event) {\n    event.preventDefault();\n    const items = this._getSelectableItems();\n    if (items.length > 1) {\n      const el = event.matchedTarget;\n      const index = items.indexOf(el);\n      if (index < items.length - 1) {\n        this._focusItem(items[index + 1]);\n      }\n      else if (document.activeElement !== el) {\n        // make sure ButtonList doesn't wrap focus\n        this._focusItem(el);\n      }\n    }\n  }\n\n  /** @private */\n  _onFocusFirstItem(event) {\n    event.preventDefault();\n    this._focusItem(this._getSelectableItems()[0]);\n  }\n\n  /** @private */\n  _onFocusLastItem(event) {\n    event.preventDefault();\n    const items = this._getSelectableItems();\n    this._focusItem(items[items.length - 1]);\n  }\n\n  /** @private */\n  _getSelectableItems() {\n    const items = this.items.getAll();\n    const actions = this.actions.getAll();\n    return items\n      .concat(actions)\n      .map(item => item._selectListItem || item._buttonListItem)\n      .filter(item => {\n        !item.hasAttribute('hidden') &&\n        !item.hasAttribute('disabled') &&\n        item.offsetParent !== null &&\n        (item.offsetWidth > 0 || item.offsetHeight > 0);\n      });\n  }\n\n  /** @private */\n  _onItemFocus(event) {\n    this._elements.selectList.classList.toggle('is-focused', true);\n    event.matchedTarget.classList.toggle('focus-ring', true);\n  }\n\n  /** @private */\n  _onItemBlur(event) {\n    this._elements.selectList.classList.toggle('is-focused', false);\n    event.matchedTarget.classList.toggle('focus-ring', false);\n  }\n\n  _onOverlayClose() {\n    // @a11y\n    this._elements.button.setAttribute('aria-expanded', false);\n  }\n\n  _onOverlayOpen() {\n    // @a11y\n    this._elements.button.setAttribute('aria-expanded', true);\n  }\n\n  /** @ignore */\n  _hideOverlay() {\n    this._elements.overlay.hide();\n  }\n\n  /** @ignore */\n  _getSelectListItem(item) {\n    const selectListItem = new SelectList.Item();\n\n    // Needs to be reflected on the generated Item.\n    selectListItem.trackingElement = item.trackingElement;\n\n    // We do first the content, so that the icon is not destroyed\n    const selectListItemContent = new SelectList.Item.Content();\n    selectListItemContent.innerHTML = item.content.innerHTML;\n    selectListItem.content = selectListItemContent;\n\n    // Specify the icon\n    if (item.icon) {\n      selectListItem.icon = item.icon;\n    }\n\n    selectListItem.disabled = item.disabled;\n    selectListItem.selected = item.selected;\n    selectListItem.setAttribute('role', item.getAttribute('role'));\n    selectListItem.setAttribute('aria-checked', item.selected);\n\n    selectListItem._originalItem = item;\n    item._selectListItem = selectListItem;\n\n    return selectListItem;\n  }\n\n  /** @ignore */\n  _getActionListItem(action) {\n    const actionListItem = new ButtonList.Item();\n\n    actionListItem.icon = action.icon;\n    actionListItem.disabled = action.disabled;\n    actionListItem.setAttribute('role', action.getAttribute('role'));\n    actionListItem.tabIndex = action.tabIndex;\n\n    // Needs to be reflected on the generated Action.\n    actionListItem.trackingElement = action.trackingElement;\n    actionListItem.content.innerHTML = action.content.innerHTML;\n\n    actionListItem._originalItem = action;\n    action._buttonListItem = actionListItem;\n\n    return actionListItem;\n  }\n\n  /** @ignore */\n  _populateLists() {\n    const selectList = this._elements.selectList;\n    const actionList = this._elements.actionList;\n    const items = this.items.getAll();\n    const actions = this.actions.getAll();\n    const itemCount = items.length;\n    const actionCount = actions.length;\n    let selectListItem;\n    let actionListItem;\n\n    this._isPopulatingLists = true;\n\n    // we empty the existing items before populating the lists again\n    selectList.items.clear();\n    actionList.items.clear();\n\n    // adds the items to the selectList\n    for (let i = 0 ; i < itemCount ; i++) {\n      const item = items[i];\n      selectListItem = this._getSelectListItem(item);\n\n      selectListItem.icon = item.icon;\n      selectListItem.setAttribute('aria-checked', item.selected);\n      selectListItem._elements.icon.setAttribute('aria-hidden', true);\n\n      selectListItem.set({\n        disabled: item.disabled,\n        selected: item.selected\n      }, true);\n\n      selectList.items.add(selectListItem);\n    }\n\n    // adds any additional actions to the actions buttonList\n    if (actionCount > 0) {\n      for (let j = 0 ; j < actionCount ; j++) {\n        const action = actions[j];\n\n        actionListItem = this._getActionListItem(action);\n        actionListItem.disabled = action.disabled;\n        actionListItem.icon = action.icon;\n        actionListItem._elements.icon.setAttribute('aria-hidden', true);\n\n        actionList.items.add(actionListItem);\n      }\n\n      this._elements.actionList.removeAttribute('hidden');\n\n      if (itemCount > 0) {\n        this._elements.separator.removeAttribute('hidden');\n      }\n    }\n    else {\n      this._elements.actionList.setAttribute('hidden', '');\n      this._elements.separator.setAttribute('hidden', '');\n    }\n\n    commons.nextFrame(() => {\n      this._isPopulatingLists = false;\n    });\n  }\n\n  /** @private */\n  _selectCycleItem(item) {\n    item.setAttribute('selected', '');\n  }\n\n  /** @ignore */\n  _showOverlay() {\n    this._populateLists();\n\n    this._elements.overlay.show();\n  }\n\n  /**\n   Returns {@link CycleButton} display options.\n\n   @return {CycleButtonDisplayModeEnum}\n   */\n  static get displayMode() {\n    return displayMode;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      displaymode: 'displayMode'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['icon', 'threshold', 'displaymode', 'aria-label', 'aria-labelledby']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    // The accessibility name for the button element\n    if (name === 'aria-label') {\n      const hasMenuItemRadioGroup = this._hasMenuItemRadioGroup();\n\n      // aria-labelledby takes precedence over aria-label\n      if (this.getAttribute('aria-labelledby')) {\n        // Button should be labeled by the container and the button, with the selected value, itself\n        this._elements.button.setAttribute('aria-labelledby', `${this.id} ${this._elements.button.id}`);\n\n        // Overlay should be labeled by the container with aria-label\n        this._elements.overlay.setAttribute('aria-labelledby', this.id);\n\n        // With both items and actions, the items should be grouped and the group should be labeled\n        // SelectList menuitemradio group should be labeled by the container with aria-label,\n        // Otherwise the selectList should not be labeled independantly from the menu\n        this._elements.selectList[hasMenuItemRadioGroup ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.id);\n      }\n      else {\n        //  With no aria-label, clean up aria-labelledby on _elements\n        this._elements.button.removeAttribute('aria-labelledby');\n        this._elements.overlay.setAttribute('aria-labelledby', this._elements.button.id);\n\n        // With both items and actions, the items should be grouped and the group should be labeled\n        // SelectList menuitemradio group should be labeled by the button, with the selected value, itself,\n        // Otherwise the selectList should not be labeled independantly from the menu\n        this._elements.selectList[hasMenuItemRadioGroup ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this._elements.button.id);\n      }\n    }\n    // The id reference for an HTML element that labels the button element accessibility name for the button element\n    else if (name === 'aria-labelledby') {\n      if (value || !this.getAttribute('aria-label')) {\n        this._elements.button.setAttribute('aria-labelledby', `${value} ${this._elements.button.id}`);\n        this._elements.overlay.setAttribute('aria-labelledby', value || this._elements.button.id);\n        this._elements.selectList[this._hasMenuItemRadioGroup() ? 'setAttribute' : 'removeAttribute']('aria-labelledby', value || this._elements.button.id);\n      }\n    }\n    else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    if (!this.id) {\n      this.id = this._id;\n    }\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (typeof this._threshold === 'undefined') {\n      this.threshold = 3;\n    }\n    if (!this._displayMode) {\n      this.displayMode = displayMode.ICON;\n    }\n\n    // checks the component's extended mode\n    this._checkExtended();\n\n    ['button', 'overlay'].forEach((handleName) => {\n      const handle = this.querySelector(`[handle=\"${handleName}\"]`);\n      if (handle) {\n        handle.remove();\n      }\n    });\n\n    const frag = document.createDocumentFragment();\n\n    // Render the base layout\n    frag.appendChild(this._elements.button);\n    frag.appendChild(this._elements.overlay);\n\n    // Inserting the template before the items\n    this.appendChild(frag);\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n\n  /**\n   Triggered when the {@link CycleButton} selected item has changed.\n\n   @typedef {CustomEvent} coral-cyclebutton:change\n\n   @property {CycleButtonItem} detail.oldSelection\n   The prior selected item(s).\n   @property {CycleButtonItem} detail.selection\n   The newly selected item(s).\n   */\n});\n\nexport default CycleButton;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1012,
    "kind": "typedef",
    "name": "CycleButtonDisplayModeEnum",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~CycleButtonDisplayModeEnum",
    "access": "public",
    "description": "Enumeration for {@link CycleButton} display options.",
    "lineNumber": 36,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ICON",
        "description": "Icon display mode."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TEXT",
        "description": "Text display mode."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ICON_TEXT",
        "description": "Icon and text display mode."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CycleButtonDisplayModeEnum"
    }
  },
  {
    "__docId__": 1013,
    "kind": "variable",
    "name": "WHITESPACE_REGEX",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~WHITESPACE_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used to remove whitespace from selectedItem label for use as an aria-label for accessibility.",
    "lineNumber": 47,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1014,
    "kind": "variable",
    "name": "ACTION_TAG_NAME",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~ACTION_TAG_NAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 50,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1015,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1016,
    "kind": "variable",
    "name": "CycleButton",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~CycleButton",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CycleButton}",
    "description": "A CycleButton component is a simple multi-state toggle button that toggles between the possible items below\na certain threshold, and shows them in a popover selector when above.",
    "lineNumber": 62,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CycleButton"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A CycleButton component is a simple multi-state toggle button that toggles between the possible items below\na certain threshold, and shows them in a popover selector when above."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-cyclebutton"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-cyclebutton></coral-cyclebutton>",
      "<caption>JS constructor</caption>\nnew Coral.CycleButton();"
    ],
    "see": [
      "../examples/#cyclebutton"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1017,
    "kind": "typedef",
    "name": "coral-cyclebutton:change",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButton.js~coral-cyclebutton:change",
    "access": "public",
    "description": "Triggered when the {@link CycleButton} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "CycleButtonItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected item(s)."
      },
      {
        "nullable": null,
        "types": [
          "CycleButtonItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected item(s)."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-cyclebutton:change"
    }
  },
  {
    "__docId__": 1018,
    "kind": "file",
    "name": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonAction.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.CycleButton.Action\n @classdesc A CycleButton Action component\n @htmltag coral-cyclebutton-action\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CycleButtonAction = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The Action's icon. See {@link Coral.Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    this._icon = transform.string(value);\n    this._reflectAttribute('icon', this._icon);\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.content || this).textContent.replace(/\\s{2,}/g, ' ').trim() || this.icon :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['icon']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'menuitem');\n    this.tabIndex = -1;\n  }\n});\n\nexport default CycleButtonAction;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonAction.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1019,
    "kind": "variable",
    "name": "CycleButtonAction",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonAction.js~CycleButtonAction",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CycleButton}",
    "description": "A CycleButton Action component",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CycleButton.Action"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A CycleButton Action component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-cyclebutton-action"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-cyclebutton-action></coral-cyclebutton-action>",
      "<caption>JS constructor</caption>\nnew Coral.CycleButton.Action();"
    ],
    "see": [
      "../examples/#cyclebutton"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1020,
    "kind": "file",
    "name": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enum for {CycleButtonItem} display options.\n\n @typedef {Object} CycleButtonItemDisplayModeEnum\n\n @property {String} ICON\n Icon display mode.\n @property {String} TEXT\n Text display mode.\n @property {String} ICON_TEXT\n Icon and text display mode.\n @property {String} INHERIT\n Inherit display mode.\n */\nconst displayMode = {\n  ICON: 'icon',\n  TEXT: 'text',\n  ICON_TEXT: 'icontext',\n  INHERIT: 'inherit'\n};\n\n/**\n @class Coral.CycleButton.Item\n @classdesc A CycleButton Item component\n @htmltag coral-cyclebutton-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst CycleButtonItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The Item's icon. See {@link Coral.Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    let _icon = transform.string(value);\n\n    if(this._icon === _icon) {\n      return;\n    }\n\n    this._icon = _icon;\n    this._reflectAttribute('icon', this._icon);\n\n    this.trigger('coral-cyclebutton-item:_iconchanged');\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Whether the Item is disabled. When set to true, this will prevent every user interacting with it.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this.disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n\n    if (this._disabled && this.selected) {\n      this.selected = false;\n    }\n\n    if (!this._disabled && !this.selected) {\n      // We inform the parent to verify if this item should be selected because it's the only one left\n      this.trigger('coral-cyclebutton-item:_validateselection');\n    }\n  }\n\n  /**\n   Whether the Item is selected.\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    let _selected = transform.booleanAttr(value);\n\n    if(this._selected === _selected) {\n      return;\n    }\n    \n    if (!_selected || _selected && !this.disabled) {\n      this._selected = _selected;\n      this._reflectAttribute('selected', this.disabled ? false : this._selected);\n\n      this.classList.toggle('is-selected', this._selected);\n      this.setAttribute('aria-checked', this._selected);\n\n      this.trigger('coral-cyclebutton-item:_selectedchanged');\n    }\n  }\n\n  /**\n   The displayMode to be used when the particular item is selected. When this value is set to <code>inherit</code>\n   it will defer to the component level displayMode. If the selected item does not have the necessary icon or text\n   information, then fallback to show whichever is available. The appearance of collapsed items in the popover are\n   not affected by this property.\n   See {@link CycleButtonItemDisplayModeEnum}.\n\n   @type {String}\n   @default CycleButtonItemDisplayModeEnum.INHERIT\n   @htmlattribute displaymode\n   @htmlattributereflected\n   */\n  get displayMode() {\n    return this._displayMode || displayMode.INHERIT;\n  }\n\n  set displayMode(value) {\n    let _value = transform.string(value).toLowerCase();\n    let _displayMode = validate.enumeration(displayMode)(_value) && _value || displayMode.INHERIT;\n\n    if(this._displayMode === _displayMode) {\n      return;\n    }\n\n    this._displayMode = _displayMode;\n    this._reflectAttribute('displaymode', this._displayMode);\n\n    this.trigger('coral-cyclebutton-item:_displaymodechanged');\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.content || this).textContent.replace(/\\s{2,}/g, ' ').trim() || this.icon :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /**\n   Returns {@link CycleButtonItem} display options.\n\n   @return {CycleButtonItemDisplayModeEnum}\n   */\n  static get displayMode() {\n    return displayMode;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      displaymode: 'displayMode'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'icon', 'displaymode']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'menuitemradio');\n\n    // Default reflected attributes\n    if (!this._displayMode) {\n      this.displayMode = displayMode.INHERIT;\n    }\n  }\n});\n\nexport default CycleButtonItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1021,
    "kind": "typedef",
    "name": "CycleButtonItemDisplayModeEnum",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js~CycleButtonItemDisplayModeEnum",
    "access": "public",
    "description": "Enum for {CycleButtonItem} display options.",
    "lineNumber": 31,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ICON",
        "description": "Icon display mode."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TEXT",
        "description": "Text display mode."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ICON_TEXT",
        "description": "Icon and text display mode."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INHERIT",
        "description": "Inherit display mode."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "CycleButtonItemDisplayModeEnum"
    }
  },
  {
    "__docId__": 1022,
    "kind": "variable",
    "name": "CycleButtonItem",
    "memberof": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-cyclebutton/src/scripts/CycleButtonItem.js~CycleButtonItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{CycleButton}",
    "description": "A CycleButton Item component",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.CycleButton.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A CycleButton Item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-cyclebutton-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-cyclebutton-item></coral-cyclebutton-item>",
      "<caption>JS constructor</caption>\nnew Coral.CycleButton.Item();"
    ],
    "see": [
      "../examples/#cyclebutton"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1023,
    "kind": "file",
    "name": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {DateTime} from '../../../coral-datetime';\nimport '../../../coral-component-button';\nimport '../../../coral-component-clock';\nimport '../../../coral-component-calendar';\nimport '../../../coral-component-popover';\nimport '../../../coral-component-textfield';\nimport base from '../templates/base';\nimport overlayContent from '../templates/overlayContent';\nimport {transform, commons, validate, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enum for {@link Datepicker} variant values.\n\n @typedef {Object} DatepickerVariantEnum\n\n @property {String} DEFAULT\n A default, gray Datepicker.\n @property {String} QUIET\n A Datepicker with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\nconst CLASSNAME = '_coral-InputGroup';\n\n// builds a string containing all possible variant classnames. This will be used to remove\n// classnames when the variant changes.\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantKey in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantKey]}`);\n}\n\n/** @ignore */\nfunction toMoment(value, format) {\n  if (value === 'today') {\n    return new DateTime.Moment();\n  } else if (DateTime.Moment.isMoment(value)) {\n    return value.isValid() ? value.clone() : null;\n  }\n\n  // if the value provided is a date it does not make sense to provide a format to parse the date\n  const result = new DateTime.Moment(value, value instanceof Date ? null : format);\n  return result.isValid() ? result : null;\n}\n\n/**\n Enumeration for {@link Datepicker} variants.\n\n @typedef {Object} DatepickerTypeEnum\n\n @property {String} DATE\n The selection overlay contains only a calendar.\n @property {String} DATETIME\n Provides both calendar and time controls in the selection overlay.\n @property {String} TIME\n The selection overlay provides only time controls.\n */\nconst type = {\n  DATE: 'date',\n  DATETIME: 'datetime',\n  TIME: 'time'\n};\n\n// Used to determine if the client is on a mobile device\nconst IS_MOBILE_DEVICE = navigator.userAgent.match(/iPhone|iPad|iPod|Android/i) !== null;\n\nconst NATIVE_FORMATS = {\n  date: 'YYYY-MM-DD',\n  datetime: 'YYYY-MM-DD[T]HH:mmZ',\n  time: 'HH:mm'\n};\n\nconst isNativeFormat = (format) => {\n  let res = false;\n  for (const key in NATIVE_FORMATS) {\n    if (format === NATIVE_FORMATS[key]) {\n      res = true;\n    }\n  }\n  return res;\n};\n\n/**\n @class Coral.Datepicker\n @classdesc A Datepicker component that can be used as a date and time selection form field. Leverages {@link momentJS}\n if loaded on the page.\n @htmltag coral-datepicker\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Datepicker = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {commons, i18n});\n    // Creates and stores the contents of the popover separately\n    this._calendarFragment = overlayContent.call(this._elements, {commons, i18n});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    const overlayId = this._elements.overlay.id;\n    const events = {};\n    events[`global:capture:click #${overlayId} coral-calendar`] = '_onCalendarDayClick';\n    events[`global:capture:change #${overlayId}`] = '_onChange';\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_onPopoverBeforeOpen';\n    events[`global:capture:coral-overlay:open #${overlayId}`] = '_onPopoverOpenOrClose';\n    events[`global:capture:coral-overlay:close #${overlayId}`] = '_onPopoverOpenOrClose';\n    events['key:alt+down [handle=\"input\"],[handle=\"toggle\"]'] = '_onAltDownKey';\n    events['key:down [handle=\"toggle\"]'] = '_onAltDownKey';\n    events['change coral-datepicker > input[is=\"coral-textfield\"]'] = '_onInputChange';\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, events));\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The type of datepicker to show to the user. See {@link DatepickerTypeEnum}.\n\n   @type {DatepickerTypeEnum}\n   @default DatepickerTypeEnum.DATE\n   @htmlattribute type\n   @htmlattributereflected\n   */\n  get type() {\n    return this._type || type.DATE;\n  }\n\n  set type(value) {\n    // Flag to indicate that we are changing the type for the first time\n    this._typeFormatChanged = typeof this._type === 'undefined';\n\n    value = transform.string(value).toLowerCase();\n    this._type = validate.enumeration(type)(value) && value || type.DATE;\n    this._reflectAttribute('type', this._type);\n\n    const format = NATIVE_FORMATS[this._type];\n    const isTime = this._type === type.TIME;\n    const isDate = this._type === type.DATE;\n\n    this._elements.icon.icon = isTime ? 'clock' : 'calendar';\n\n    const toggleLabel = isTime ? i18n.get('Time') : i18n.get('Calendar');\n    this._elements.toggle.setAttribute('aria-label', toggleLabel);\n    this._elements.toggle.setAttribute('title', toggleLabel);\n\n    this._elements.clock.hidden = isDate;\n    this._elements.clock.setAttribute('aria-hidden', isDate);\n\n    this._elements.calendar.hidden = isTime;\n    this._elements.calendar.setAttribute('aria-hidden', isTime);\n\n    // Change format if we have a native format set\n    if (isNativeFormat(this.valueFormat)) {\n      this.valueFormat = format;\n    }\n    if (isNativeFormat(this.displayFormat)) {\n      this.displayFormat = format;\n    }\n\n    this._useNativeInput = this._useNativeInput;\n\n    this._typeFormatChanged = false;\n  }\n\n  /**\n   The format used to display the selected date(time) to the user. If the user manually types a date, this format\n   will be used to parse the value. When using this component on a mobile device, the display format must follow\n   the format used by the native input. If an empty string is provided, then the default value per type will\n   be used. The default value depends on the <code>type</code>, which can be one from <code>YYYY-MM-DD</code>,\n   <code>YYYY-MM-DD[T]HH:mmZ</code> or <code>HH:mm</code>.  Include momentjs to support additional format string options\n   see http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"YYYY-MM-DD\"\n   @htmlattribute displayformat\n   @htmlattributereflected\n   */\n  get displayFormat() {\n    // we ignore _useNativeInput when the type is datetime because it is not supported by mobile libraries\n    if (this._useNativeInput && this.type !== type.DATETIME) {\n      return NATIVE_FORMATS[this.type];\n    }\n\n    return typeof this._displayFormat === 'undefined' ? NATIVE_FORMATS[this.type] : this._displayFormat;\n  }\n\n  set displayFormat(value) {\n    value = transform.string(value).trim();\n\n    // In case a custom display format was set, we make sure that type doesn't change it to a native format\n    const displayFormatAttribute = this.getAttribute('displayformat');\n    if (this._typeFormatChanged && displayFormatAttribute && displayFormatAttribute !== value) {\n      value = displayFormatAttribute;\n    }\n\n    this._displayFormat = value === '' ? NATIVE_FORMATS[this.type] : value;\n    this._reflectAttribute('displayformat', this._displayFormat);\n\n    this._elements.clock.displayFormat = this._displayFormat;\n    this._elements.input.value = this._getValueAsString(this._value, this._displayFormat);\n  }\n\n  /**\n   The format to use on expressing the selected date as a string on the <code>value</code> attribute. The value\n   will be sent to the server using this format. If an empty string is provided, then the default value per type\n   will be used. The default value depends on the <code>type</code>, which can be one from <code>YYYY-MM-DD</code>,\n   <code>YYYY-MM-DD[T]HH:mmZ</code> or <code>HH:mm</code>. Include momentjs to support additional format string options\n   see http://momentjs.com/docs/#/displaying/.\n\n   @type {String}\n   @default \"YYYY-MM-DD\"\n   @htmlattribute valueformat\n   @htmlattributereflected\n   */\n  get valueFormat() {\n    return typeof this._valueFormat === 'undefined' ? NATIVE_FORMATS[this.type] : this._valueFormat;\n  }\n\n  set valueFormat(value) {\n    const setValueFormat = (newValue) => {\n      this._valueFormat = newValue === '' ? NATIVE_FORMATS[this.type] : newValue;\n      this._reflectAttribute('valueformat', this._valueFormat);\n    };\n\n    value = transform.string(value).trim();\n\n    // In case a custom display format was set, we make sure that type doesn't change it to a native format\n    const valueFormatAttribute = this.getAttribute('valueformat');\n    if (this._typeFormatChanged && valueFormatAttribute && valueFormatAttribute !== value) {\n      value = valueFormatAttribute;\n    }\n\n    // Once the valueFormat is set, we make sure the value is also correct\n    if (!this._valueFormat && this._originalValue) {\n      setValueFormat(value);\n      this.value = this._originalValue;\n    } else {\n      setValueFormat(value);\n    }\n\n    this._elements.calendar.valueFormat = this._valueFormat;\n    this._elements.hiddenInput.value = this.value;\n  }\n\n  /**\n   The value of the element, interpreted as a date, or <code>null</code> if conversion is not possible.\n\n   @type {Date}\n   @default null\n   */\n  get valueAsDate() {\n    let value = this._value;\n\n    // If type is DATE, then you strip out the time\n    if (this.type === 'date' && value) {\n      value = value.startOf('day');\n    }\n\n    return value ? value.toDate() : null;\n  }\n\n  set valueAsDate(value) {\n    this._valueAsDate = value instanceof Date ? new DateTime.Moment(value) : '';\n\n    this.value = this._valueAsDate;\n  }\n\n  /**\n   The minimum date that the Datepicker will accept as valid. It must not be greated that its maximum. It accepts\n   both date and string values. When a string is provided, it should match the {@link Coral.Datepicker#valueFormat}.\n\n   See {@link Coral.Calendar#min}\n\n   @type {String|Date}\n   @default null\n   @htmlattribute min\n   */\n  get min() {\n    return this._elements.calendar.min;\n  }\n\n  set min(value) {\n    this._elements.calendar.min = value;\n  }\n\n  /**\n   The maximum date that the Datepicker will accept as valid. It must not be less than its minimum. It accepts both\n   date and string values. When a string is provided, it should match the {@link Coral.Datepicker#valueFormat}.\n\n   See {@link Coral.Calendar#max}\n\n   @type {String|Date}\n   @default null\n   @htmlattribute max\n   */\n  get max() {\n    return this._elements.calendar.max;\n  }\n\n  set max(value) {\n    this._elements.calendar.max = value;\n  }\n\n  /**\n   The format used to display the current month and year.\n   'MMMM YYYY' is supported by default. Include momentjs to support additional format string options see\n   http://momentjs.com/docs/#/displaying/.\n\n   See {@link Coral.Calendar#startDay}\n\n   @type {String}\n   @default \"MMMM YYYY\"\n   @htmlattribute headerformat\n   */\n  get headerFormat() {\n    return this._elements.calendar.headerFormat;\n  }\n\n  set headerFormat(value) {\n    this._elements.calendar.headerFormat = value;\n  }\n\n  /**\n   Defines the start day for the week, 0 = Sunday, 1 = Monday etc., as depicted on the calendar days grid.\n\n   See {@link Coral.Calendar#startDay}\n\n   @type {Number}\n   @default 0\n   @htmlattribute startday\n   */\n  get startDay() {\n    return this._elements.calendar.startDay;\n  }\n\n  set startDay(value) {\n    this._elements.calendar.startDay = value;\n  }\n\n  /**\n   The current value. When set to \"today\", the value is coerced into the client's local date expressed as string\n   formatted in accordance to the set <code>valueFormat</code>.\n\n   See {@link Coral.Calendar#value}\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._getValueAsString(this._value, this.valueFormat);\n  }\n\n  set value(value) {\n    // This is used to change the value if valueformat is also set but afterwards\n    this._originalValue = value;\n\n    this._value = toMoment(value, this.valueFormat);\n\n    this._elements.calendar.valueAsDate = this.valueAsDate;\n    this._elements.clock.valueAsDate = this.valueAsDate;\n    this._elements.input.value = this._getValueAsString(this._value, this.displayFormat);\n    this._elements.hiddenInput.value = this.value;\n  }\n\n  /**\n   Short hint that describes the expected value of the Datepicker. It is displayed when the Datepicker is empty.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  get placeholder() {\n    return this._elements.input.placeholder;\n  }\n\n  set placeholder(value) {\n    this._elements.input.placeholder = value;\n    this._reflectAttribute('placeholder', this.placeholder);\n  }\n\n  /**\n   The datepicker's variant. See {@link DatepickerVariantEnum}.\n\n   @type {DatepickerVariantEnum}\n   @default DatepickerVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n\n    // passes down the variant to the underlying components\n    this._elements.input.variant = this._variant;\n    this._elements.toggle.classList.toggle('_coral-FieldButton--quiet', this._variant === variant.QUIET);\n\n    // removes every existing variant\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant !== variant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._variant}`);\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.hiddenInput.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.hiddenInput.name = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.input.disabled = this._disabled;\n    this._elements.hiddenInput.disabled = this._disabled;\n    this._elements.toggle.disabled = this._disabled || this.readOnly;\n    this._elements.toggle.setAttribute(\"tabindex\", !this._elements.toggle.disabled ? \"0\" : \"-1\");\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this.classList.toggle('is-invalid', this.invalid);\n    this._elements.toggle.classList.toggle('is-invalid', this.invalid);\n    this._elements.input.invalid = this.invalid;\n    this._elements.input.setAttribute('aria-invalid', this.invalid);\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n    // this._elements.toggle.classList.toggle('is-invalid', this._required);\n    // this._elements.input.required = this._required;\n    this._elements.input.setAttribute(\"aria-required\", this._required);\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.hiddenInput.readOnly = this.readOnly;\n    this._elements.input.readOnly = this._readOnly;\n    this._elements.toggle.disabled = this._readOnly || this.disabled;\n    this._elements.toggle.setAttribute(\"tabindex\", !this._elements.toggle.disabled ? \"0\" : \"-1\");\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    this[this.labelled ? 'setAttribute' : 'removeAttribute']('aria-label', this.labelled);\n    this._elements.overlay[this.labelled ? 'setAttribute' : 'removeAttribute']('aria-label', this.labelled);\n    this._elements.calendar[this.labelled ? 'setAttribute' : 'removeAttribute']('labelled', this.labelled);\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    this[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n    this._elements.overlay[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n    this._elements.calendar[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n  }\n\n  /**\n   When <code>true</code> the component will default to the native input for the date selection. When\n   {@link Coral.Datepicker.type.DATETIME} has been set, it will still use the Coral way because mobile browsers\n   cannot handle a datetime input.\n\n   @ignore\n   */\n  get _useNativeInput() {\n    return this.__useNativeInput;\n  }\n\n  set _useNativeInput(value) {\n    this.__useNativeInput = value;\n\n    // we ignore _useNativeInput when the type is datetime because it is not supported by mobile libraries\n    if (this.__useNativeInput && this.type !== type.DATETIME) {\n      // Switch to native date/time picker:\n      this._elements.toggle.hidden = true;\n      this._elements.input.setAttribute('type', this.type);\n\n      // Hide pop-over and remove related attributes:\n      this._elements.overlay.hidden = true;\n      this._elements.input.removeAttribute('role');\n      this._elements.input.removeAttribute('aria-autocomplete');\n      this._elements.input.removeAttribute('aria-haspopup');\n      this._elements.input.removeAttribute('aria-expanded');\n      this._elements.input.removeAttribute('aria-controls');\n    } else {\n      // Switch to Calendar picker\n      this._elements.toggle.hidden = false;\n      this._elements.input.setAttribute('type', 'text');\n\n      // Show pop-over and add related attributes:\n      this._elements.overlay.hidden = false;\n\n      // Input attributes per ARIA Autocomplete\n      this._elements.input.setAttribute('role', 'combobox');\n      this._elements.input.setAttribute('aria-autocomplete', 'none');\n      this._elements.input.setAttribute('aria-expanded', this._elements.overlay.open);\n      this._elements.input.setAttribute('aria-controls', this._elements.overlay.id);\n\n      // Trigger button attributes per ARIA Autocomplete\n      this._elements.toggle.setAttribute('aria-haspopup', 'dialog');\n      this._elements.toggle.setAttribute('aria-expanded', this._elements.overlay.open);\n      this._elements.toggle.setAttribute('aria-controls', this._elements.overlay.id);\n    }\n  }\n\n  /** @ignore */\n  _onPopoverBeforeOpen() {\n    this._elements.calendar._validateCalendar();\n    this._renderCalendar();\n  }\n\n  /**\n   Matches the accessibility to the state of the popover.\n\n   @ignore\n   */\n  _onPopoverOpenOrClose(event) {\n    // set focus to calendar grid\n    if (this._elements.overlay.open) {\n      if (this.type === type.TIME) {\n        this._elements.clock.focus();\n      } else {\n        this._elements.calendar.focus();\n      }\n      this._elements.input.setAttribute('aria-expanded', 'true');\n      this._elements.toggle.setAttribute('aria-expanded', 'true');\n      this._trackEvent('open', 'coral-datepicker', event);\n    } else {\n\n      if(this._elements.hiddenInput.value) {\n        this._elements.input.focus();\n      } else {\n        this._elements.toggle.focus();\n      }\n\n      this._elements.input.setAttribute('aria-expanded', 'false');\n      this._elements.toggle.setAttribute('aria-expanded', 'false');\n      this._trackEvent('close', 'coral-datepicker', event);\n    }\n  }\n\n  /** @ignore */\n  _onCalendarDayClick(event) {\n    if (event.target.tagName === 'A') {\n      // since a selection has been made, we close the popover. we cannot use the _onChange listener to handle this\n      // because clicking on the same button will not trigger a change event\n      this._elements.overlay.open = false;\n      this._trackEvent('click', 'coral-datepicker', event);\n    }\n  }\n\n  /** @ignore */\n  _onInputChange(event) {\n    // because we are reimplementing the form field mix in, we will have to stop the propagation and trigger the\n    // 'change' event from here\n    event.stopPropagation();\n\n    this.value = new DateTime.Moment(event.target.value, this.displayFormat);\n    this._validateValue();\n\n    this.trigger('change');\n    this._trackEvent('change', 'coral-datepicker', event);\n  }\n\n  /** @ignore */\n  _onChange(event) {\n    if (event.target.tagName === 'CORAL-CALENDAR' || event.target.tagName === 'CORAL-CLOCK') {\n      event.stopPropagation();\n\n      // we create the new value using both calendar and clock controls\n      // datepicker should set the current time as default when no time is set, but a date was chosen (if in datetime\n      // mode)\n      this.value = this._mergeCalendarAndClockDates(true);\n      this._validateValue();\n\n      this.trigger('change');\n    }\n  }\n\n  /** @private */\n  _onAltDownKey(event) {\n    // Stop any consequences of pressing the key\n    event.preventDefault();\n\n    if (!this._elements.overlay.open) {\n      this._elements.overlay.open = true;\n    }\n  }\n\n  /** @ignore */\n  _validateValue() {\n    // calendar validates only on user input, we have to manually force the validation\n    this._elements.calendar._validateCalendar();\n\n    // check if the current value is valid and update the internal state of the component\n    if (this.type === type.DATE) {\n      this.invalid = this._elements.calendar.invalid;\n    } else if (this.type === type.TIME) {\n      this.invalid = this._elements.clock.invalid;\n    } else {\n      this.invalid = this._elements.calendar.invalid || this._elements.clock.invalid;\n    }\n  }\n\n  /** @ignore */\n  _mergeCalendarAndClockDates(autoSetTimeIfNeeded) {\n    let value = new DateTime.Moment(this._elements.calendar.valueAsDate);\n    let time = this._elements.clock.valueAsDate;\n\n    if (autoSetTimeIfNeeded && value && !time && this.type === type.DATETIME) {\n      // datepicker should set the current time as default when no time is set, but a date was chosen (if in datetime\n      // mode)\n      time = new DateTime.Moment().toDate();\n    }\n\n    if (time) {\n      if (!value.isValid()) {\n        value = new DateTime.Moment();\n      }\n\n      value.hours(time.getHours());\n      value.minutes(time.getMinutes());\n    }\n\n    return value;\n  }\n\n  /**\n   Helper class that converts the internal moment value into a String using the provided date format. If the value is\n   invalid, empty string will be returned.\n\n   @param {?Moment} value\n   The value representing the date. It has to be a moment object or <code>null</code>\n   @param {String} format\n   The Date format to be used.\n\n   @ignore\n   */\n  _getValueAsString(value, format) {\n    return value && value.isValid() ? value.format(format) : '';\n  }\n\n  /** @ignore */\n  _renderCalendar() {\n    if (this._elements.overlay.content.innerHTML === '') {\n      this._elements.overlay.content.appendChild(this._calendarFragment);\n      this._calendarFragment = undefined;\n    }\n  }\n\n  /**\n   Returns {@link Datepicker} variants.\n\n   @return {DatepickerVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link Datepicker} types.\n\n   @return {DatepickerTypeEnum}\n   */\n  static get type() {\n    return type;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      startday: 'startDay',\n      headerformat: 'headerFormat',\n      displayformat: 'displayFormat',\n      valueformat: 'valueFormat'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'min',\n      'max',\n      'type',\n      'placeholder',\n      'startday',\n      'headerFormat',\n      'displayformat',\n      'valueformat',\n      'variant'\n    ]);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n\n    this.setAttribute('role', 'group');\n\n    // Input attributes per ARIA Autocomplete\n    this._elements.input.setAttribute('role', 'combobox');\n    this._elements.input.setAttribute('aria-autocomplete', 'none');\n    this._elements.input.setAttribute('aria-expanded', 'false');\n    this._elements.input.setAttribute('aria-controls', this._elements.overlay.id);\n\n    // Trigger button attributes per ARIA Autocomplete\n    this._elements.toggle.setAttribute('aria-haspopup', 'dialog');\n    this._elements.toggle.setAttribute('aria-expanded', 'false');\n    this._elements.toggle.setAttribute('aria-controls', this._elements.overlay.id);\n\n    // a11y we only have AUTO mode.\n    this._useNativeInput = IS_MOBILE_DEVICE;\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n    // \"type\" takes care of reflecting \"displayFormat\" and \"valueFormat\"\n    if (!this._type) {\n      this.type = type.DATE;\n    }\n\n    // clean up to be able to clone it\n    while (this.firstChild) {\n      this.removeChild(this.firstChild);\n    }\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.hiddenInput);\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.toggle);\n    frag.appendChild(this._elements.overlay);\n\n    // Point at the button from the bottom\n    this._elements.overlay.target = this._elements.toggle;\n\n    this.appendChild(frag);\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n});\n\nexport default Datepicker;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1024,
    "kind": "typedef",
    "name": "DatepickerVariantEnum",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~DatepickerVariantEnum",
    "access": "public",
    "description": "Enum for {@link Datepicker} variant values.",
    "lineNumber": 36,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default, gray Datepicker."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A Datepicker with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DatepickerVariantEnum"
    }
  },
  {
    "__docId__": 1025,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 41,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1026,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 45,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1027,
    "kind": "function",
    "name": "toMoment",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~toMoment",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 51,
    "ignore": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      },
      {
        "name": "format",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1028,
    "kind": "typedef",
    "name": "DatepickerTypeEnum",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~DatepickerTypeEnum",
    "access": "public",
    "description": "Enumeration for {@link Datepicker} variants.",
    "lineNumber": 75,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DATE",
        "description": "The selection overlay contains only a calendar."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DATETIME",
        "description": "Provides both calendar and time controls in the selection overlay."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TIME",
        "description": "The selection overlay provides only time controls."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DatepickerTypeEnum"
    }
  },
  {
    "__docId__": 1029,
    "kind": "variable",
    "name": "IS_MOBILE_DEVICE",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~IS_MOBILE_DEVICE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 82,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1030,
    "kind": "variable",
    "name": "NATIVE_FORMATS",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~NATIVE_FORMATS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 84,
    "undocument": true,
    "type": {
      "types": [
        "{\"date\": string, \"datetime\": string, \"time\": string}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1031,
    "kind": "function",
    "name": "isNativeFormat",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~isNativeFormat",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 90,
    "undocument": true,
    "params": [
      {
        "name": "format",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1032,
    "kind": "variable",
    "name": "Datepicker",
    "memberof": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-datepicker/src/scripts/Datepicker.js~Datepicker",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Datepicker}",
    "description": "A Datepicker component that can be used as a date and time selection form field. Leverages {@link momentJS}\nif loaded on the page.",
    "lineNumber": 109,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Datepicker"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Datepicker component that can be used as a date and time selection form field. Leverages {@link momentJS}\nif loaded on the page."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-datepicker"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-datepicker></coral-datepicker>",
      "<caption>JS constructor</caption>\nnew Coral.Datepicker();"
    ],
    "see": [
      "../examples/#datepicker"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1033,
    "kind": "file",
    "name": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseOverlay} from '../../../coral-base-overlay';\nimport {DragAction} from '../../../coral-dragaction';\nimport {Icon} from '../../../coral-component-icon';\nimport '../../../coral-component-button';\nimport base from '../templates/base';\nimport {commons, transform, validate, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Dialog} closable options.\n\n @typedef {Object} DialogClosableEnum\n\n @property {String} ON\n Show a close button on the dialog and close the dialog when clicked.\n @property {String} OFF\n Do not show a close button. Elements with the <code>coral-close</code> attribute will still close the dialog.\n */\nconst closable = {\n  ON: 'on',\n  OFF: 'off'\n};\n\nconst keyCodes = {\n  UP: 38,\n  DOWN: 40,\n  LEFT: 37,\n  RIGHT: 39,\n};\n\n/**\n Enumeration for {@link Dialog} keyboard interaction options.\n\n @typedef {Object} DialogInteractionEnum\n\n @property {String} ON\n Keyboard interaction is enabled.\n @property {String} OFF\n Keyboard interaction is disabled.\n */\nconst interaction = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link Dialog} variants.\n\n @typedef {Object} DialogVariantEnum\n\n @property {String} DEFAULT\n A default dialog without header icon.\n @property {String} ERROR\n A dialog with an error header and icon, indicating that an error has occurred.\n @property {String} WARNING\n A dialog with a warning header and icon, notifying the user of something important.\n @property {String} SUCCESS\n A dialog with a success header and icon, indicates to the user that an operation was successful.\n @property {String} HELP\n A dialog with a question header and icon, provides the user with help.\n @property {String} INFO\n A dialog with an info header and icon, informs the user of non-critical information.\n */\nconst variant = {\n  DEFAULT: 'default',\n  ERROR: 'error',\n  WARNING: 'warning',\n  SUCCESS: 'success',\n  HELP: 'help',\n  INFO: 'info'\n};\n\n/**\n Enumeration for {@link Dialog} backdrops.\n\n @typedef {Object} DialogBackdropEnum\n\n @property {String} NONE\n No backdrop.\n @property {String} MODAL\n A backdrop that hides the dialog when clicked.\n @property {String} STATIC\n A backdrop that does not hide the dialog when clicked.\n */\nconst backdrop = {\n  NONE: 'none',\n  MODAL: 'modal',\n  STATIC: 'static'\n};\n\n// Used to map icon with variant\nconst capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);\n\n// The dialog's base classname\nconst CLASSNAME = '_coral-Dialog';\n// Modifier classnames\nconst FULLSCREEN_CLASSNAME = `${CLASSNAME}--fullscreenTakeover`;\n\n// A string of all possible variant classnames\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Dialog\n @classdesc A Dialog component that supports various use cases with custom content. The Dialog can be given a size by\n using the special attribute <code>[coral-dialog-size]</code> as selector.\n @htmltag coral-dialog\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseOverlay}\n */\nconst Dialog = Decorator(class extends BaseOverlay(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = commons.extend(this._elements, {\n      // Fetch or create the content zone elements\n      header: this.querySelector('coral-dialog-header') || document.createElement('coral-dialog-header'),\n      content: this.querySelector('coral-dialog-content') || document.createElement('coral-dialog-content'),\n      footer: this.querySelector('coral-dialog-footer') || document.createElement('coral-dialog-footer')\n    });\n    base.call(this._elements, {i18n});\n\n    // Events\n    this._delegateEvents({\n      'coral-overlay:open': '_handleOpen',\n      'click [coral-close]': '_handleCloseClick',\n\n      // Since we cover the backdrop with ourself for positioning purposes, this is implemented as a click listener\n      // instead of using backdropClickedCallback\n      'click': '_handleClick',\n\n      // Handle resize events\n      'global:resize': 'center',\n\n      'global:key:escape': '_handleEscape'\n    });\n\n    // Override defaults from Overlay\n    this._trapFocus = this.constructor.trapFocus.ON;\n    this._returnFocus = this.constructor.returnFocus.ON;\n    this._overlayAnimationTime = this.constructor.FADETIME;\n\n    // Listen for mutations\n    this._headerObserver = new MutationObserver(this._hideHeaderIfEmpty.bind(this));\n\n    // Watch for changes to the header element's children\n    this._observeHeader();\n  }\n\n  /**\n   Whether keyboard interaction is enabled. See {@link DialogInteractionEnum}.\n\n   @type {DialogInteractionEnum}\n   @default DialogInteractionEnum.ON\n   */\n  get interaction() {\n    return this._interaction || interaction.ON;\n  }\n\n  set interaction(value) {\n    value = transform.string(value).toLowerCase();\n    this._interaction = validate.enumeration(interaction)(value) && value || interaction.ON;\n  }\n\n  /**\n   The dialog header element.\n\n   @type {DialogHeader}\n   @contentzone\n   */\n  get header() {\n    return this._getContentZone(this._elements.header);\n  }\n\n  set header(value) {\n    this._setContentZone('header', value, {\n      handle: 'header',\n      tagName: 'coral-dialog-header',\n      insert: function (header) {\n        header.classList.add(`${CLASSNAME}-title`);\n        // Position the header between the drag zone and the type icon\n        this._elements.headerWrapper.insertBefore(header, this._elements.dragZone.nextElementSibling);\n      },\n      set: function () {\n        // Stop observing the old header and observe the new one\n        this._observeHeader();\n\n        // Check if header needs to be hidden\n        this._hideHeaderIfEmpty();\n      }\n    });\n  }\n\n  /**\n   The dialog content element.\n\n   @type {DialogContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-dialog-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}-content`);\n        const footer = this.footer;\n        // The content should always be before footer\n        this._elements.wrapper.insertBefore(content, this.contains(footer) && footer || null);\n      }\n    });\n  }\n\n  /**\n   The dialog footer element.\n\n   @type {DialogFooter}\n   @contentzone\n   */\n  get footer() {\n    return this._getContentZone(this._elements.footer);\n  }\n\n  set footer(value) {\n    this._setContentZone('footer', value, {\n      handle: 'footer',\n      tagName: 'coral-dialog-footer',\n      insert: function (footer) {\n        footer.classList.add(`${CLASSNAME}-footer`);\n        // The footer should always be after content\n        this._elements.wrapper.appendChild(footer);\n      }\n    });\n  }\n\n  /**\n   The backdrop configuration for this dialog. See {@link DialogBackdropEnum}.\n\n   @type {String}\n   @default DialogBackdropEnum.MODAL\n   @htmlattribute backdrop\n   */\n  get backdrop() {\n    return this._backdrop || backdrop.MODAL;\n  }\n\n  set backdrop(value) {\n    value = transform.string(value).toLowerCase();\n    this._backdrop = validate.enumeration(backdrop)(value) && value || backdrop.MODAL;\n\n    const showBackdrop = this._backdrop !== backdrop.NONE;\n    this._elements.wrapper.classList.toggle(`${CLASSNAME}--noBackdrop`, !showBackdrop);\n\n    // We're visible now, so hide or show the modal accordingly\n    if (this.open && showBackdrop) {\n      this._showBackdrop();\n    }\n  }\n\n  /**\n   The dialog's variant. See {@link DialogVariantEnum}.\n\n   @type {String}\n   @default DialogVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    // Insert SVG icon\n    this._insertTypeIcon();\n\n    // Remove all variant classes\n    this._elements.wrapper.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant === variant.DEFAULT) {\n      // ARIA\n      this.setAttribute('role', 'dialog');\n    } else {\n      // Set new variant class\n      this._elements.wrapper.classList.add(`${CLASSNAME}--${this._variant}`);\n\n      // ARIA\n      this.setAttribute('role', 'alertdialog');\n    }\n\n    const hasHeader = this.header && this.header.textContent !== '';\n\n    // If the dialog has a header and is not otherwise labelled,\n    if (hasHeader && !(this.hasAttribute('aria-labelledby') || this.hasAttribute('aria-label'))) {\n      this.header.id = this.header.id || commons.getUID();\n\n      // label the dialog with a reference to the header\n      this.setAttribute('aria-labelledby', this.header.id);\n    }\n\n    // Provide the ARIA heading role to coral dialog header\n    // depending on whether the header contains focusable elements\n    if (hasHeader) {\n      if (this.header.querySelector(commons.FOCUSABLE_ELEMENT_SELECTOR) !== null) {\n        this.header.removeAttribute('role');\n        this.header.removeAttribute('aria-level');\n      } else if (!this.header.hasAttribute('role')) {\n        this.header.setAttribute('role', 'heading');\n        this.header.setAttribute('aria-level', '2');\n      }\n    }\n\n    // If the dialog has no content, or the content is empty, do nothing further.\n    if (!this.content || this.content.textContent === '') {\n      return;\n    }\n\n    // If the dialog has a content,\n    this.content.id = this.content.id || commons.getUID();\n\n    // In an alertdialog with a content region, if the alertdialog is not otherwise described.\n    if (this._variant !== variant.DEFAULT) {\n\n      // with no header,\n      if (!hasHeader) {\n\n        // label the alertdialog with a reference to the content\n        this.setAttribute('aria-labelledby', this.content.id);\n      }\n\n      // otherwise, if the alertdialog is not otherwise described,\n      else if (!this.hasAttribute('aria-describedby')) {\n\n        // ensure that the alertdialog is described by the content.\n        this.setAttribute('aria-describedby', this.content.id);\n      }\n    } else if (this.getAttribute('aria-labelledby') === this.content.id) {\n      this.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /**\n   Whether the dialog should be displayed full screen (without borders or margin).\n\n   @type {Boolean}\n   @default false\n   @htmlattribute fullscreen\n   @htmlattributereflected\n   */\n  get fullscreen() {\n    return this._fullscreen || false;\n  }\n\n  set fullscreen(value) {\n    this._fullscreen = transform.booleanAttr(value);\n    this._reflectAttribute('fullscreen', this._fullscreen);\n\n    if (this._fullscreen) {\n      // Full screen and movable are not compatible\n      this.movable = false;\n      this._elements.wrapper.classList.add(FULLSCREEN_CLASSNAME);\n    } else {\n      this._elements.wrapper.classList.remove(FULLSCREEN_CLASSNAME);\n    }\n  }\n\n  /**\n   Inherited from {@link BaseOverlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    super.open = value;\n\n    // Ensure we're in the DOM\n    if (this.open) {\n      // If not child of document.body, we have to move it there\n      this._moveToDocumentBody();\n\n      // Show the backdrop, if necessary\n      if (this.backdrop !== backdrop.NONE) {\n        this._showBackdrop();\n      }\n    }\n\n    // Support animation\n    requestAnimationFrame(() => {\n      // Support wrapped dialog\n      this._elements.wrapper.classList.toggle('is-open', this.open);\n\n      // Handles what to focus based on focusOnShow\n      if (this.open) {\n        commons.transitionEnd(this._elements.wrapper, () => {\n          this._handleFocus();\n          this._elements.closeButton.tabIndex = 0;\n          this._elements.closeButton.removeAttribute('coral-tabcapture');\n        });\n      } else {\n        this._elements.closeButton.tabIndex = -1;\n        this._elements.closeButton.setAttribute('coral-tabcapture', '');\n      }\n    });\n  }\n\n  /**\n   The dialog's icon.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.icon;\n  }\n\n  set icon(value) {\n    this._elements.icon = value;\n  }\n\n  /**\n   Whether the dialog should have a close button. See {@link DialogClosableEnum}.\n\n   @type {String}\n   @default DialogClosableEnum.OFF\n   @htmlattribute closable\n   @htmlattributereflected\n   */\n  get closable() {\n    return this._closable || closable.OFF;\n  }\n\n  set closable(value) {\n    value = transform.string(value).toLowerCase();\n    this._closable = validate.enumeration(closable)(value) && value || closable.OFF;\n    this._reflectAttribute('closable', this._closable);\n\n    this._elements.wrapper.classList.toggle(`${CLASSNAME}--dismissible`, this._closable === closable.ON);\n  }\n\n  /**\n   Whether the dialog can moved around by dragging the title.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute movable\n   @htmlattributereflected\n   */\n  get movable() {\n    return this._movable || false;\n  }\n\n  set movable(value) {\n    this._movable = transform.booleanAttr(value);\n    this._reflectAttribute('movable', this._movable);\n    const wrapper = this;\n    const header = this._elements.headerWrapper;\n\n    // Movable and fullscreen are not compatible\n    if (this._movable) {\n      this.fullscreen = false;\n    }\n\n    if (this._movable) {\n      const dragAction = new DragAction(this);\n      dragAction.handle = this._elements.headerWrapper;\n\n      if (header && wrapper) {\n        if (!this.keyboardHandler) {\n          this.keyboardHandler = (event) => {\n            this.dialogKeyboardHandler(event, wrapper, header);\n          };\n        }\n\n        // make sure the event is added when fullscreen is false\n        commons.nextFrame(() => {\n          if (!this.fullscreen) {\n            commons.nextFrame(() => this.addKeyboardHandler(header, wrapper));\n          }\n        });\n      }\n    } else {\n      // Disables any dragging interaction\n      if (this.dragAction) {\n        this.dragAction.destroy();\n      }\n\n      // Remove any previos added keyboard listener\n      commons.nextFrame(() => {\n        if (this.fullscreen) {\n          this.removeKeyboardHandler(header);\n        }\n      });\n\n      // Recenter the dialog once it's not movable anymore\n      this.center();\n    }\n  }\n\n  addKeyboardHandler(header, wrapper) {\n    if (!header || !this._movable) return;\n\n    header.setAttribute(\"tabindex\", 0);\n    header.setAttribute(\"aria-label\", i18n.get(\"Move Dialog\"));\n  \n    if (!this.keyboardHandler) {\n      this.keyboardHandler = (event) => {\n        this.dialogKeyboardHandler(event, wrapper, header);\n      };\n    }\n\n    header.addEventListener(\"keydown\", this.keyboardHandler);\n  }\n\n  removeKeyboardHandler(header) {\n    if (header && this.keyboardHandler) {\n      header.removeAttribute(\"tabindex\");\n      header.removeAttribute(\"aria-label\");\n      header.removeEventListener(\"keydown\", this.keyboardHandler);\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      (this.header && this.header.textContent && this.header.textContent.replace(/\\s{2,}/g, ' ').trim() || '') :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @ignore */\n  _observeHeader() {\n    if (this._headerObserver) {\n      this._headerObserver.disconnect();\n\n      if (this._elements.header) {\n        this._headerObserver.observe(this._elements.header, {\n          // Catch changes to childList\n          childList: true,\n          // Catch changes to textContent\n          characterData: true,\n          // Monitor any child node\n          subtree: true\n        });\n      }\n    }\n  }\n\n  /**\n   Hide the header wrapper if the header content zone is empty.\n   @ignore\n   */\n  _hideHeaderIfEmpty() {\n    const header = this._elements.header;\n\n    if (header) {\n      const headerWrapper = this._elements.headerWrapper;\n\n      // If it's empty and has no non-textnode children, hide the header\n      const hiddenValue = header.children.length === 0 && header.textContent.replace(/\\s*/g, '') === '';\n\n      // Only bother if the hidden status has changed\n      if (hiddenValue !== headerWrapper.hidden) {\n        headerWrapper.hidden = hiddenValue;\n      }\n\n      this.variant = this.variant;\n    }\n  }\n\n  _handleOpen(event) {\n    this._trackEvent('display', 'coral-dialog', event);\n  }\n\n  /** @ignore */\n  _handleEscape(event) {\n    // When escape is pressed, hide ourselves\n    if (this.interaction === interaction.ON && this.open && this._isTopOverlay()) {\n      event.stopPropagation();\n      this.open = false;\n    }\n  }\n\n  /**\n   @ignore\n   @todo maybe this should be base or something\n   */\n  _handleCloseClick(event) {\n    const dismissTarget = event.matchedTarget;\n    const dismissValue = dismissTarget.getAttribute('coral-close');\n    if (!dismissValue || this.matches(dismissValue)) {\n      this.open = false;\n\n      event.stopPropagation();\n\n      this._trackEvent('close', 'coral-dialog', event);\n    }\n  }\n\n  _handleClick(event) {\n    // When we're modal, we close when our outer area (over the backdrop) is clicked\n    if (event.target === this && this.backdrop === backdrop.MODAL && this._isTopOverlay()) {\n      this.open = false;\n\n      this._trackEvent('close', 'coral-dialog', event);\n    }\n  }\n\n  /** @ignore */\n  _moveToDocumentBody() {\n    // Not in the DOM\n    if (!document.body.contains(this)) {\n      document.body.appendChild(this);\n    }\n    // In the DOM but not a direct child of body\n    else if (this.parentNode !== document.body) {\n      this._ignoreConnectedCallback = true;\n      this._repositioned = true;\n      document.body.appendChild(this);\n      this._ignoreConnectedCallback = false;\n    }\n  }\n\n  _insertTypeIcon() {\n    if (this._elements.icon) {\n      this._elements.icon.remove();\n    }\n\n    let variantValue = this.variant;\n\n    // Warning icon is same as ERROR icon\n    if (variantValue === variant.WARNING || variantValue === variant.ERROR) {\n      variantValue = 'alert';\n    }\n\n    // Inject the SVG icon\n    if (variantValue !== variant.DEFAULT) {\n      const iconName = capitalize(variantValue);\n      this._elements.headerWrapper.insertAdjacentHTML('beforeend', Icon._renderSVG(`spectrum-css-icon-${iconName}Medium`, ['_coral-Dialog-typeIcon', `_coral-UIIcon-${iconName}Medium`]));\n      this._elements.icon = this._elements.headerWrapper.querySelector('._coral-Dialog-typeIcon');\n    }\n  }\n\n  /** @ignore */\n  backdropClickedCallback() {\n    // When we're modal, we close when the backdrop is clicked\n    if (this.backdrop === backdrop.MODAL && this._isTopOverlay()) {\n      this.open = false;\n    }\n  }\n\n  /**\n   Centers the dialog in the middle of the screen.\n\n   @returns {Dialog} this, chainable.\n   */\n  center() {\n    // We're already centered in fullscreen mode\n    if (this.fullscreen) {\n      return;\n    }\n\n    // If moved we reset the position\n    this.style.top = '';\n    this.style.left = '';\n\n    return this;\n  }\n\n  dialogKeyboardHandler (event, dialog, header) {\n    if (document.activeElement !== header) {\n      return;\n    }\n\n    let currentTop = parseInt(dialog.style.top) || 0;\n    let currentLeft = parseInt(dialog.style.left) || 0;\n    var step = 10;\n\n    switch (event.keyCode) {\n      case keyCodes.UP:\n        dialog.style.top = (currentTop - step) + 'px';\n        break;\n\n      case keyCodes.DOWN:\n        dialog.style.top = (currentTop + step) + 'px';\n        break;\n\n      case keyCodes.LEFT:\n        dialog.style.left = (currentLeft - step) + 'px';\n        break;\n\n      case keyCodes.RIGHT:\n        dialog.style.left = (currentLeft + step) + 'px';\n        break;\n    }\n  }\n\n  get _contentZones() {\n    return {\n      'coral-dialog-header': 'header',\n      'coral-dialog-content': 'content',\n      'coral-dialog-footer': 'footer'\n    };\n  }\n\n  /**\n   Returns {@link Dialog} variants.\n\n   @return {DialogVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link Dialog} backdrops.\n\n   @return {DialogBackdropEnum}\n   */\n  static get backdrop() {\n    return backdrop;\n  }\n\n  /**\n   Returns {@link Dialog} close options.\n\n   @return {DialogClosableEnum}\n   */\n  static get closable() {\n    return closable;\n  }\n\n  /**\n   Returns {@link Dialog} interaction options.\n\n   @return {DialogInteractionEnum}\n   */\n  static get interaction() {\n    return interaction;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'interaction',\n      'backdrop',\n      'variant',\n      'fullscreen',\n      'icon',\n      'closable',\n      'movable'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(`${CLASSNAME}-wrapper`);\n    this.setAttribute(\"aria-modal\", true);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n    if (!this._backdrop) {\n      this.backdrop = backdrop.MODAL;\n    }\n    if (!this._closable) {\n      this.closable = closable.OFF;\n    }\n    if (!this._interaction) {\n      this.interaction = interaction.ON;\n    }\n\n    // Fetch the content zones\n    const header = this._elements.header;\n    const content = this._elements.content;\n    const footer = this._elements.footer;\n\n    // Verify if a content zone is provided\n    const contentZoneProvided = this.contains(content) && content || this.contains(footer) && footer || this.contains(header) && header;\n\n    // Verify if the internal wrapper exists\n    let wrapper = this.querySelector(`.${CLASSNAME}`);\n\n    // Case where the dialog was rendered already - cloneNode support\n    if (wrapper) {\n      // Remove tab captures\n      Array.prototype.filter.call(this.children, (child) => child.hasAttribute('coral-tabcapture')).forEach((tabCapture) => {\n        this.removeChild(tabCapture);\n      });\n\n      // Assign internal elements\n      this._elements.headerWrapper = this.querySelector('._coral-Dialog-header');\n      this._elements.closeButton = this.querySelector('._coral-Dialog-closeButton');\n\n      this._elements.wrapper = wrapper;\n    }\n    // Case where the dialog needs to be rendered\n    else {\n      // Create default wrapper\n      wrapper = this._elements.wrapper;\n\n      // Create default header wrapper\n      const headerWrapper = this._elements.headerWrapper;\n\n      // Case where the dialog needs to be rendered and content zones are provided\n      if (contentZoneProvided) {\n        // Check if user wrapper is provided\n        if (contentZoneProvided.parentNode === this) {\n          // Content zone target defaults to default wrapper if no user wrapper element is provided\n          this._elements.wrapper = wrapper;\n        } else {\n          // Content zone target defaults to user wrapper element if provided\n          this._elements.wrapper = contentZoneProvided.parentNode;\n        }\n\n        // Move everything in the wrapper\n        while (this.firstChild) {\n          wrapper.appendChild(this.firstChild);\n        }\n\n        // Add the dialog header before the content\n        if(this._elements.wrapper.contains(content)) {\n          this._elements.wrapper.insertBefore(headerWrapper, content);\n        } else {\n          // try adding in next frame\n          // so that content is a child of dialog wrapper\n          commons.nextFrame(() => {\n            this._elements.wrapper.insertBefore(headerWrapper, content);\n          });\n        }\n      }\n      // Case where the dialog needs to be rendered and content zones need to be created\n      else {\n        // Default content zone target is wrapper\n        this._elements.wrapper = wrapper;\n\n        // Move everything in the \"content\" content zone\n        while (this.firstChild) {\n          content.appendChild(this.firstChild);\n        }\n\n        // Add the content zones in the wrapper\n        wrapper.appendChild(headerWrapper);\n        wrapper.appendChild(content);\n        wrapper.appendChild(footer);\n      }\n\n      // Add the wrapper to the dialog\n      this.appendChild(wrapper);\n    }\n\n    // Only the wrapper gets the dialog class\n    this._elements.wrapper.classList.add(CLASSNAME);\n    // Mark the dialog with a public attribute for sizing\n    this._elements.wrapper.setAttribute('coral-dialog-size', '');\n    // Close button should stay under the dialog\n    this._elements.wrapper.appendChild(this._elements.closeButton);\n\n    // Copy styles over to new wrapper\n    if (this._elements.wrapper.parentNode !== this) {\n      const contentWrapper = this.querySelector('[handle=\"wrapper\"]');\n      Array.prototype.forEach.call(contentWrapper.classList, style => this._elements.wrapper.classList.add(style));\n      contentWrapper.removeAttribute('class');\n    }\n\n    // Assign content zones\n    this.header = header;\n    this.footer = footer;\n    this.content = content;\n  }\n});\n\nexport default Dialog;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1034,
    "kind": "typedef",
    "name": "DialogClosableEnum",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~DialogClosableEnum",
    "access": "public",
    "description": "Enumeration for {@link Dialog} closable options.",
    "lineNumber": 32,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Show a close button on the dialog and close the dialog when clicked."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Do not show a close button. Elements with the <code>coral-close</code> attribute will still close the dialog."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DialogClosableEnum"
    }
  },
  {
    "__docId__": 1035,
    "kind": "variable",
    "name": "keyCodes",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~keyCodes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 37,
    "undocument": true,
    "type": {
      "types": [
        "{\"UP\": number, \"DOWN\": number, \"LEFT\": number, \"RIGHT\": number}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1036,
    "kind": "typedef",
    "name": "DialogInteractionEnum",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~DialogInteractionEnum",
    "access": "public",
    "description": "Enumeration for {@link Dialog} keyboard interaction options.",
    "lineNumber": 54,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Keyboard interaction is enabled."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Keyboard interaction is disabled."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DialogInteractionEnum"
    }
  },
  {
    "__docId__": 1037,
    "kind": "typedef",
    "name": "DialogVariantEnum",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~DialogVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Dialog} variants.",
    "lineNumber": 77,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default dialog without header icon."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A dialog with an error header and icon, indicating that an error has occurred."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "A dialog with a warning header and icon, notifying the user of something important."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "A dialog with a success header and icon, indicates to the user that an operation was successful."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HELP",
        "description": "A dialog with a question header and icon, provides the user with help."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "A dialog with an info header and icon, informs the user of non-critical information."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DialogVariantEnum"
    }
  },
  {
    "__docId__": 1038,
    "kind": "typedef",
    "name": "DialogBackdropEnum",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~DialogBackdropEnum",
    "access": "public",
    "description": "Enumeration for {@link Dialog} backdrops.",
    "lineNumber": 98,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "No backdrop."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MODAL",
        "description": "A backdrop that hides the dialog when clicked."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "STATIC",
        "description": "A backdrop that does not hide the dialog when clicked."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DialogBackdropEnum"
    }
  },
  {
    "__docId__": 1039,
    "kind": "function",
    "name": "capitalize",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~capitalize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 105,
    "undocument": true,
    "params": [
      {
        "name": "s",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1040,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 108,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1041,
    "kind": "variable",
    "name": "FULLSCREEN_CLASSNAME",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~FULLSCREEN_CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 110,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1042,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 113,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1043,
    "kind": "variable",
    "name": "Dialog",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/Dialog.js~Dialog",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Dialog}",
    "description": "A Dialog component that supports various use cases with custom content. The Dialog can be given a size by\nusing the special attribute <code>[coral-dialog-size]</code> as selector.",
    "lineNumber": 127,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Dialog"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Dialog component that supports various use cases with custom content. The Dialog can be given a size by\nusing the special attribute <code>[coral-dialog-size]</code> as selector."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-dialog"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseOverlay}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-dialog></coral-dialog>",
      "<caption>JS constructor</caption>\nnew Coral.Dialog();"
    ],
    "see": [
      "../examples/#dialog"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1044,
    "kind": "file",
    "name": "coral-spectrum/coral-component-dialog/src/scripts/DialogContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Dialog.Content\n @classdesc The Dialog default content\n @htmltag coral-dialog-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-dialog-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-dialog/src/scripts/DialogContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1045,
    "kind": "function",
    "name": "DialogContent",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/DialogContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/DialogContent.js~DialogContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Dialog}",
    "description": "The Dialog default content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Dialog.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Dialog default content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-dialog-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-dialog-content></coral-dialog-content>",
      "<caption>JS constructor</caption>\nnew Coral.Dialog.Content();"
    ],
    "see": [
      "../examples/#dialog"
    ],
    "params": []
  },
  {
    "__docId__": 1046,
    "kind": "file",
    "name": "coral-spectrum/coral-component-dialog/src/scripts/DialogFooter.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Dialog.Footer\n @classdesc The Dialog footer content\n @htmltag coral-dialog-footer\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-dialog-footer');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-dialog/src/scripts/DialogFooter.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1047,
    "kind": "function",
    "name": "DialogFooter",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/DialogFooter.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/DialogFooter.js~DialogFooter",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Dialog}",
    "description": "The Dialog footer content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Dialog.Footer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Dialog footer content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-dialog-footer"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-dialog-footer></coral-dialog-footer>",
      "<caption>JS constructor</caption>\nnew Coral.Dialog.Footer();"
    ],
    "see": [
      "../examples/#dialog"
    ],
    "params": []
  },
  {
    "__docId__": 1048,
    "kind": "file",
    "name": "coral-spectrum/coral-component-dialog/src/scripts/DialogHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Dialog.Header\n @classdesc The Dialog header content\n @htmltag coral-dialog-header\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-dialog-header');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-dialog/src/scripts/DialogHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1049,
    "kind": "function",
    "name": "DialogHeader",
    "memberof": "coral-spectrum/coral-component-dialog/src/scripts/DialogHeader.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-dialog/src/scripts/DialogHeader.js~DialogHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Dialog}",
    "description": "The Dialog header content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Dialog.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Dialog header content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-dialog-header"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-dialog-header></coral-dialog-header>",
      "<caption>JS constructor</caption>\nnew Coral.Dialog.Header();"
    ],
    "see": [
      "../examples/#dialog"
    ],
    "params": []
  },
  {
    "__docId__": 1050,
    "kind": "file",
    "name": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-button';\nimport base from '../templates/base';\nimport {commons, transform, validate, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Drawer} directions.\n\n @typedef {Object} DrawerDirectionEnum\n\n @property {String} DOWN\n A drawer with a toggle button on the bottom.\n @property {String} UP\n A drawer with a toggle button on top.\n */\nconst direction = {\n  DOWN: 'down',\n  UP: 'up'\n};\n\n// The drawer's base classname\nconst CLASSNAME = '_coral-Drawer';\n\n// A string of all possible direction classnames\nconst ALL_DIRECTION_CLASSES = [];\nfor (const directionValue in direction) {\n  ALL_DIRECTION_CLASSES.push(`${CLASSNAME}--${direction[directionValue]}`);\n}\n\n/**\n @class Coral.Drawer\n @classdesc A Drawer component to display content that can be opened and closed with a sliding animation.\n @htmltag coral-drawer\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Drawer = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      content: this.querySelector('coral-drawer-content') || document.createElement('coral-drawer-content')\n    };\n    base.call(this._elements, {commons, i18n});\n\n    // Events\n    this._delegateEvents({\n      'click ._coral-Drawer-toggleButton': '_onClick'\n    });\n  }\n\n  /**\n   Whether this item is disabled or not. This will stop every user interaction with the item.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.toggle.hidden = this._disabled;\n  }\n\n  /**\n   The drawer's content element.\n\n   @type {DrawerContent}\n   @htmlttribute content\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-drawer-content',\n      insert: function (content) {\n        this._elements.contentWrapper.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The drawer's direction. See {@link DrawerDirectionEnum}.\n\n   @type {String}\n   @default DrawerDirectionEnum.DOWN\n   @htmlattribute direction\n   @htmlattributereflected\n   */\n  get direction() {\n    return this._direction || direction.DOWN;\n  }\n\n  set direction(value) {\n    value = transform.string(value).toLowerCase();\n    this._direction = validate.enumeration(direction)(value) && value || direction.DOWN;\n    this._reflectAttribute('direction', this._direction);\n\n    this.classList.remove(...ALL_DIRECTION_CLASSES);\n    this.classList.add(`${CLASSNAME}--${this._direction}`);\n  }\n\n  /**\n   Whether the Drawer is expanded or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute open\n   @htmlattributereflected\n   */\n  get open() {\n    return this._open || false;\n  }\n\n  set open(value) {\n    const silenced = this._silenced;\n\n    this._open = transform.booleanAttr(value);\n    this._reflectAttribute('open', this._open);\n\n    this._elements.toggleButton.setAttribute('aria-expanded', this._open);\n\n    // eslint-disable-next-line no-unused-vars\n    let offsetHeight;\n\n    // Handle slider animation\n    const slider = this._elements.slider;\n\n    // Don't animate on initialization\n    if (this._animate) {\n      commons.transitionEnd(slider, () => {\n        // Keep it silenced\n        this._silenced = silenced;\n\n        // Remove height as we want the drawer to naturally grow if content is added later\n        if (this._open) {\n          slider.style.height = '';\n        }\n\n        // Trigger once transition is finished\n        this.trigger(`coral-drawer:${(this._open ? 'open' : 'close')}`);\n        this._silenced = false;\n      });\n\n      if (!this._open) {\n        // Force height to enable transition\n        slider.style.height = `${slider.scrollHeight}px`;\n      }\n\n      // Do transition in next task as browser might batch up the height property change before painting\n      window.setTimeout(() => {\n        slider.style.height = this._open ? `${slider.scrollHeight}px` : 0;\n      }, 10);\n    } else {\n      // Make sure it's animated next time\n      this._animate = true;\n\n      // Hide it on initialization if closed\n      if (!this._open) {\n        slider.style.height = 0;\n      }\n    }\n  }\n\n  /** @private */\n  _onClick() {\n    this.open = !this.open;\n  }\n\n  get _contentZones() {\n    return {'coral-drawer-content': 'content'};\n  }\n\n  /**\n   Returns {@link Drawer} direction options.\n\n   @return {DrawerDirectionEnum}\n   */\n  static get direction() {\n    return direction;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'disabled',\n      'direction',\n      'open'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, 'coral-Well');\n\n    // Default reflected attributes\n    if (!this._direction) {\n      this.direction = direction.DOWN;\n    }\n    if (!this._open) {\n      this.open = false;\n    }\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    const templateHandleNames = ['slider', 'toggle'];\n\n    // Render the template\n    fragment.appendChild(this._elements.slider);\n    fragment.appendChild(this._elements.toggle);\n\n    // Fetch or create the content content zone element\n    const content = this._elements.content;\n\n    // Move any remaining elements into the content sub-component\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        content.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Assign the content zone\n    this.content = content;\n  }\n\n  /**\n   Triggered when the {@link Drawer} is opened.\n\n   @typedef {CustomEvent} coral-drawer:open\n   */\n\n  /**\n   Triggered when the {@link Drawer} is closed.\n\n   @typedef {CustomEvent} coral-drawer:close\n   */\n});\n\nexport default Drawer;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1051,
    "kind": "typedef",
    "name": "DrawerDirectionEnum",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~DrawerDirectionEnum",
    "access": "public",
    "description": "Enumeration for {@link Drawer} directions.",
    "lineNumber": 29,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DOWN",
        "description": "A drawer with a toggle button on the bottom."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "UP",
        "description": "A drawer with a toggle button on top."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DrawerDirectionEnum"
    }
  },
  {
    "__docId__": 1052,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 35,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1053,
    "kind": "variable",
    "name": "ALL_DIRECTION_CLASSES",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~ALL_DIRECTION_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 38,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1054,
    "kind": "variable",
    "name": "Drawer",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~Drawer",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Drawer}",
    "description": "A Drawer component to display content that can be opened and closed with a sliding animation.",
    "lineNumber": 50,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Drawer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Drawer component to display content that can be opened and closed with a sliding animation."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-drawer"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-drawer></coral-drawer>",
      "<caption>JS constructor</caption>\nnew Coral.Drawer();"
    ],
    "see": [
      "../examples/#drawer"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1055,
    "kind": "typedef",
    "name": "coral-drawer:open",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~coral-drawer:open",
    "access": "public",
    "description": "Triggered when the {@link Drawer} is opened.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-drawer:open"
    }
  },
  {
    "__docId__": 1056,
    "kind": "typedef",
    "name": "coral-drawer:close",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/Drawer.js~coral-drawer:close",
    "access": "public",
    "description": "Triggered when the {@link Drawer} is closed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-drawer:close"
    }
  },
  {
    "__docId__": 1057,
    "kind": "file",
    "name": "coral-spectrum/coral-component-drawer/src/scripts/DrawerContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Drawer.Content\n @classdesc Drawer content component\n @htmltag coral-drawer-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-drawer-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-drawer/src/scripts/DrawerContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1058,
    "kind": "function",
    "name": "DrawerContent",
    "memberof": "coral-spectrum/coral-component-drawer/src/scripts/DrawerContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-drawer/src/scripts/DrawerContent.js~DrawerContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Drawer}",
    "description": "Drawer content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Drawer.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Drawer content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-drawer-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-drawer-content></coral-drawer-content>",
      "<caption>JS constructor</caption>\nnew Coral.Drawer.Content();"
    ],
    "see": [
      "../examples/#drawer"
    ],
    "params": []
  },
  {
    "__docId__": 1059,
    "kind": "file",
    "name": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport FileUploadItem from './FileUploadItem';\nimport base from '../templates/base';\nimport {transform, commons, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-FileUpload';\n\nconst XHR_EVENT_NAMES = ['loadstart', 'progress', 'load', 'error', 'loadend', 'readystatechange', 'abort', 'timeout'];\n\n/**\n Enumeration for {@link FileUpload} HTTP methods that can be used to upload files.\n\n @typedef {Object} FileUploadMethodEnum\n\n @property {String} POST\n Send a POST request. Used when creating a resource.\n @property {String} PUT\n Send a PUT request. Used when replacing a resource.\n @property {String} PATCH\n Send a PATCH request. Used when partially updating a resource.\n */\nconst method = {\n  POST: 'POST',\n  PUT: 'PUT',\n  PATCH: 'PATCH'\n};\n\n/**\n @class Coral.FileUpload\n @classdesc A FileUpload component that manages the upload process of multiple files. Child elements of FileUpload can\n be given special attributes to enable functionality:\n - <code>[coral-fileupload-select]</code>. Click to choose file(s), replacing existing files.\n - <code>[coral-fileupload-dropzone]</code>. Drag and drop files to choose file(s), replacing existing files.\n - <code>[coral-fileupload-clear]</code>. Click to remove all files from the queue.\n - <code>[coral-fileupload-submit]</code>. Click to start uploading.\n - <code>[coral-fileupload-abort]</code>. Click to abort all uploads.\n - <code>[coral-fileupload-abortfile=\"filename.txt\"]</code>. Click to abort a specific file, leaving it in the queue.\n - <code>[coral-fileupload-removefile=\"filename.txt\"]</code>. Click to remove a specific file from the queue.\n - <code>[coral-fileupload-uploadfile=\"filename.txt\"]</code>. Click to start uploading a specific file.\n\n @htmltag coral-fileupload\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst FileUpload = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      // Clickable hooks\n      'click [coral-fileupload-submit]': '_onSubmitButtonClick',\n      'click [coral-fileupload-clear]': 'clear',\n      'click [coral-fileupload-select]': '_showFileDialog',\n      'click [coral-fileupload-abort]': 'abort',\n      'click [coral-fileupload-abortfile]': '_onAbortFileClick',\n      'click [coral-fileupload-removefile]': '_onRemoveFileClick',\n      'click [coral-fileupload-uploadfile]': '_onUploadFileClick',\n\n      // Drag & Drop zones\n      'dragenter [coral-fileupload-dropzone]': '_onDragAndDrop',\n      'dragover [coral-fileupload-dropzone]': '_onDragAndDrop',\n      'dragleave [handle=\"input\"]': '_onDragAndDrop',\n      'drop [handle=\"input\"]': '_onDragAndDrop',\n\n      // Accessibility\n      'capture:focus [coral-fileupload-select]': '_onButtonFocusIn',\n      'capture:focus [handle=\"input\"]': '_onInputFocusIn',\n      'capture:blur [handle=\"input\"]': '_onInputFocusOut'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {commons});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Used for items\n    this._uploadQueue = [];\n\n    // this should refer to the fileupload\n    this._doAddDragClass = this._doAddDragClass.bind(this);\n    this._doRemoveDragClass = this._doRemoveDragClass.bind(this);\n    this._positionInputOnDropZone = this._positionInputOnDropZone.bind(this);\n\n    // Reposition the input under the specified dropzone\n    this._observer = new MutationObserver(this._positionInputOnDropZone);\n    this._observer.observe(this, {\n      childList: true,\n      attributes: true,\n      attributeFilter: ['coral-fileupload-dropzone'],\n      subtree: true\n    });\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    const item = this._uploadQueue ? this._getQueueItem(0) : null;\n\n    // The first selected filename, or the empty string if no files are selected.\n    return item ? `C:\\\\fakepath\\\\${item.file.name}` : '';\n  }\n\n  set value(value) {\n    if (value === '' || value === null) {\n      this._clearQueue();\n      this._clearFileInputValue();\n    } else {\n      // Throws exception if value is different than an empty string or null\n      throw new Error('Coral.FileUpload accepts a filename, which may only be programmatically set to empty string.');\n    }\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._elements.input.disabled;\n  }\n\n  set disabled(value) {\n    this._elements.input.disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this.disabled);\n\n    this.classList.toggle('is-disabled', this.disabled);\n    this._setElementState();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this._elements.input.setAttribute('aria-invalid', this.invalid);\n    this._setElementState();\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._elements.input.required;\n  }\n\n  set required(value) {\n    this._elements.input.required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this.required);\n\n    this.classList.toggle('is-required', this.required);\n    this._setElementState();\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._setElementState();\n  }\n\n  /**\n   The names of the currently selected files.\n   When {@link Coral.FileUpload#multiple} is <code>false</code>, this will be an array of length 1.\n\n   @type {Array.<String>}\n   */\n  get values() {\n    let values = this._uploadQueue.map((item) => `C:\\\\fakepath\\\\${item.file.name}`);\n\n    if (values.length && !this.multiple) {\n      values = [values[0]];\n    }\n\n    return values;\n  }\n\n  set values(values) {\n    if (Array.isArray(values)) {\n      if (values.length) {\n        this.value = values[0];\n      } else {\n        this.value = '';\n      }\n    }\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    // The specified labelledBy property.\n    const labelledBy = this.labelledBy;\n\n    // An array of element ids to label control, the last being the select button element id.\n    const ids = [];\n\n    const button = this.querySelector('[coral-fileupload-select]');\n\n    if (button) {\n      ids.push(button.id);\n    }\n\n    // If a labelledBy property exists,\n    if (labelledBy) {\n      // prepend the labelledBy value to the ids array\n      ids.unshift(labelledBy);\n    }\n\n    // Set aria-labelledby attribute on the labellable element joining ids array into space-delimited list of ids.\n    this._elements.input.setAttribute('aria-labelledby', ids.join(' '));\n\n    if (labelledBy) {\n      // Set label for attribute\n      const labelElement = document.getElementById(labelledBy);\n      if (labelElement && labelElement.tagName === 'LABEL') {\n        labelElement.setAttribute('for', this._elements.input.id);\n        this._labelElement = labelElement;\n      }\n    }\n    // Remove label for attribute\n    else if (this._labelElement) {\n      this._labelElement.removeAttribute('for');\n    }\n  }\n\n  /**\n   Array of additional parameters as key:value to send in addition of files.\n   A parameter must contain a <code>name</code> key:value and optionally a <code>value</code> key:value.\n\n   @type {Array.<Object>}\n   @default []\n   */\n  get parameters() {\n    return this._parameters || [];\n  }\n\n  set parameters(values) {\n    // Verify that every item has a name\n    const isValid = Array.isArray(values) && values.every((el) => el && el.name);\n\n    if (isValid) {\n      this._parameters = values;\n\n      if (!this.async) {\n        Array.prototype.forEach.call(this.querySelectorAll('input[type=\"hidden\"]'), (input) => {\n          input.parentNode.removeChild(input);\n        });\n\n        // Add extra parameters\n        this.parameters.forEach((param) => {\n          const input = document.createElement('input');\n          input.type = 'hidden';\n          input.name = param.name;\n          input.value = param.value;\n\n          this.appendChild(input);\n        });\n      }\n    }\n  }\n\n  /**\n   Whether files should be uploaded asynchronously via XHR or synchronously e.g. within a\n   <code>&lt;form&gt;</code> tag. One option excludes the other. Setting a new <code>async</code> value removes all\n   files from the queue.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute async\n   @htmlattributereflected\n   */\n  get async() {\n    return this._async || false;\n  }\n\n  set async(value) {\n    this._async = transform.booleanAttr(value);\n    this._reflectAttribute('async', this._async);\n\n    // Sync extra parameters in case of form submission\n    if (!this._async) {\n      this.parameters = this.parameters;\n    }\n\n    // Clear file selection\n    if (this._uploadQueue) {\n      this._clearQueue();\n      this._clearFileInputValue();\n    }\n  }\n\n  /**\n   The URL where the upload request should be sent. When used within a <code>&lt;form&gt;</code> tag to upload\n   synchronously, the action of the form is used. If an element is clicked that has a\n   <code>[coral-fileupload-submit]</code> attribute as well as a <code>[formaction]</code> attribute, the action of\n   the clicked element will be used. Set this property before calling {@link Coral.FileUpload#upload} to reset the\n   action set by a click.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute action\n   @htmlattributereflected\n   */\n  get action() {\n    return this._action || '';\n  }\n\n  set action(value) {\n    this._action = transform.string(value);\n    this._reflectAttribute('action', this._action);\n\n    // Reset button action as action was set explicitly\n    this._buttonAction = null;\n  }\n\n  /**\n   The HTTP method to use when uploading files asynchronously. When used within a <code>&lt;form&gt;</code> tag to\n   upload synchronously, the method of the form is used. If an element is clicked that has a\n   <code>[coral-fileupload-submit]</code> attribute as well as a <code>[formmethod]</code> attribute, the method of\n   the clicked element will be used. Set this property before calling {@link FileUpload#upload} to reset the\n   method set by a click.\n   See {@link FileUploadMethodEnum}.\n\n   @type {String}\n   @default FileUploadMethodEnum.POST\n   @htmlattribute method\n   @htmlattributereflected\n   */\n  get method() {\n    return this._method || method.POST;\n  }\n\n  set method(value) {\n    value = transform.string(value).toUpperCase();\n    this._method = validate.enumeration(method)(value) && value || method.POST;\n    this._reflectAttribute('method', this._method);\n\n    // Reset button method as method was set explcitly\n    this._buttonMethod = null;\n  }\n\n  /**\n   Whether more than one file can be chosen at the same time to upload.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._elements.input.multiple;\n  }\n\n  set multiple(value) {\n    this._elements.input.multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this.multiple);\n  }\n\n  /**\n   File size limit in bytes for one file. The value of 0 indicates unlimited, which is also the default.\n\n   @type {Number}\n   @htmlattribute sizelimit\n   @htmlattributereflected\n   @default 0\n   */\n  get sizeLimit() {\n    return this._sizeLimit || 0;\n  }\n\n  set sizeLimit(value) {\n    this._sizeLimit = transform.number(value);\n    this._reflectAttribute('sizelimit', this._sizeLimit);\n  }\n\n  /**\n   MIME types allowed for uploading (proper MIME types, wildcard '*' and file extensions are supported). To specify\n   more than one value, separate the values with a comma (e.g.\n   <code>&lt;input accept=\"audio/*,video/*,image/*\" /&gt;</code>.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute accept\n   @htmlattributereflected\n   */\n  get accept() {\n    return this._elements.input.accept;\n  }\n\n  set accept(value) {\n    this._elements.input.accept = value;\n    this._reflectAttribute('accept', this.accept);\n  }\n\n  /**\n   Whether the upload should start immediately after file selection.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute autostart\n   @htmlattributereflected\n   */\n  get autoStart() {\n    return this._autoStart || false;\n  }\n\n  set autoStart(value) {\n    this._autoStart = transform.booleanAttr(value);\n    this._reflectAttribute('autostart', this._autoStart);\n  }\n\n  /**\n   Files to be uploaded.\n\n   @readonly\n   @default []\n   @type {Array.<Object>}\n   */\n  get uploadQueue() {\n    return this._uploadQueue;\n  }\n\n  /** @private */\n  _onButtonFocusIn(event) {\n    // Get the input\n    const input = this._elements.input;\n\n    // Get the button\n    const button = event.matchedTarget;\n\n    // Move the input to after the button\n    // This lets the next focused item be the correct one according to tab order\n    button.parentNode.insertBefore(input, button.nextElementSibling);\n\n    if (event.relatedTarget !== input) {\n      // Make sure the input gets focused on FF\n      window.setTimeout(() => {\n        input.focus();\n      }, 100);\n    }\n  }\n\n  /** @private */\n  _onInputFocusIn() {\n    // Get the input\n    const input = event.matchedTarget;\n\n    const button = this.querySelector('[coral-fileupload-select]');\n    if (button) {\n      // Remove from the tab order so shift+tab works\n      button.tabIndex = -1;\n\n      // So shifting focus backwards with screen reader doesn't create a focus trap\n      button.setAttribute('aria-hidden', true);\n\n      // Mark the button as focused\n      button.classList.add('is-focused');\n\n      window.requestAnimationFrame(() => {\n        if (input.classList.contains('focus-ring')) {\n          button.classList.add('focus-ring');\n        }\n      });\n    }\n  }\n\n  /** @private */\n  _onInputFocusOut() {\n    // Unmark all the focused buttons\n    const button = this.querySelector('[coral-fileupload-select].is-focused');\n    if (button) {\n      button.classList.remove('is-focused');\n      button.classList.remove('focus-ring');\n  \n      // Wait a frame so that shifting focus backwards with screen reader doesn't create a focus trap\n      window.requestAnimationFrame(() => {\n        button.tabIndex = 0;\n        // @a11y: aria-hidden is removed to prevent focus trap when navigating backwards using a screen reader's\n        // virtual cursor\n        button.removeAttribute('aria-hidden');\n      });\n    }\n  }\n\n  /** @private */\n  _onAbortFileClick(event) {\n    if (!this.async) {\n      throw new Error('Coral.FileUpload does not support aborting file(s) upload on synchronous mode.');\n    }\n\n    // Get file to abort\n    const fileName = event.target.getAttribute('coral-fileupload-abortfile');\n    if (fileName) {\n      this._abortFile(fileName);\n    }\n  }\n\n  /** @private */\n  _onRemoveFileClick(event) {\n    if (!this.async) {\n      throw new Error('Coral.FileUpload does not support removing a file from the queue on synchronous mode.');\n    } else {\n      // Get file to remove\n      const fileName = event.target.getAttribute('coral-fileupload-removefile');\n      if (fileName) {\n        this._clearFile(fileName);\n      }\n    }\n  }\n\n  /** @private */\n  _onUploadFileClick(event) {\n    if (!this.async) {\n      throw new Error('Coral.FileUpload does not support uploading a file from the queue on synchronous mode.');\n    }\n\n    // Get file to upload\n    const fileName = event.target.getAttribute('coral-fileupload-uploadfile');\n    if (fileName) {\n      this.upload(fileName);\n    }\n  }\n\n  /** @private */\n  _onDragAndDrop(event) {\n    // Set dragging classes\n    if (event.type === 'dragenter' || event.type === 'dragover') {\n      this._addDragClass();\n    } else if (event.type === 'dragleave' || event.type === 'drop') {\n      this._removeDragClass();\n    }\n\n    this.trigger(`coral-fileupload:${event.type}`);\n  }\n\n  /** @private */\n  _addDragClass() {\n    window.clearTimeout(this._removeClassTimeout);\n    this._removeClassTimeout = window.setTimeout(this._doAddDragClass, 10);\n  }\n\n  /** @private */\n  _doAddDragClass() {\n    this.classList.add('is-dragging');\n\n    const dropZone = this.querySelector('[coral-fileupload-dropzone]');\n    if (dropZone) {\n      dropZone.classList.add('is-dragging');\n    }\n\n    // Put the input on top to enable file drop\n    this._elements.input.classList.remove('is-unselectable');\n  }\n\n  /** @private */\n  _removeDragClass() {\n    window.clearTimeout(this._removeClassTimeout);\n    this._removeClassTimeout = window.setTimeout(this._doRemoveDragClass, 10);\n  }\n\n  /** @private */\n  _doRemoveDragClass() {\n    this.classList.remove('is-dragging');\n\n    const dropZone = this.querySelector('[coral-fileupload-dropzone]');\n    if (dropZone) {\n      dropZone.classList.remove('is-dragging');\n    }\n\n    // Disable user interaction with the input\n    this._elements.input.classList.add('is-unselectable');\n  }\n\n  /**\n   Handles clicks to submit buttons\n\n   @private\n   */\n  _onSubmitButtonClick(event) {\n    const target = event.matchedTarget;\n\n    // Override or reset the action/method given the button's configuration\n    this._buttonAction = target.getAttribute('formaction');\n\n    // Make sure the method provided by the button is valid\n    const buttonMethod = transform.string(target.getAttribute('formmethod')).toUpperCase();\n    this._buttonMethod = validate.enumeration(method)(buttonMethod) && buttonMethod || null;\n\n    // Start the file upload\n    this.upload();\n  }\n\n  /**\n   Handles changes to the input element.\n\n   @private\n   */\n  _onInputChange(event) {\n    // Stop the current event\n    event.stopPropagation();\n\n    if (this.disabled) {\n      return;\n    }\n\n    let files = [];\n    const items = [];\n\n    // Retrieve files for select event\n    if (event.target.files && event.target.files.length) {\n      this._clearQueue();\n      files = event.target.files;\n\n      // Verify if multiple file upload is allowed\n      if (!this.multiple) {\n        files = [files[0]];\n      }\n    }\n    // Retrieve files for drop event\n    else if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length) {\n      this._clearQueue();\n      files = event.dataTransfer.files;\n\n      // Verify if multiple file upload is allowed\n      if (!this.multiple) {\n        files = [files[0]];\n      }\n    } else {\n      return;\n    }\n\n    // Initialize items\n    for (let i = 0 ; i < files.length ; i++) {\n      items.push(new FileUploadItem(files[i]));\n    }\n\n    // Verify if file is allowed to be uploaded and trigger events accordingly\n    items.forEach((item) => {\n      // If file is not found in uploadQueue using filename\n      if (!this._getQueueItemByFilename(item.file.name)) {\n        // Check file size\n        if (this.sizeLimit && item.file.size > this.sizeLimit) {\n          this.trigger('coral-fileupload:filesizeexceeded', {item});\n        }\n        // Check mime type\n        else if (this.accept && !item._isMimeTypeAllowed(this.accept)) {\n          this.trigger('coral-fileupload:filemimetyperejected', {item});\n        } else {\n          // Add item to queue\n          this._uploadQueue.push(item);\n\n          this.trigger('coral-fileupload:fileadded', {item});\n        }\n      }\n    });\n\n    if (this.autoStart) {\n      this.upload();\n    }\n\n    // Explicitly re-emit the change event\n    if (this._triggerChangeEvent) {\n      this.trigger('change');\n    }\n\n    // Clear file input once files are added to the queue to make sure next file selection will trigger a change event\n    if (this.async) {\n      this._clearFileInputValue();\n    }\n  }\n\n  /**\n   Sets the disabled/readonly state of elements with the associated special attributes\n\n   @private\n   */\n  _setElementState() {\n    Array.prototype.forEach.call(this.querySelectorAll(\n      '[coral-fileupload-select],' +\n      '[coral-fileupload-dropzone],' +\n      '[coral-fileupload-submit],' +\n      '[coral-fileupload-clear],' +\n      '[coral-fileupload-abort],' +\n      '[coral-fileupload-abortfile],' +\n      '[coral-fileupload-removefile],' +\n      '[coral-fileupload-uploadfile]'\n    ), (item) => {\n      item.classList.toggle('is-invalid', this.invalid);\n      item.classList.toggle('is-disabled', this.disabled);\n      item.classList.toggle('is-required', this.required);\n      item.classList.toggle('is-readOnly', this.readOnly);\n      item[this.disabled || this.readOnly ? 'setAttribute' : 'removeAttribute']('disabled', '');\n    });\n  }\n\n  /** @private */\n  _clearQueue() {\n    this._uploadQueue.slice().forEach((item) => {\n      this._clearFile(item.file.name);\n    });\n  }\n\n  /**\n   Clear file selection on the file input\n\n   @private\n   */\n  _clearFileInputValue() {\n    this._elements.input.value = '';\n  }\n\n  /**\n   Remove a file from the upload queue.\n\n   @param {String} filename\n   The filename of the file to remove.\n\n   @private\n   */\n  _clearFile(filename) {\n    const item = this._getQueueItemByFilename(filename);\n    if (item) {\n      // Abort file upload\n      this._abortFile(filename);\n\n      // Remove file from queue\n      this._uploadQueue.splice(this._getQueueIndex(filename), 1);\n\n      this.trigger('coral-fileupload:fileremoved', {item});\n    }\n  }\n\n  /**\n   Uploads a file in the queue. If an array is provided as the first argument, it is used as the parameters.\n\n   @param filename {String}\n   The name of the file to upload.\n\n   @private\n   */\n  _uploadFile(filename) {\n    const item = this._getQueueItemByFilename(filename);\n    if (item) {\n      this._abortFile(filename);\n      this._ajaxUpload(item);\n    }\n  }\n\n  /** @private */\n  _showFileDialog() {\n    // Show the dialog\n    // This ONLY works when the call stack traces back to another click event!\n    this._elements.input.click();\n  }\n\n  /**\n   Abort specific file upload.\n\n   @param {String} filename\n   The filename identifies the file to abort.\n\n   @private\n   */\n  _abortFile(filename) {\n    const item = this._getQueueItemByFilename(filename);\n    if (item && item._xhr) {\n      item._xhr.abort();\n      item._xhr = null;\n    }\n  }\n\n  /**\n   Handles the ajax upload.\n\n   @private\n   */\n  _ajaxUpload(item) {\n    // Use the action/method provided by the last button click, if provided\n    const action = this._buttonAction || this.action;\n    const requestMethod = this._buttonMethod ? this._buttonMethod.toUpperCase() : this.method;\n\n    // We merge the global parameters with the specific file parameters and send them all together\n    const parameters = this.parameters.concat(item.parameters);\n\n    const formData = new FormData();\n\n    parameters.forEach((additionalParameter) => {\n      formData.append(additionalParameter.name, additionalParameter.value);\n    });\n\n    formData.append('_charset_', 'utf-8');\n    formData.append(this.name, item._originalFile);\n\n    // Store the XHR on the item itself\n    item._xhr = new XMLHttpRequest();\n\n    // Opening before being able to set response type to avoid IE11 InvalidStateError\n    item._xhr.open(requestMethod, action);\n\n    // Reflect specific xhr properties\n    item._xhr.timeout = item.timeout;\n    item._xhr.responseType = item.responseType;\n    item._xhr.withCredentials = item.withCredentials;\n\n    XHR_EVENT_NAMES.forEach((name) => {\n      // Progress event is the only event among other ProgressEvents that can trigger multiple times.\n      // Hence it's the only one that gives away usable progress information.\n      const isProgressEvent = name === 'progress';\n      (isProgressEvent ? item._xhr.upload : item._xhr).addEventListener(name, (event) => {\n        const detail = {\n          item: item,\n          action: action,\n          method: requestMethod\n        };\n\n        if (isProgressEvent) {\n          detail.lengthComputable = event.lengthComputable;\n          detail.loaded = event.loaded;\n          detail.total = event.total;\n        }\n\n        this.trigger(`coral-fileupload:${name}`, detail);\n      });\n    });\n\n    item._xhr.send(formData);\n  }\n\n  /** @private */\n  _getLabellableElement() {\n    return this;\n  }\n\n  /** @private */\n  _getQueueItemByFilename(filename) {\n    return this._getQueueItem(this._getQueueIndex(filename));\n  }\n\n  /** @private */\n  _getQueueItem(index) {\n    return index > -1 ? this._uploadQueue[index] : null;\n  }\n\n  /** @private */\n  _getQueueIndex(filename) {\n    let index = -1;\n    this._uploadQueue.some((item, i) => {\n      if (item.file.name === filename) {\n        index = i;\n        return true;\n      }\n\n      return false;\n    });\n    return index;\n  }\n\n  /** @private */\n  _getTargetChangeInput() {\n    return this._elements.input;\n  }\n\n  /** @ignore */\n  _positionInputOnDropZone() {\n    const input = this._elements.input;\n    const dropZone = this.querySelector('[coral-fileupload-dropzone]');\n\n    if (dropZone) {\n      const size = dropZone.getBoundingClientRect();\n\n      input.style.top = `${parseInt(dropZone.offsetTop, 10)}px`;\n      input.style.left = `${parseInt(dropZone.offsetLeft, 10)}px`;\n      input.style.width = `${parseInt(size.width, 10)}px`;\n      input.style.height = `${parseInt(size.height, 10)}px`;\n    } else {\n      input.style.width = '0px';\n      input.style.height = '0px';\n      input.style.visibility = 'hidden';\n    }\n  }\n\n  /**\n   Uploads the given filename, or all the files into the queue. It accepts extra parameters that are sent with the\n   file.\n\n   @param {String} [filename]\n   The name of the file to upload.\n   */\n  upload(filename) {\n    if (!this.async) {\n      if (typeof filename === 'string') {\n        throw new Error('Coral.FileUpload does not support uploading a file from the queue on synchronous mode.');\n      }\n\n      let form = this.closest('form');\n      if (!form) {\n        form = document.createElement('form');\n        form.method = this.method.toLowerCase();\n        form.enctype = 'multipart/form-data';\n        form.action = this.action;\n        form.hidden = true;\n\n        form.appendChild(this._elements.input);\n\n        Array.prototype.forEach.call(this.querySelectorAll('input[type=\"hidden\"]'), (hiddenInput) => {\n          form.appendChild(hiddenInput);\n        });\n\n        // Make sure the form is connected before submission\n        this.appendChild(form);\n      }\n\n      const input = document.createElement('input');\n      input.type = 'hidden';\n      input.name = '_charset_';\n      input.value = 'utf-8';\n\n      form.submit();\n    } else if (typeof filename === 'string') {\n      this._uploadFile(filename);\n    } else {\n      this._uploadQueue.forEach((item) => {\n        this._abortFile(item.file.name);\n        this._ajaxUpload(item);\n      });\n    }\n  }\n\n  /**\n   Remove a file or all files from the upload queue.\n\n   @param {String} [filename]\n   The filename of the file to remove. If a filename is not provided, all files will be removed.\n   */\n  clear(filename) {\n    if (!this.async) {\n      if (typeof filename === 'string') {\n        throw new Error('Coral.FileUpload does not support removing a file from the queue on synchronous mode.');\n      }\n      this._clearQueue();\n      this._clearFileInputValue();\n    } else if (typeof filename === 'string') {\n      this._clearFile(filename);\n    } else {\n      this._clearQueue();\n    }\n  }\n\n  /**\n   Abort upload of a given file or all files in the queue.\n\n   @param {String} [filename]\n   The filename of the file to abort. If a filename is not provided, all files will be aborted.\n   */\n  abort(filename) {\n    if (!this.async) {\n      throw new Error('Coral.FileUpload does not support aborting file(s) upload on synchronous mode.');\n    }\n\n    if (typeof filename === 'string') {\n      // Abort a single file\n      this._abortFile(filename);\n    } else {\n      // Abort all files\n      this._uploadQueue.forEach((item) => {\n        this._abortFile(item.file.name);\n      });\n    }\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      sizelimit: 'sizeLimit',\n      autostart: 'autoStart'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'async',\n      'action',\n      'method',\n      'multiple',\n      'sizelimit',\n      'accept',\n      'autostart'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const button = this.querySelector('[coral-fileupload-select]');\n    if (button) {\n      button.id = button.id || commons.getUID();\n    }\n    // If no labelledby is specified, ensure input is at labelledby the select button\n    this.labelledBy = this.labelledBy;\n\n    // Fetch additional parameters if any\n    const parameters = [];\n    Array.prototype.forEach.call(this.querySelectorAll('input[type=\"hidden\"]'), (input) => {\n      parameters.push({\n        name: input.name,\n        value: input.value\n      });\n    });\n    this.parameters = parameters;\n\n    // Remove the input if it's already there\n    // A fresh input is preferred to value = '' as it may not work in all browsers\n    const inputElement = this.querySelector('[handle=\"input\"]');\n    if (inputElement) {\n      inputElement.parentNode.removeChild(inputElement);\n    }\n\n    // Add the input to the component\n    this.appendChild(this._elements.input);\n\n    // IE11 requires one more frame or the resize listener <object> will appear as an overlaying white box\n    window.requestAnimationFrame(() => {\n      // Handles the repositioning of the input to allow dropping files\n      commons.addResizeListener(this, this._positionInputOnDropZone);\n    });\n  }\n});\n\nexport default FileUpload;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1060,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1061,
    "kind": "variable",
    "name": "XHR_EVENT_NAMES",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js~XHR_EVENT_NAMES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1062,
    "kind": "typedef",
    "name": "FileUploadMethodEnum",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js~FileUploadMethodEnum",
    "access": "public",
    "description": "Enumeration for {@link FileUpload} HTTP methods that can be used to upload files.",
    "lineNumber": 36,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "POST",
        "description": "Send a POST request. Used when creating a resource."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PUT",
        "description": "Send a PUT request. Used when replacing a resource."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PATCH",
        "description": "Send a PATCH request. Used when partially updating a resource."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "FileUploadMethodEnum"
    }
  },
  {
    "__docId__": 1063,
    "kind": "variable",
    "name": "FileUpload",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUpload.js~FileUpload",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{FileUpload}",
    "description": "A FileUpload component that manages the upload process of multiple files. Child elements of FileUpload can\nbe given special attributes to enable functionality:\n- <code>[coral-fileupload-select]</code>. Click to choose file(s), replacing existing files.\n- <code>[coral-fileupload-dropzone]</code>. Drag and drop files to choose file(s), replacing existing files.\n- <code>[coral-fileupload-clear]</code>. Click to remove all files from the queue.\n- <code>[coral-fileupload-submit]</code>. Click to start uploading.\n- <code>[coral-fileupload-abort]</code>. Click to abort all uploads.\n- <code>[coral-fileupload-abortfile=\"filename.txt\"]</code>. Click to abort a specific file, leaving it in the queue.\n- <code>[coral-fileupload-removefile=\"filename.txt\"]</code>. Click to remove a specific file from the queue.\n- <code>[coral-fileupload-uploadfile=\"filename.txt\"]</code>. Click to start uploading a specific file.",
    "lineNumber": 60,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.FileUpload"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A FileUpload component that manages the upload process of multiple files. Child elements of FileUpload can\nbe given special attributes to enable functionality:\n- <code>[coral-fileupload-select]</code>. Click to choose file(s), replacing existing files.\n- <code>[coral-fileupload-dropzone]</code>. Drag and drop files to choose file(s), replacing existing files.\n- <code>[coral-fileupload-clear]</code>. Click to remove all files from the queue.\n- <code>[coral-fileupload-submit]</code>. Click to start uploading.\n- <code>[coral-fileupload-abort]</code>. Click to abort all uploads.\n- <code>[coral-fileupload-abortfile=\"filename.txt\"]</code>. Click to abort a specific file, leaving it in the queue.\n- <code>[coral-fileupload-removefile=\"filename.txt\"]</code>. Click to remove a specific file from the queue.\n- <code>[coral-fileupload-uploadfile=\"filename.txt\"]</code>. Click to start uploading a specific file."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-fileupload"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-fileupload></coral-fileupload>",
      "<caption>JS constructor</caption>\nnew Coral.FileUpload();"
    ],
    "see": [
      "../examples/#fileupload"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1064,
    "kind": "file",
    "name": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MIME_TYPES from '../data/mimetypes';\nimport {transform, validate} from '../../../coral-utils';\n\n/**\n Enumeration for {@link FileUploadItem} response types.\n\n @typedef {Object} FileUploadItemResponseTypeEnum\n\n @property {String} TEXT\n String type.\n @property {String} ARRAY_BUFFER\n Array buffer type.\n @property {String} BLOB\n Blob type.\n @property {String} DOCUMENT\n Document type.\n @property {String} JSON\n JavaScript object, parsed from a JSON string returned by the server.\n */\nconst responseType = {\n  TEXT: 'text',\n  ARRAY_BUFFER: 'arraybuffer',\n  BLOB: 'blob',\n  DOCUMENT: 'document',\n  JSON: 'json'\n};\n\n// eg text/plain\nconst MIME_TYPE_REGEXP = /(.+)\\/(.+)$/;\n// eg .txt\nconst FILE_EXTENSION_REGEXP = /\\.(.+)$/;\n// eg text\nconst SHORTCUT_REGEXP = /.*/;\nconst MIME_TYPE_AUDIO = 'audio/*';\nconst MIME_TYPE_IMAGE = 'image/*';\nconst MIME_TYPE_VIDEO = 'video/*';\n\n/**\n @class Coral.FileUpload.Item\n @classdesc A FileUpload item encapsulating file meta-data\n @param {File|HTMLElement} file\n The file element.\n */\nclass FileUploadItem {\n  /**\n   Takes a {File} as argument.\n\n   @param {File} file\n   */\n  constructor(file) {\n    this._originalFile = file;\n    this._xhr = null;\n  }\n\n  /**\n   The File.\n\n   @name file\n   @readonly\n   @type {File}\n   */\n  get file() {\n    return this._originalFile;\n  }\n\n  /**\n   Array of additional parameters as key:value to be uploaded with the file.\n   A parameter must contain a <code>name</code> key:value and optionally a <code>value</code> key:value.\n\n   @name parameters\n   @type {Array.<Object>}\n   @default []\n   */\n  get parameters() {\n    return this._parameters || [];\n  }\n\n  set parameters(value) {\n    const isValid = Array.isArray(value) && value.every((el) => el && el.name);\n\n    if (isValid) {\n      this._parameters = value;\n    }\n  }\n\n  /**\n   The item xhr <code>withCredentials</code> property.\n\n   @name withCredentials\n   @type {Boolean}\n   @default false\n   */\n  get withCredentials() {\n    return this._withCredentials || false;\n  }\n\n  set withCredentials(value) {\n    this._withCredentials = transform.boolean(value);\n  }\n\n  /**\n   The item xhr <code>timeout</code> property.\n\n   @name timeout\n   @type {Number}\n   @default 0\n   */\n  get timeout() {\n    return this._timeout || 0;\n  }\n\n  set timeout(value) {\n    const timeout = transform.number(value);\n    if (timeout !== null) {\n      this._timeout = timeout;\n      if (this._xhr) {\n        this._xhr.timeout = timeout;\n      }\n    }\n  }\n\n  /**\n   The item xhr <code>responseType</code> property. See {@link FileUploadItemResponseTypeEnum}.\n\n   @name responseType\n   @default {FileUploadItemResponseTypeEnum.TEXT}\n   @type {String}\n   */\n  get responseType() {\n    return this._responseType || responseType.TEXT;\n  }\n\n  set responseType(value) {\n    value = transform.string(value).toLowerCase();\n    this._responseType = validate.enumeration(responseType)(value) && value || responseType.TEXT;\n    if (this._xhr) {\n      this._xhr.responseType = value;\n    }\n  }\n\n  /**\n   The item xhr <code>readyState</code> property.\n\n   @name readyState\n   @readonly\n   @default 0\n   @type {Number}\n   */\n  get readyState() {\n    return this._xhr ? this._xhr.readyState : this._readyState || 0;\n  }\n\n  /**\n   The item xhr <code>responseType</code> property. Depends on {@link Coral.FileUpload.Item#responseType}.\n\n   @name response\n   @readonly\n   @default \"\"\n   @type {String|ArrayBuffer|Blob|Document}\n   */\n  get response() {\n    return this._xhr ? this._xhr.response : this._response || '';\n  }\n\n  /**\n   The item xhr <code>responseText</code> property.\n\n   @name responseText\n   @readonly\n   @default \"\"\n   @type {String}\n   */\n  get responseText() {\n    return this._xhr ? this._xhr.responseText : this._responseText || '';\n  }\n\n  /**\n   The item xhr <code>responseXML</code> property.\n\n   @name responseXML\n   @readonly\n   @default null\n   @type {HTMLElement}\n   */\n  get responseXML() {\n    return this._xhr ? this._xhr.responseXML : this._responseXML || null;\n  }\n\n  /**\n   The item xhr <code>status</code> property.\n\n   @name status\n   @readonly\n   @default 0\n   @type {Number}\n   */\n  get status() {\n    return this._xhr ? this._xhr.status : this._status || 0;\n  }\n\n  /**\n   The item xhr <code>statusText</code> property.\n\n   @name statusText\n   @readonly\n   @default \"\"\n   @type {String}\n   */\n  get statusText() {\n    return this._xhr ? this._xhr.statusText : this._statusText || '';\n  }\n\n  /** @private */\n  _isMimeTypeAllowed(acceptedMimeTypes) {\n    let isAllowed = false;\n\n    // Unrecognized browser mime types have a file type of ''.\n    const fileType = this.file.type || 'application/unknown';\n\n    if (!fileType.match(MIME_TYPE_REGEXP)) {\n      // File mime type is erroneous\n      return false;\n    }\n\n    return acceptedMimeTypes.split(',').some((allowedMimeType) => {\n      allowedMimeType = allowedMimeType.trim();\n\n      if (allowedMimeType === '*' ||\n        allowedMimeType === '.*' ||\n        allowedMimeType === '*/*' ||\n        fileType === 'application/unknown') {\n        // Explicit wildcard case: allow any file\n        // Allow unknown mime types\n        isAllowed = true;\n      } else if (allowedMimeType.match(MIME_TYPE_REGEXP)) {\n        if (allowedMimeType === MIME_TYPE_AUDIO) {\n          isAllowed = fileType.indexOf(MIME_TYPE_AUDIO.slice(0, -1)) === 0;\n        } else if (allowedMimeType === MIME_TYPE_IMAGE) {\n          isAllowed = fileType.indexOf(MIME_TYPE_IMAGE.slice(0, -1)) === 0;\n        } else if (allowedMimeType === MIME_TYPE_VIDEO) {\n          isAllowed = fileType.indexOf(MIME_TYPE_VIDEO.slice(0, -1)) === 0;\n        } else {\n          // Proper mime type case: directly compare with file mime type\n          isAllowed = fileType === allowedMimeType;\n        }\n      } else if (allowedMimeType.match(FILE_EXTENSION_REGEXP)) {\n        // File extension case\n        const allowedMimeTypes = MIME_TYPES[allowedMimeType];\n\n        // Depending on OS and browser, a file extension can map to different mime types\n        // e.g .csv maps to \"text/csv\" on Mac OS and to \"application/vnd.ms-excel\" on Windows\n        if (Array.isArray(allowedMimeTypes)) {\n          isAllowed = allowedMimeTypes.some((mimeType) => fileType === mimeType);\n        } else {\n          isAllowed = fileType === MIME_TYPES[allowedMimeType];\n        }\n      } else if (allowedMimeType.match(SHORTCUT_REGEXP)) {\n        // \"Shortcut\" case: only compare first part of the file mime type with the shortcut\n        isAllowed = fileType.split('/')[0] === allowedMimeType;\n      }\n\n      // Break the loop if file mime type is allowed\n      return isAllowed;\n    });\n  }\n\n  /**\n   Returns {@link FileUploadItem} response types.\n\n   @return {FileUploadItemResponseTypeEnum}\n   */\n  static get responseType() {\n    return responseType;\n  }\n}\n\nexport default FileUploadItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1065,
    "kind": "typedef",
    "name": "FileUploadItemResponseTypeEnum",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItemResponseTypeEnum",
    "access": "public",
    "description": "Enumeration for {@link FileUploadItem} response types.",
    "lineNumber": 32,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TEXT",
        "description": "String type."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ARRAY_BUFFER",
        "description": "Array buffer type."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BLOB",
        "description": "Blob type."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DOCUMENT",
        "description": "Document type."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "JSON",
        "description": "JavaScript object, parsed from a JSON string returned by the server."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "FileUploadItemResponseTypeEnum"
    }
  },
  {
    "__docId__": 1066,
    "kind": "variable",
    "name": "MIME_TYPE_REGEXP",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~MIME_TYPE_REGEXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 41,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1067,
    "kind": "variable",
    "name": "FILE_EXTENSION_REGEXP",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FILE_EXTENSION_REGEXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1068,
    "kind": "variable",
    "name": "SHORTCUT_REGEXP",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~SHORTCUT_REGEXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 45,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1069,
    "kind": "variable",
    "name": "MIME_TYPE_AUDIO",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~MIME_TYPE_AUDIO",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1070,
    "kind": "variable",
    "name": "MIME_TYPE_IMAGE",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~MIME_TYPE_IMAGE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 47,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1071,
    "kind": "variable",
    "name": "MIME_TYPE_VIDEO",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~MIME_TYPE_VIDEO",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1072,
    "kind": "class",
    "name": "FileUploadItem",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{FileUpload}",
    "description": "A FileUpload item encapsulating file meta-data",
    "lineNumber": 56,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.FileUpload.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A FileUpload item encapsulating file meta-data"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "File",
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "file",
        "description": "The file element."
      }
    ],
    "interface": false,
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.FileUpload.Item();"
    ],
    "see": [
      "../examples/#fileupload"
    ]
  },
  {
    "__docId__": 1073,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#constructor",
    "access": "public",
    "description": "Takes a {File} as argument.",
    "lineNumber": 62,
    "params": [
      {
        "nullable": null,
        "types": [
          "File"
        ],
        "spread": false,
        "optional": false,
        "name": "file",
        "description": ""
      }
    ]
  },
  {
    "__docId__": 1074,
    "kind": "member",
    "name": "_originalFile",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_originalFile",
    "access": "private",
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1075,
    "kind": "member",
    "name": "_xhr",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_xhr",
    "access": "private",
    "description": null,
    "lineNumber": 64,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1076,
    "kind": "member",
    "name": "file",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#file",
    "access": "public",
    "description": "The File.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 74,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "File"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1077,
    "kind": "member",
    "name": "parameters",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#parameters",
    "access": "public",
    "description": "Array of additional parameters as key:value to be uploaded with the file.\nA parameter must contain a <code>name</code> key:value and optionally a <code>value</code> key:value.\n<ul><li><code>[]</code> by default.</li></ul>",
    "lineNumber": 86,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "[]"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Array.<Object>"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1079,
    "kind": "member",
    "name": "_parameters",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_parameters",
    "access": "private",
    "description": null,
    "lineNumber": 94,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1080,
    "kind": "member",
    "name": "withCredentials",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#withCredentials",
    "access": "public",
    "description": "The item xhr <code>withCredentials</code> property.\n<ul><li><code>false</code> by default.</li></ul>",
    "lineNumber": 105,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1082,
    "kind": "member",
    "name": "_withCredentials",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_withCredentials",
    "access": "private",
    "description": null,
    "lineNumber": 110,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1083,
    "kind": "member",
    "name": "timeout",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#timeout",
    "access": "public",
    "description": "The item xhr <code>timeout</code> property.\n<ul><li><code>0</code> by default.</li></ul>",
    "lineNumber": 120,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "0"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1085,
    "kind": "member",
    "name": "_timeout",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_timeout",
    "access": "private",
    "description": null,
    "lineNumber": 127,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1086,
    "kind": "member",
    "name": "responseType",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#responseType",
    "access": "public",
    "description": "The item xhr <code>responseType</code> property. See {@link FileUploadItemResponseTypeEnum}.\n<ul><li><code>{FileUploadItemResponseTypeEnum.TEXT}</code> by default.</li></ul>",
    "lineNumber": 141,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "{FileUploadItemResponseTypeEnum.TEXT}"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1088,
    "kind": "member",
    "name": "_responseType",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_responseType",
    "access": "private",
    "description": null,
    "lineNumber": 147,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1089,
    "kind": "member",
    "name": "readyState",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#readyState",
    "access": "public",
    "description": "The item xhr <code>readyState</code> property.\n<ul><li><code>read-only</code></li><li><code>0</code> by default.</li></ul>",
    "lineNumber": 161,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "0"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1090,
    "kind": "member",
    "name": "response",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#response",
    "access": "public",
    "description": "The item xhr <code>responseType</code> property. Depends on {@link Coral.FileUpload.Item#responseType}.\n<ul><li><code>read-only</code></li><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 173,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String",
        "ArrayBuffer",
        "Blob",
        "Document"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1091,
    "kind": "member",
    "name": "responseText",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#responseText",
    "access": "public",
    "description": "The item xhr <code>responseText</code> property.\n<ul><li><code>read-only</code></li><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 185,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1092,
    "kind": "member",
    "name": "responseXML",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#responseXML",
    "access": "public",
    "description": "The item xhr <code>responseXML</code> property.\n<ul><li><code>read-only</code></li><li><code>null</code> by default.</li></ul>",
    "lineNumber": 197,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1093,
    "kind": "member",
    "name": "status",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#status",
    "access": "public",
    "description": "The item xhr <code>status</code> property.\n<ul><li><code>read-only</code></li><li><code>0</code> by default.</li></ul>",
    "lineNumber": 209,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "0"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1094,
    "kind": "member",
    "name": "statusText",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#statusText",
    "access": "public",
    "description": "The item xhr <code>statusText</code> property.\n<ul><li><code>read-only</code></li><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 221,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@default",
        "tagValue": "\"\""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1095,
    "kind": "method",
    "name": "_isMimeTypeAllowed",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem#_isMimeTypeAllowed",
    "access": "private",
    "description": null,
    "lineNumber": 226,
    "ignore": true,
    "params": [
      {
        "name": "acceptedMimeTypes",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1096,
    "kind": "member",
    "name": "responseType",
    "memberof": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-fileupload/src/scripts/FileUploadItem.js~FileUploadItem.responseType",
    "access": "public",
    "description": "Returns {@link FileUploadItem} response types.",
    "lineNumber": 284,
    "return": {
      "nullable": null,
      "types": [
        "FileUploadItemResponseTypeEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1097,
    "kind": "file",
    "name": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport ICON_MAP from '../../../coral-compat/data/iconMap';\nimport SPECTRUM_ICONS_PATH from '../resources/spectrum-icons.svg';\nimport SPECTRUM_ICONS_COLOR_PATH from '../resources/spectrum-icons-color.svg';\nimport SPECTRUM_CSS_ICONS_PATH from '../resources/spectrum-css-icons.svg';\nimport loadIcons from './loadIcons';\nimport {Decorator} from '../../../coral-decorator';\nimport {SPECTRUM_ICONS, SPECTRUM_ICONS_COLOR, SPECTRUM_CSS_ICONS} from './iconCollection';\n\nconst SPECTRUM_ICONS_IDENTIFIER = 'spectrum-';\nconst SPECTRUM_COLORED_ICONS_IDENTIFIER = [\n  'ColorLight',\n  'Color_Light',\n  'ColorDark',\n  'Color_Dark',\n  'ColorActive',\n  'Color_Active',\n  // Unique colored icons\n  'AdobeExperienceCloudColor',\n  'AdobeExperiencePlatformColor',\n];\n\nlet resourcesPath = (commons.options.icons || '').trim();\nif (resourcesPath.length && resourcesPath[resourcesPath.length - 1] !== '/') {\n  resourcesPath += '/';\n}\n\n// @IE11\nconst IS_IE11 = !window.ActiveXObject && 'ActiveXObject' in window;\nlet iconsExternal = commons.options.iconsExternal || 'on';\nif (IS_IE11) {\n  iconsExternal = 'off';\n}\n\nconst resolveIconsPath = (iconsPath) => {\n  const path = commons._script.src;\n  return `${path.split('/').slice(0, -iconsPath.split('/').length).join('/')}/${iconsPath}`;\n};\n\n/**\n Regex used to match URLs. Assume it's a URL if it has a slash, colon, or dot.\n\n @ignore\n */\nconst URL_REGEX = /\\/|:|\\./g;\n\n/**\n Regex used to match unresolved templates e.g. for data-binding\n\n @ignore\n */\nconst TEMPLATE_REGEX = /.*\\{\\{.+\\}\\}.*/g;\n\n/**\n Regex used to split camel case icon names into more screen-reader friendly alt text.\n\n @ignore\n */\nconst SPLIT_CAMELCASE_REGEX = /([a-z])([A-Z0-9])/g;\n\n/**\n Regex used to match the sized spectrum icon prefix\n\n @ignore\n */\nconst SPECTRUM_ICONS_IDENTIFIER_REGEX = /^spectrum(?:-css)?-icon(?:-\\d{1,3})?-/gi;\n\n/**\n Regex used match the variant postfix for an icon\n\n @ignore\n */\nconst ICONS_VARIANT_POSTFIX_REGEX = /(Outline)?(Filled)?(Small|Medium|Large)?(Color)?_?(Active|Dark|Light)?$/;\n\n/**\n Translation hint used for localizing default alt text for an icon\n\n @ignore\n */\nconst ICON_ALT_TRANSLATION_HINT = 'default icon alt text';\n\n/**\n Returns capitalized string. This is used to map the icons with their SVG counterpart.\n\n @ignore\n @param {String} s\n @return {String}\n */\nconst capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);\n\n/**\n Enumeration for {@link Icon} sizes.\n\n @typedef {Object} IconSizeEnum\n\n @property {String} EXTRA_EXTRA_SMALL\n Extra extra small size icon, typically 9px size.\n @property {String} EXTRA_SMALL\n Extra small size icon, typically 12px size.\n @property {String} SMALL\n Small size icon, typically 18px size. This is the default size.\n @property {String} MEDIUM\n Medium size icon, typically 24px size.\n @property {String} LARGE\n Large icon, typically 36px size.\n @property {String} EXTRA_LARGE\n Extra large icon, typically 48px size.\n @property {String} EXTRA_EXTRA_LARGE\n Extra extra large icon, typically 72px size.\n */\nconst size = {\n  EXTRA_EXTRA_SMALL: 'XXS',\n  EXTRA_SMALL: 'XS',\n  SMALL: 'S',\n  MEDIUM: 'M',\n  LARGE: 'L',\n  EXTRA_LARGE: 'XL',\n  EXTRA_EXTRA_LARGE: 'XXL'\n};\n\n\n/**\n Enumeration for {@link Icon} autoAriaLabel value.\n\n @typedef {Object} IconAutoAriaLabelEnum\n\n @property {String} ON\n The aria-label attribute is automatically set based on the icon name.\n @property {String} OFF\n The aria-label attribute is not set and has to be provided explicitly.\n */\nconst autoAriaLabel = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n// icon's base classname\nconst CLASSNAME = '_coral-Icon';\n\n// builds an array containing all possible size classnames. this will be used to remove classnames when the size\n// changes\nconst ALL_SIZE_CLASSES = [];\nfor (const sizeValue in size) {\n  ALL_SIZE_CLASSES.push(`${CLASSNAME}--size${size[sizeValue]}`);\n}\n\n// Based on https://github.com/adobe/spectrum-css/tree/master/icons\nconst sizeMap = {\n  XXS: 18,\n  XS: 24,\n  S: 18,\n  M: 24,\n  L: 18,\n  XL: 24,\n  XXL: 24\n};\n\n/**\n @class Coral.Icon\n @classdesc An Icon component. Icon ships with a set of SVG icons.\n @htmltag coral-icon\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Icon = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._elements = {};\n  }\n\n  /**\n   Whether aria-label is set automatically. See {@link IconAutoAriaLabelEnum}.\n\n   @type {String}\n   @default IconAutoAriaLabelEnum.OFF\n   */\n  get autoAriaLabel() {\n    return this._autoAriaLabel || autoAriaLabel.OFF;\n  }\n\n  set autoAriaLabel(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(autoAriaLabel)(value) && value || autoAriaLabel.OFF;\n    if(validate.valueMustChange(this._autoAriaLabel, value)) {\n      this._autoAriaLabel = value;\n      this._updateAltText();\n    }\n  }\n\n  /**\n   Icon name.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    const icon = transform.string(value).trim();\n\n    // Avoid rendering the same icon\n    if (icon !== this._icon || this.hasAttribute('_context')) {\n      this._icon = icon;\n      this._reflectAttribute('icon', this._icon);\n\n      // Ignore unresolved templates\n      if (this._icon.match(TEMPLATE_REGEX)) {\n        return;\n      }\n\n      // Use the existing img\n      if (this._hasRawImage) {\n        this._elements.image.classList.add(CLASSNAME, `${CLASSNAME}--image`);\n        this._updateAltText();\n        return;\n      }\n\n      // Remove image and SVG elements\n      ['image', 'svg'].forEach((type) => {\n        const el = this._elements[type] || this.querySelector(`.${CLASSNAME}--${type}`);\n        if (el) {\n          el.remove();\n        }\n      });\n\n      // Sets the desired icon\n      if (this._icon) {\n        // Detect if it's a URL\n        if (this._icon.match(URL_REGEX)) {\n          // Create an image and add it to the icon\n          this._elements.image = this._elements.image || document.createElement('img');\n          this._elements.image.className = `${CLASSNAME} ${CLASSNAME}--image`;\n          this._elements.image.src = this.icon;\n          this.appendChild(this._elements.image);\n        } else {\n          this._updateIcon();\n        }\n      }\n\n      this._updateAltText();\n    }\n  }\n\n  /**\n   Size of the icon. It accepts both lower and upper case sizes. See {@link IconSizeEnum}.\n\n   @type {String}\n   @default IconSizeEnum.SMALL\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.SMALL;\n  }\n\n  set size(value) {\n    const oldSize = this._size;\n\n    value = transform.string(value).toUpperCase();\n    value = validate.enumeration(size)(value) && value || size.SMALL;\n    \n    this._reflectAttribute('size', value);\n    \n    if(validate.valueMustChange(this._size, value)) {\n      this._size = value;\n\n      // removes all the existing sizes\n      this.classList.remove(...ALL_SIZE_CLASSES);\n      // adds the new size\n      this.classList.add(`${CLASSNAME}--size${value}`);\n  \n      // We need to update the icon if the size changed\n      if (oldSize && oldSize !== value && this.contains(this._elements.svg)) {\n        this._elements.svg.remove();\n        this._updateIcon();\n      }\n  \n      this._updateAltText();\n    }\n  }\n\n  /** @private */\n  get title() {\n    return this.getAttribute('title');\n  }\n\n  set title(value) {\n    this.setAttribute('title', value);\n  }\n\n  /** @private */\n  get alt() {\n    return this.getAttribute('alt');\n  }\n\n  set alt(value) {\n    this.setAttribute('alt', value);\n  }\n\n  _updateIcon() {\n    let iconId = this.icon;\n\n    // If icon name is passed, we have to build the icon Id based on the icon name\n    if (iconId.indexOf(SPECTRUM_ICONS_IDENTIFIER) !== 0) {\n      const iconMapped = ICON_MAP[iconId];\n      let iconName;\n\n      // Restore default state\n      this.removeAttribute('_context');\n\n      if (iconMapped) {\n        if (iconMapped.spectrumIcon) {\n          // Use the default mapped icon\n          iconName = iconMapped.spectrumIcon;\n        } else {\n          // Verify if icon should be light or dark by looking up parents theme\n          const closest = this.closest('.coral--light, .coral--dark, .coral--lightest, .coral--darkest');\n\n          if (closest) {\n            if (closest.classList.contains('coral--light') || closest.classList.contains('coral--lightest')) {\n              // Use light icon\n              iconName = iconMapped.spectrumIconLight;\n            } else {\n              // Use dark icon\n              iconName = iconMapped.spectrumIconDark;\n            }\n          }\n          // Use light by default\n          else {\n            iconName = iconMapped.spectrumIconLight;\n          }\n\n          // Mark icon as contextual icon because the icon name is defined based on the theme\n          this.setAttribute('_context', '');\n        }\n\n        // Inform user about icon name changes\n        if (iconName) {\n          commons._log('warn', `Coral.Icon: the icon ${iconId} has been deprecated. Please use ${iconName} instead.`);\n        } else {\n          commons._log('warn', `Coral.Icon: the icon ${iconId} has been removed. Please contact Icons@Adobe.`);\n        }\n      }\n      // In most cases, using the capitalized icon name maps to the spectrum icon name\n      else {\n        iconName = capitalize(iconId);\n      }\n\n      // Verify if icon name is a colored icon\n      if (SPECTRUM_COLORED_ICONS_IDENTIFIER.some(identifier => iconName.indexOf(identifier) !== -1)) {\n        // Colored icons are 24 by default\n        iconId = `spectrum-icon-24-${iconName}`;\n      } else {\n        const sizeAttribute = this.getAttribute('size');\n        const iconSize = sizeMap[sizeAttribute && sizeAttribute.toUpperCase() || size.SMALL];\n        iconId = `spectrum-icon-${iconSize}-${iconName}`;\n      }\n    }\n\n    // Insert SVG Icon using HTML because DOMly doesn't support document.createElementNS for <use> element\n    this.insertAdjacentHTML('beforeend', this.constructor._renderSVG(iconId));\n\n    this._elements.svg = this.lastElementChild;\n  }\n\n  /**\n   Updates the aria-label or img alt attribute depending on value of alt, title, icon and autoAriaLabel.\n\n   In cases where the alt attribute has been removed or set to an empty string,\n   for example, when the alt property is undefined and we add the attribute alt=''\n   to explicitly override the default behavior, or when we remove an alt attribute\n   thus restoring the default behavior, we make sure to update the alt text.\n   @private\n   */\n  _updateAltText(value) {\n    const hasAutoAriaLabel = this.autoAriaLabel === autoAriaLabel.ON;\n    const img = this._elements.image;\n    const isImage = this.contains(img);\n\n    // alt should be prioritized over title\n    let altText = typeof this.alt === 'string' ? this.alt : this.title;\n\n    if (typeof value === 'string') {\n      altText = this.alt || value;\n    } else if (isImage) {\n      altText = altText || img.getAttribute('alt') || img.getAttribute('title') || '';\n    } else if (hasAutoAriaLabel) {\n      let iconName = this.icon.replace(SPECTRUM_ICONS_IDENTIFIER_REGEX, '');\n      iconName = iconName.replace(ICONS_VARIANT_POSTFIX_REGEX, '');\n      altText = i18n.get(iconName.replace(SPLIT_CAMELCASE_REGEX, '$1 $2').toLowerCase(), ICON_ALT_TRANSLATION_HINT);\n    }\n\n    // If no other role has been set, provide the appropriate\n    // role depending on whether or not the icon is an arbitrary image URL.\n    const role = this.getAttribute('role');\n    const roleOverride = role && (role !== 'presentation' && role !== 'img');\n    if (!roleOverride) {\n      this.setAttribute('role', isImage ? 'presentation' : 'img');\n    }\n\n    // Set accessibility attributes accordingly\n    if (isImage) {\n      hasAutoAriaLabel && this.removeAttribute('aria-label');\n      img.setAttribute('alt', altText);\n    } else if (altText === '') {\n      this.removeAttribute('aria-label');\n      if (!roleOverride) {\n        this.removeAttribute('role');\n      }\n    } else if (altText) {\n      this.setAttribute('aria-label', altText);\n    }\n  }\n\n  /**\n   Whether SVG icons are referenced as external resource (on/off)\n\n   @return {String}\n   */\n  static _iconsExternal() {\n    return iconsExternal;\n  }\n\n  /**\n   Returns the SVG markup.\n\n   @param {String} iconId\n   @param {Array.<String>} additionalClasses\n   @return {String}\n   */\n  static _renderSVG(iconId, additionalClasses = []) {\n    additionalClasses.unshift(CLASSNAME);\n    additionalClasses.unshift(`${CLASSNAME}--svg`);\n\n    let iconPath = `#${iconId}`;\n\n    // If not colored icons\n    if (this._iconsExternal() === 'on' && !SPECTRUM_COLORED_ICONS_IDENTIFIER.some(identifier => iconId.indexOf(identifier) !== -1)) {\n      // Generate spectrum-css-icons path\n      if (iconId.indexOf('spectrum-css') === 0) {\n        iconPath = resourcesPath ? `${resourcesPath}${SPECTRUM_CSS_ICONS}.svg#${iconId}` : `${resolveIconsPath(SPECTRUM_CSS_ICONS_PATH)}#${iconId}`;\n      }\n      // Generate spectrum-icons path\n      else {\n        iconPath = resourcesPath ? `${resourcesPath}${SPECTRUM_ICONS}.svg#${iconId}` : `${resolveIconsPath(SPECTRUM_ICONS_PATH)}#${iconId}`;\n      }\n    }\n\n    return `\n      <svg focusable=\"false\" aria-hidden=\"true\" class=\"${additionalClasses.join(' ')}\">\n        <use xlink:href=\"${iconPath}\"></use>\n      </svg>\n    `;\n  }\n\n  /**\n   Returns {@link Icon} sizes.\n\n   @return {IconSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link Icon} autoAriaLabel options.\n\n   @return {IconAutoAriaLabelEnum}\n   */\n  static get autoAriaLabel() {\n    return autoAriaLabel;\n  }\n\n  /**\n   Loads the SVG icons. It's requesting the icons based on the JS file path by default.\n\n   @param {String} [url] SVG icons url.\n   */\n  static load(url) {\n    const resolveIconsPath = (iconsPath) => {\n      const path = commons._script.src;\n      if (iconsExternal === 'js') {\n        iconsPath = iconsPath.replace('.svg', '.js');\n      }\n\n      return `${path.split('/').slice(0, -iconsPath.split('/').length).join('/')}/${iconsPath}`;\n    };\n\n    if (url === SPECTRUM_ICONS) {\n      url = resolveIconsPath(SPECTRUM_ICONS_PATH);\n    } else if (url === SPECTRUM_ICONS_COLOR) {\n      url = resolveIconsPath(SPECTRUM_ICONS_COLOR_PATH);\n    } else if (url === SPECTRUM_CSS_ICONS) {\n      url = resolveIconsPath(SPECTRUM_CSS_ICONS_PATH);\n    }\n\n    loadIcons(url);\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      autoarialabel: 'autoAriaLabel'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['autoarialabel', 'icon', 'size', 'alt', 'title']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === 'alt' || name === 'title') {\n      this._updateAltText(value);\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Contextual icons need to be checked again\n    if (this.hasAttribute('_context')) {\n      this.icon = this.icon;\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Set default size\n    if (!this._size) {\n      this.size = size.SMALL;\n    }\n\n    const img = this.querySelector(`img:not(.${CLASSNAME}--image)`);\n    if (img) {\n      this._elements.image = img;\n      this._hasRawImage = true;\n      this.icon = img.getAttribute('src');\n      this._hasRawImage = false;\n    }\n  }\n});\n\n// Load icon collections by default\nconst iconCollections = [SPECTRUM_ICONS_COLOR];\nlet extension = '.svg';\nif (Icon._iconsExternal() === 'off' || Icon._iconsExternal() === 'js') {\n  iconCollections.push(SPECTRUM_CSS_ICONS);\n  iconCollections.push(SPECTRUM_ICONS);\n\n  if (Icon._iconsExternal() === 'js') {\n    extension = '.js';\n  }\n}\niconCollections.forEach(iconSet => Icon.load(resourcesPath ? `${resourcesPath}${iconSet}${extension}` : iconSet));\n\nexport default Icon;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1098,
    "kind": "variable",
    "name": "SPECTRUM_ICONS_IDENTIFIER",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~SPECTRUM_ICONS_IDENTIFIER",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1099,
    "kind": "variable",
    "name": "SPECTRUM_COLORED_ICONS_IDENTIFIER",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~SPECTRUM_COLORED_ICONS_IDENTIFIER",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1100,
    "kind": "variable",
    "name": "resourcesPath",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~resourcesPath",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1101,
    "kind": "variable",
    "name": "IS_IE11",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~IS_IE11",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 42,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1102,
    "kind": "variable",
    "name": "iconsExternal",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~iconsExternal",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1103,
    "kind": "function",
    "name": "resolveIconsPath",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~resolveIconsPath",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "params": [
      {
        "name": "iconsPath",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1104,
    "kind": "variable",
    "name": "URL_REGEX",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~URL_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used to match URLs. Assume it's a URL if it has a slash, colon, or dot.",
    "lineNumber": 58,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1105,
    "kind": "variable",
    "name": "TEMPLATE_REGEX",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~TEMPLATE_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used to match unresolved templates e.g. for data-binding",
    "lineNumber": 65,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1106,
    "kind": "variable",
    "name": "SPLIT_CAMELCASE_REGEX",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~SPLIT_CAMELCASE_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used to split camel case icon names into more screen-reader friendly alt text.",
    "lineNumber": 72,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1107,
    "kind": "variable",
    "name": "SPECTRUM_ICONS_IDENTIFIER_REGEX",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~SPECTRUM_ICONS_IDENTIFIER_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used to match the sized spectrum icon prefix",
    "lineNumber": 79,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1108,
    "kind": "variable",
    "name": "ICONS_VARIANT_POSTFIX_REGEX",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~ICONS_VARIANT_POSTFIX_REGEX",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Regex used match the variant postfix for an icon",
    "lineNumber": 86,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 1109,
    "kind": "variable",
    "name": "ICON_ALT_TRANSLATION_HINT",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~ICON_ALT_TRANSLATION_HINT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Translation hint used for localizing default alt text for an icon",
    "lineNumber": 93,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1110,
    "kind": "function",
    "name": "capitalize",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~capitalize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Returns capitalized string. This is used to map the icons with their SVG counterpart.",
    "lineNumber": 102,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "s",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": ""
    }
  },
  {
    "__docId__": 1111,
    "kind": "typedef",
    "name": "IconSizeEnum",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~IconSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Icon} sizes.",
    "lineNumber": 124,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_EXTRA_SMALL",
        "description": "Extra extra small size icon, typically 9px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_SMALL",
        "description": "Extra small size icon, typically 12px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "Small size icon, typically 18px size. This is the default size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "Medium size icon, typically 24px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "Large icon, typically 36px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_LARGE",
        "description": "Extra large icon, typically 48px size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "EXTRA_EXTRA_LARGE",
        "description": "Extra extra large icon, typically 72px size."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "IconSizeEnum"
    }
  },
  {
    "__docId__": 1112,
    "kind": "typedef",
    "name": "IconAutoAriaLabelEnum",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~IconAutoAriaLabelEnum",
    "access": "public",
    "description": "Enumeration for {@link Icon} autoAriaLabel value.",
    "lineNumber": 145,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "The aria-label attribute is automatically set based on the icon name."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "The aria-label attribute is not set and has to be provided explicitly."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "IconAutoAriaLabelEnum"
    }
  },
  {
    "__docId__": 1113,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 151,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1114,
    "kind": "variable",
    "name": "ALL_SIZE_CLASSES",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~ALL_SIZE_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 155,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1115,
    "kind": "variable",
    "name": "sizeMap",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~sizeMap",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 161,
    "undocument": true,
    "type": {
      "types": [
        "{\"XXS\": number, \"XS\": number, \"S\": number, \"M\": number, \"L\": number, \"XL\": number, \"XXL\": number}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1116,
    "kind": "variable",
    "name": "iconCollections",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~iconCollections",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 571,
    "undocument": true,
    "type": {
      "types": [
        "undefined[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1117,
    "kind": "variable",
    "name": "extension",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~extension",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 572,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1118,
    "kind": "variable",
    "name": "Icon",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/Icon.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/Icon.js~Icon",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Icon}",
    "description": "An Icon component. Icon ships with a set of SVG icons.",
    "lineNumber": 178,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Icon"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An Icon component. Icon ships with a set of SVG icons."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-icon"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-icon></coral-icon>",
      "<caption>JS constructor</caption>\nnew Coral.Icon();"
    ],
    "see": [
      "../examples/#icon"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1119,
    "kind": "file",
    "name": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nconst SPECTRUM_ICONS = 'spectrum-icons';\nconst SPECTRUM_ICONS_COLOR = 'spectrum-icons-color';\nconst SPECTRUM_CSS_ICONS = 'spectrum-css-icons';\n\nexport {\n  SPECTRUM_ICONS,\n  SPECTRUM_ICONS_COLOR,\n  SPECTRUM_CSS_ICONS\n};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-icon/src/scripts/iconCollection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1120,
    "kind": "variable",
    "name": "SPECTRUM_ICONS",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js~SPECTRUM_ICONS",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SPECTRUM_ICONS}",
    "description": "Copyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 13,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1121,
    "kind": "variable",
    "name": "SPECTRUM_ICONS_COLOR",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js~SPECTRUM_ICONS_COLOR",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SPECTRUM_ICONS_COLOR}",
    "description": null,
    "lineNumber": 14,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1122,
    "kind": "variable",
    "name": "SPECTRUM_CSS_ICONS",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/iconCollection.js~SPECTRUM_CSS_ICONS",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SPECTRUM_CSS_ICONS}",
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1123,
    "kind": "file",
    "name": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {SPECTRUM_ICONS_COLOR} from './iconCollection';\n\nfunction handleError(string) {\n  string = `Coral.Icon#load: ${string}`;\n  const error = new Error(string);\n\n  console.error(error.toString());\n}\n\nfunction injectSVG(svgURL) {\n  // 200 for web servers, 0 for CEP panels\n  if (this.status !== 200 && this.status !== 0) {\n    handleError(`failed to fetch icons, server returned ${this.status}`);\n    return;\n  }\n\n  // Parse the SVG\n  const parser = new DOMParser();\n  try {\n    const doc = parser.parseFromString(this.responseText, 'image/svg+xml');\n    const svg = doc.firstChild;\n\n    // Make sure a real SVG was returned\n    if (svg && svg.tagName === 'svg') {\n      if (svgURL.indexOf(SPECTRUM_ICONS_COLOR) !== -1) {\n        // Insert it into the body\n        if (document.body) {\n          document.body.appendChild(svg);\n        } else {\n          document.addEventListener('DOMContentLoaded', () => {\n            document.body.appendChild(svg);\n          });\n        }\n      } else {\n        document.head.appendChild(svg);\n      }\n    } else {\n      handleError('parsed SVG document contained something other than an SVG');\n    }\n  } catch (err) {\n    handleError(`error parsing SVG: ${err}`);\n  }\n}\n\nfunction loadIcons(svgURL) {\n  if (svgURL.slice(-3) === '.js') {\n    // Injects the SVG icons in the document\n    const script = document.createElement('script');\n    script.async = true;\n    script.type = 'text/javascript';\n    script.src = svgURL;\n    document.head.appendChild(script);\n  } else {\n    // Request the SVG icons\n    const req = new XMLHttpRequest();\n    req.open('GET', svgURL, true);\n    req.addEventListener('load', injectSVG.bind(req, svgURL));\n    req.addEventListener('error', () => {\n      handleError('Request failed');\n    });\n    req.send();\n  }\n}\n\nexport default loadIcons;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-icon/src/scripts/loadIcons.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1124,
    "kind": "function",
    "name": "handleError",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js~handleError",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "params": [
      {
        "name": "string",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1125,
    "kind": "function",
    "name": "injectSVG",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js~injectSVG",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "params": [
      {
        "name": "svgURL",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1126,
    "kind": "function",
    "name": "loadIcons",
    "memberof": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-icon/src/scripts/loadIcons.js~loadIcons",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{loadIcons}",
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "params": [
      {
        "name": "svgURL",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1127,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/AnchorList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseList} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-AnchorList';\n\n/**\n @class Coral.AnchorList\n @classdesc An AnchorList component that supports multi-line text, icons, and text wrapping with ellipsis.\n @htmltag coral-anchorlist\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseList}\n */\nconst AnchorList = Decorator(class extends BaseList(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      'click [coral-list-item]': '_onItemClick'\n    }));\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-anchorlist-item';\n  }\n\n  /** @private */\n  get _itemBaseTagName() {\n    // Used for Collection\n    return 'a';\n  }\n\n  _onItemClick(event) {\n    this._trackEvent('click', 'coral-anchorlist-item', event, event.matchedTarget);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default AnchorList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/AnchorList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1128,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/AnchorList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/AnchorList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1129,
    "kind": "variable",
    "name": "AnchorList",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/AnchorList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/AnchorList.js~AnchorList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{AnchorList}",
    "description": "An AnchorList component that supports multi-line text, icons, and text wrapping with ellipsis.",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.AnchorList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An AnchorList component that supports multi-line text, icons, and text wrapping with ellipsis."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-anchorlist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseList}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-anchorlist></coral-anchorlist>",
      "<caption>JS constructor</caption>\nnew Coral.AnchorList();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1130,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseListItem} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-AnchorList-item';\n\n/**\n @class Coral.AnchorList.Item\n @classdesc An AnchorList item component\n @htmltag coral-anchorlist-item\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n @extends {BaseListItem}\n */\nconst AnchorListItem = Decorator(class extends BaseListItem(BaseComponent(HTMLAnchorElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      click: '_onClick'\n    });\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return super.disabled;\n  }\n\n  set disabled(value) {\n    super.disabled = value;\n\n    if (this.disabled) {\n      // It's not tabbable anymore\n      this.setAttribute('tabindex', '-1');\n    } else {\n      // Now it's tabbable\n      this.setAttribute('tabindex', '0');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.content || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @private */\n  _onClick(event) {\n    // Support disabled property\n    if (this.disabled) {\n      event.preventDefault();\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default AnchorListItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1131,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1132,
    "kind": "variable",
    "name": "AnchorListItem",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/AnchorListItem.js~AnchorListItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{AnchorList}",
    "description": "An AnchorList item component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.AnchorList.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An AnchorList item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-anchorlist-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLAnchorElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseListItem}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-anchorlist-item></coral-anchorlist-item>",
      "<caption>JS constructor</caption>\nnew Coral.AnchorList.Item();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1133,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/ButtonList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseList} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ButtonList';\n\n/**\n @class Coral.ButtonList\n @classdesc A ButtonList component that supports multi-line text, icons, and text wrapping with ellipsis.\n @htmltag coral-buttonlist\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseList}\n */\nconst ButtonList = Decorator(class extends BaseList(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(commons.extend(this._events, {\n      'click [coral-list-item]': '_onItemClick'\n    }));\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-buttonlist-item';\n  }\n\n  /** @private */\n  get _itemBaseTagName() {\n    // Used for Collection\n    return 'button';\n  }\n\n  _onItemClick(event) {\n    this._trackEvent('click', 'coral-buttonlist-item', event, event.matchedTarget);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default ButtonList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/ButtonList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1134,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ButtonList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ButtonList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1135,
    "kind": "variable",
    "name": "ButtonList",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ButtonList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ButtonList.js~ButtonList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ButtonList}",
    "description": "A ButtonList component that supports multi-line text, icons, and text wrapping with ellipsis.",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ButtonList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A ButtonList component that supports multi-line text, icons, and text wrapping with ellipsis."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-buttonlist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseList}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-buttonlist></coral-buttonlist>",
      "<caption>JS constructor</caption>\nnew Coral.ButtonList();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1136,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseListItem} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ButtonList-item';\n\n/**\n @class Coral.ButtonList.Item\n @classdesc An ButtonList item component\n @htmltag coral-buttonlist-item\n @extends {HTMLButtonElement}\n @extends {BaseComponent}\n @extends {BaseListItem}\n */\nconst ButtonListItem = Decorator(class extends BaseListItem(BaseComponent(HTMLButtonElement)) {\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.content || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default ButtonListItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1137,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1138,
    "kind": "variable",
    "name": "ButtonListItem",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ButtonListItem.js~ButtonListItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{ButtonList}",
    "description": "An ButtonList item component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.ButtonList.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "An ButtonList item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-buttonlist-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLButtonElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseListItem}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-buttonlist-item></coral-buttonlist-item>",
      "<caption>JS constructor</caption>\nnew Coral.ButtonList.Item();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1139,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/List.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseList} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.List\n @classdesc A List component that supports multi-line text, icons, and text wrapping with ellipsis.\n @htmltag coral-list\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseList}\n */\nconst List = Decorator(class extends BaseList(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(this._events);\n  }\n});\n\nexport default List;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/List.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1140,
    "kind": "variable",
    "name": "List",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/List.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/List.js~List",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{List}",
    "description": "A List component that supports multi-line text, icons, and text wrapping with ellipsis.",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.List"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A List component that supports multi-line text, icons, and text wrapping with ellipsis."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-list"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseList}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-list></coral-list>",
      "<caption>JS constructor</caption>\nnew Coral.List();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1141,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/ListDivider.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Menu-divider';\n\n/**\n @class Coral.List.Divider\n @classdesc The List divider\n @htmltag coral-list-divider\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst ListDivider = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'separator');\n  }\n});\n\nexport default ListDivider;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/ListDivider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1142,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ListDivider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ListDivider.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1143,
    "kind": "variable",
    "name": "ListDivider",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ListDivider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ListDivider.js~ListDivider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{List}",
    "description": "The List divider",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.List.Divider"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The List divider"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-list-divider"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-list-divider></coral-list-divider>",
      "<caption>JS constructor</caption>\nnew Coral.List.Divider();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1144,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/ListItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseListItem} from '../../../coral-base-list';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.List.Item\n @classdesc A List item component\n @htmltag coral-list-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseListItem}\n */\nconst ListItem = Decorator(class extends BaseListItem(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents(this._events);\n  }\n});\n\nexport default ListItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/ListItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1145,
    "kind": "variable",
    "name": "ListItem",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ListItem.js~ListItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{List}",
    "description": "A List item component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.List.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A List item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-list-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseListItem}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-list-item></coral-list-item>",
      "<caption>JS constructor</caption>\nnew Coral.List.Item();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1146,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/ListItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.List.Item.Content\n @classdesc The List item content\n @htmltag coral-list-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-list-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/ListItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1147,
    "kind": "function",
    "name": "ListItemContent",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/ListItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/ListItemContent.js~ListItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{List}",
    "description": "The List item content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.List.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The List item content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-list-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-list-item-content></coral-list-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.List.Item.Content();"
    ],
    "see": [
      "../examples/#list"
    ],
    "params": []
  },
  {
    "__docId__": 1148,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport '../../../coral-component-wait';\nimport loadIndicator from '../templates/loadIndicator';\nimport {transform, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst KEYPRESS_TIMEOUT_DURATION = 1000;\n\n/**\n The distance, in pixels, from the bottom of the SelectList at which we trigger a scrollbottom event. For example, a\n value of 50 would indicate a scrollbottom event should be triggered when the user scrolls to within 50 pixels of the\n bottom.\n\n @type {Number}\n @ignore\n */\nconst SCROLL_BOTTOM_THRESHOLD = 50;\n\n/**\n The number of milliseconds for which scroll events should be debounced.\n\n @type {Number}\n @ignore\n */\nconst SCROLL_DEBOUNCE = 100;\n\n/** @ignore */\nconst ITEM_TAG_NAME = 'coral-selectlist-item';\n\n/** @ignore */\nconst GROUP_TAG_NAME = 'coral-selectlist-group';\n\nconst CLASSNAME = '_coral-Menu';\n\n/**\n @class Coral.SelectList\n @classdesc A SelectList component is a selectable list of items.\n @htmltag coral-selectlist\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SelectList = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      'scroll': '_onScroll',\n      'mouseenter': '_onMouseEnter',\n      'capture:blur': '_onBlur',\n\n      'click coral-selectlist-item': '_onItemClick',\n\n      'key:space coral-selectlist-item': '_onToggleItemKey',\n      'key:return coral-selectlist-item': '_onToggleItemKey',\n      'key:pageup coral-selectlist-item': '_focusPreviousItem',\n      'key:left coral-selectlist-item': '_focusPreviousItem',\n      'key:up coral-selectlist-item': '_focusPreviousItem',\n      'key:pagedown coral-selectlist-item': '_focusNextItem',\n      'key:right coral-selectlist-item': '_focusNextItem',\n      'key:down coral-selectlist-item': '_focusNextItem',\n      'key:home coral-selectlist-item': '_onHomeKey',\n      'key:end coral-selectlist-item': '_onEndKey',\n      'keypress coral-selectlist-item': '_onKeyPress',\n\n      // private\n      'coral-selectlist-item:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    this._keypressTimeoutDuration = KEYPRESS_TIMEOUT_DURATION;\n\n    // Templates\n    this._elements = {};\n    loadIndicator.call(this._elements);\n\n    // Used for eventing\n    this._oldSelection = [];\n\n    // Used for interaction\n    this._keypressTimeoutID = null;\n    this._keypressSearchString = '';\n\n    // we correctly bind the scroll event\n    this._onDebouncedScroll = this._onDebouncedScroll.bind(this);\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the {@link SelectListGroup} elements that the\n   SelectList contains. This includes items nested inside groups. To manage items contained within a specific\n   group, see {@link SelectListGroup#items}.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get groups() {\n    // just init on demand\n    if (!this._groups) {\n      this._groups = new SelectableCollection({\n        host: this,\n        itemTagName: GROUP_TAG_NAME,\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n    return this._groups;\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: ITEM_TAG_NAME,\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item in the SelectList.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getAllSelected()[0] || null;\n  }\n\n  /**\n   The selected items of the SelectList.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Indicates whether the SelectList accepts multiple selected items.\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this[this._multiple ? 'setAttribute' : 'removeAttribute']('aria-multiselectable', this._multiple);\n\n    this._validateSelection();\n  }\n\n  /**\n   Whether items are being loaded for the SelectList. Toggling this merely shows or hides a loading indicator.\n\n   @default false\n   @type {Boolean}\n   @htmlattribute loading\n   @htmlattributereflected\n   */\n  get loading() {\n    return this._loading || false;\n  }\n\n  set loading(value) {\n    this._loading = transform.booleanAttr(value);\n    this._reflectAttribute('loading', this._loading);\n\n    const load = this._elements.loadIndicator;\n\n    if (this.loading) {\n      // we decide first if we need to scroll to the bottom since adding the load will change the dimentions\n      const scrollToBottom = this.scrollTop >= this.scrollHeight - this.clientHeight;\n\n      // inserts the item at the end\n      this.appendChild(load);\n\n      // we make the load indicator visible\n      if (scrollToBottom) {\n        /** @ignore */\n        this.scrollTop = this.scrollHeight;\n      }\n    } else {\n      load.remove();\n    }\n  }\n\n  /** @private **/\n  get _tabTarget() {\n    return this.__tabTarget || null;\n  }\n\n  set _tabTarget(value) {\n    this.__tabTarget = value;\n\n    // Set all but the current set _tabTarget to not be a tab target:\n    this.items._getSelectableItems().forEach((item) => {\n      item.setAttribute('tabindex', !value || item === value ? 0 : -1);\n    });\n  }\n\n  /** @private */\n  _toggleItemSelection(item) {\n    if (item) {\n      const beforeChangeEvent = this.trigger('coral-selectlist:beforechange', {item});\n\n      if (!beforeChangeEvent.defaultPrevented) {\n        item[item.hasAttribute('selected') ? 'removeAttribute' : 'setAttribute']('selected', '');\n      }\n    }\n  }\n\n  /** @private */\n  _onBlur() {\n    // required otherwise the latest item that had the focus would get it again instead of the selected item\n    this._resetTabTarget();\n  }\n\n  /** @private */\n  _onItemClick(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const item = event.matchedTarget;\n    this._toggleItemSelection(item);\n    this._focusItem(item);\n  }\n\n  /** @private */\n  _focusItem(item) {\n    if (item) {\n      item.focus();\n    }\n\n    this._tabTarget = item;\n  }\n\n  /** @private */\n  _onToggleItemKey(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const item = event.target;\n\n    this._toggleItemSelection(item);\n    this._focusItem(item);\n  }\n\n  /** @private */\n  _focusPreviousItem(event) {\n    event.preventDefault();\n\n    this._focusItem(this.items._getPreviousSelectable(event.target));\n  }\n\n  /** @private */\n  _focusNextItem(event) {\n    event.preventDefault();\n\n    this._focusItem(this.items._getNextSelectable(event.target));\n  }\n\n  _focusFirstItem() {\n    this._focusItem(this.items._getFirstSelectable());\n  }\n\n  _focusLastItem() {\n    this._focusItem(this.items._getLastSelectable());\n  }\n\n  /** @private */\n  _onHomeKey(event) {\n    event.preventDefault();\n\n    this._focusFirstItem();\n  }\n\n  /** @private */\n  _onEndKey(event) {\n    event.preventDefault();\n\n    this._focusLastItem();\n  }\n\n  /**\n   Handles keypress event for alphanumeric search.\n\n   @param {KeyboardEvent} event\n   The keyboard event.\n   @private\n   */\n  _onKeyPress(event) {\n    // The string entered when the key was pressed\n    const newString = String.fromCharCode(event.which);\n\n    // Clear the timeout before the _keypressSearchString is cleared\n    window.clearTimeout(this._keypressTimeoutID);\n\n    // If the character entered does not match the last character entered, append it to the _keypressSearchString\n    if (newString !== this._keypressSearchString) {\n      this._keypressSearchString += newString;\n    }\n\n    // Set a timeout so that _keypressSearchString is cleared after 1 second\n    this._keypressTimeoutID = window.setTimeout(() => {\n      this._keypressSearchString = '';\n    }, this._keypressTimeoutDuration);\n\n    // Search within selectable items\n    const selectableItems = this.items._getSelectableItems().filter(item => !item.hasAttribute('hidden') && item.offsetParent);\n\n    // Remember the index of the focused item within the array of selectable items\n    const currentIndex = selectableItems.indexOf(this._tabTarget);\n\n    this._keypressSearchString = this._keypressSearchString.trim().toLowerCase();\n\n    let start;\n    // If the currentIndex is -1, meaning no item has focus, start from the beginning\n    if (currentIndex === -1) {\n      start = 0;\n    } else if (this._keypressSearchString.length === 1) {\n      // Otherwise, if there is only one character to compare, start comparing from the next item after the currently\n      // focused item. This allows us to iterate through items beginning with the same character\n      start = currentIndex + 1;\n    } else {\n      start = currentIndex;\n    }\n\n    let newFocusItem;\n    let comparison;\n    let item;\n\n    // Compare _keypressSearchString against item text until a match is found\n    for (let i = start ; i < selectableItems.length ; i++) {\n      item = selectableItems[i];\n      comparison = item.textContent.trim().toLowerCase();\n      if (comparison.indexOf(this._keypressSearchString) === 0) {\n        newFocusItem = item;\n        break;\n      }\n    }\n\n    // If no match is found, continue searching for a match starting from the top\n    if (!newFocusItem) {\n      for (let j = 0 ; j < start ; j++) {\n        item = selectableItems[j];\n        comparison = item.textContent.trim().toLowerCase();\n        if (comparison.indexOf(this._keypressSearchString) === 0) {\n          newFocusItem = item;\n          break;\n        }\n      }\n    }\n\n    // If a match has been found, focus the matched item\n    if (newFocusItem !== undefined) {\n      this._focusItem(newFocusItem);\n\n      // Keyboard is being used so apply focus-ring\n      const focusedItem = this.querySelector('.focus-ring');\n      if (focusedItem) {\n        focusedItem.classList.remove('focus-ring');\n      }\n      newFocusItem.classList.add('focus-ring');\n    }\n  }\n\n  _debounceResetTabTarget(forceFirst = false) {\n    window.cancelAnimationFrame(this._resetTabTargetdebouncedId);\n    this._resetTabTargetdebouncedId = window.requestAnimationFrame(() => {\n      this._resetTabTarget(forceFirst);\n    });\n  }\n\n  /**\n   Determine what item should get focus (if any) when the user tries to tab into the SelectList. This should be the\n   first selected item, or the first selectable item otherwise. When neither is available, it cannot be tabbed into\n   the SelectList.\n\n   @private\n   */\n  _resetTabTarget(forceFirst = false) {\n    let items = this.items._getAllSelected().filter(item => !item.hasAttribute('hidden') && item.offsetParent);\n\n    if (items.length === 0) {\n      items = this.items._getSelectableItems().filter(item => !item.hasAttribute('hidden') && item.offsetParent);\n    }\n\n    this._tabTarget = forceFirst ? items[0] : (items.find(item => item.tabIndex === 0) || items[0]);\n  }\n\n  /** @private */\n  _onScroll() {\n    window.clearTimeout(this._scrollTimeout);\n    this._scrollTimeout = window.setTimeout(this._onDebouncedScroll, SCROLL_DEBOUNCE);\n  }\n\n  _onMouseEnter() {\n    if (this.contains(document.activeElement)) {\n      document.activeElement.blur();\n    }\n  }\n\n  /**\n   @emits {coral-selectlist:scrollbottom}\n\n   @private\n   */\n  _onDebouncedScroll() {\n    if (this.scrollTop >= this.scrollHeight - this.clientHeight - SCROLL_BOTTOM_THRESHOLD) {\n      this.trigger('coral-selectlist:scrollbottom');\n    }\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.selectedItems;\n\n    if (!this.multiple) {\n      // Last selected item wins if multiple selection while not allowed\n      item = item || selectedItems[selectedItems.length - 1];\n\n      if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    }\n\n    this._debounceResetTabTarget();\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItems = this.selectedItems;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && this._arraysAreDifferent(selectedItems, oldSelection)) {\n      // We differentiate whether multiple is on or off and return an array or HTMLElement respectively\n      if (this.multiple) {\n        this.trigger('coral-selectlist:change', {\n          oldSelection: oldSelection,\n          selection: selectedItems\n        });\n      } else {\n        // Return all items if we just switched from multiple=true to multiple=false and we had >1 selected items\n        this.trigger('coral-selectlist:change', {\n          oldSelection: oldSelection.length > 1 ? oldSelection : oldSelection[0] || null,\n          selection: selectedItems[0] || null\n        });\n      }\n\n      this._oldSelection = selectedItems;\n    }\n  }\n\n  /** @private */\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  /** @ignore */\n  focus() {\n    // Avoids moving the focus once it is already inside the component\n    if (!this.contains(document.activeElement)) {\n      this._resetTabTarget();\n      this._focusItem(this._tabTarget);\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['loading', 'multiple']);\n  }\n\n  /** @ignore */\n  render() {\n    this.classList.add(CLASSNAME);\n\n    // adds the role to support accessibility\n    if (!this.hasAttribute('role')) {\n      this.setAttribute('role', 'listbox');\n    }\n\n    if (!this.hasAttribute('aria-label')) {\n      this.setAttribute('aria-label', i18n.get('List'));\n    }\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._resetTabTarget();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItems;\n  }\n\n  /**\n   Triggered when the user scrolls to near the bottom of the {@link SelectList}. This can be useful for when additional items can\n   be loaded asynchronously (i.e., infinite scrolling).\n\n   @typedef {CustomEvent} coral-selectlist:scrollbottom\n   */\n\n  /**\n   Triggered before the {@link SelectList} selected item is changed on user interaction. Can be used to cancel selection.\n\n   @typedef {CustomEvent} coral-selectlist:change\n\n   @property {SelectListItem} event.detail.item\n   The selected item.\n   */\n\n  /**\n   Triggered when the {@link SelectList} selected item has changed.\n\n   @typedef {CustomEvent} coral-selectlist:change\n\n   @property {SelectListItem} detail.oldSelection\n   The prior selected item(s).\n   @property {SelectListItem} detail.selection\n   The newly selected item(s).\n   */\n});\n\nexport default SelectList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1149,
    "kind": "variable",
    "name": "KEYPRESS_TIMEOUT_DURATION",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~KEYPRESS_TIMEOUT_DURATION",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1150,
    "kind": "variable",
    "name": "SCROLL_BOTTOM_THRESHOLD",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~SCROLL_BOTTOM_THRESHOLD",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "The distance, in pixels, from the bottom of the SelectList at which we trigger a scrollbottom event. For example, a\nvalue of 50 would indicate a scrollbottom event should be triggered when the user scrolls to within 50 pixels of the\nbottom.",
    "lineNumber": 30,
    "ignore": true,
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 1151,
    "kind": "variable",
    "name": "SCROLL_DEBOUNCE",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~SCROLL_DEBOUNCE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "The number of milliseconds for which scroll events should be debounced.",
    "lineNumber": 38,
    "ignore": true,
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 1152,
    "kind": "variable",
    "name": "ITEM_TAG_NAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~ITEM_TAG_NAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 41,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1153,
    "kind": "variable",
    "name": "GROUP_TAG_NAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~GROUP_TAG_NAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 44,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 1154,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1155,
    "kind": "variable",
    "name": "SelectList",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~SelectList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SelectList}",
    "description": "A SelectList component is a selectable list of items.",
    "lineNumber": 55,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SelectList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A SelectList component is a selectable list of items."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-selectlist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-selectlist></coral-selectlist>",
      "<caption>JS constructor</caption>\nnew Coral.SelectList();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1156,
    "kind": "typedef",
    "name": "coral-selectlist:scrollbottom",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~coral-selectlist:scrollbottom",
    "access": "public",
    "description": "Triggered when the user scrolls to near the bottom of the {@link SelectList}. This can be useful for when additional items can\nbe loaded asynchronously (i.e., infinite scrolling).",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-selectlist:scrollbottom"
    }
  },
  {
    "__docId__": 1157,
    "kind": "typedef",
    "name": "coral-selectlist:change",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~coral-selectlist:change",
    "access": "public",
    "description": "Triggered before the {@link SelectList} selected item is changed on user interaction. Can be used to cancel selection.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "SelectListItem"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.item",
        "description": "The selected item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-selectlist:change"
    }
  },
  {
    "__docId__": 1158,
    "kind": "typedef",
    "name": "coral-selectlist:change",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectList.js~coral-selectlist:change",
    "access": "public",
    "description": "Triggered when the {@link SelectList} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "SelectListItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected item(s)."
      },
      {
        "nullable": null,
        "types": [
          "SelectListItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected item(s)."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-selectlist:change"
    }
  },
  {
    "__docId__": 1159,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-SelectList-group';\n\n/**\n @class Coral.SelectList.Group\n @classdesc A SelectList group component\n @htmltag coral-selectlist-group\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SelectListGroup = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The label of the group. It reflects the <code>label</code> attribute to the DOM.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute label\n   @htmlattributereflected\n   */\n  get label() {\n    return this._label || '';\n  }\n\n  set label(value) {\n    this._label = transform.string(value);\n    this._reflectAttribute('label', this._label);\n\n    this.setAttribute('aria-label', this._label);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-selectlist-item'\n      });\n    }\n    return this._items;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['label']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.setAttribute('role', 'group');\n  }\n});\n\nexport default SelectListGroup;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1160,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1161,
    "kind": "variable",
    "name": "SelectListGroup",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListGroup.js~SelectListGroup",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SelectList}",
    "description": "A SelectList group component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SelectList.Group"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A SelectList group component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-selectlist-group"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-selectlist-group></coral-selectlist-group>",
      "<caption>JS constructor</caption>\nnew Coral.SelectList.Group();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1162,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\nimport {Icon} from '../../../coral-component-icon';\nimport checkIcon from '../templates/checkIcon';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Menu-item';\n\nconst VALID_ARIA_SELECTED_ROLES = [\n  'columnheader',\n  'gridcell',\n  'option',\n  'row',\n  'rowheader',\n  'tab',\n  'treeitem'\n];\n\nconst VALID_ARIA_SELECTED_ROLES_REGEXP = new RegExp(`^(${VALID_ARIA_SELECTED_ROLES.join('|')})$`);\n\n/**\n @class Coral.SelectList.Item\n @classdesc A SelectList item component\n @htmltag coral-selectlist-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SelectListItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      // Fetch or create the content zone element\n      content: this.querySelector('coral-selectlist-item-content') || document.createElement('coral-selectlist-item-content')\n    };\n    checkIcon.call(this._elements, {Icon});\n  }\n\n  /**\n   Value of the item. If not explicitly set, the value of <code>Node.textContent</code> is returned.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return typeof this._value === 'string' ? this._value : this.textContent.replace(/\\s{2,}/g, ' ').trim();\n  }\n\n  set value(value) {\n    this._value = transform.string(value);\n    this._reflectAttribute('value', this._value);\n  }\n\n  /**\n   The content element for the item.\n\n   @type {SelectListItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-selectlist-item-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}Label`);\n\n        // Remove content icon before processing content zone\n        const checkIcon = this._elements.checkIcon;\n        let contentIcon;\n        // @polyfill ie11\n        // IE11 throws syntax error because of the \"not()\" in the selector if the element is not in the DOM.\n        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.includes('Trident/')) {\n          const allContentIcons = Array.prototype.slice.call(content.querySelectorAll('coral-icon'));\n          const allContentMenuIcons = Array.prototype.slice.call(content.querySelectorAll('coral-icon._coral-Menu-item-icon'));\n          const contentIcons = allContentIcons.filter(icon => allContentMenuIcons.indexOf(icon) === -1);\n          contentIcon = contentIcons.length > 0 ? contentIcons[0] : undefined;\n        } else {\n          contentIcon = content.querySelector('coral-icon:not(._coral-Menu-item-icon)');\n        }\n        if (contentIcon && contentIcon.icon) {\n          contentIcon.remove();\n          this.icon = contentIcon.icon;\n          const iconElement = this._getIconElement();\n          if (contentIcon.alt || contentIcon.title) {\n            if (contentIcon.title) {\n              iconElement.title = contentIcon.title;\n            }\n            if (contentIcon.alt) {\n              iconElement.alt = contentIcon.alt;\n            }\n          } else {\n            iconElement.alt = '';\n          }\n        }\n\n        this.insertBefore(content, this.contains(checkIcon) ? checkIcon : null);\n      }\n    });\n  }\n\n  /**\n   The icon to display. See {@link Icon}.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    const el = this._getIconElement();\n    return el.icon;\n  }\n\n  set icon(value) {\n    const el = this._getIconElement();\n    if (transform.string(value) === '') {\n      el.remove();\n    } else {\n      this.insertBefore(el, this.firstChild);\n    }\n    el.icon = value;\n  }\n\n  _getIconElement() {\n    if (!this._elements.icon) {\n      this._elements.icon = this.querySelector('._coral-Menu-item-icon') || new Icon();\n      this._elements.icon.size = Icon.size.SMALL;\n      this._elements.icon.classList.add('_coral-Menu-item-icon');\n    }\n    return this._elements.icon;\n  }\n\n  /**\n   Whether the item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    let _selected = transform.booleanAttr(value);\n\n    if(this._selected === _selected) {\n      return;\n    }\n\n    this._selected = _selected;\n    this._reflectAttribute('selected', this.disabled ? false : this._selected);\n\n    this.classList.toggle('is-selected', this._selected);\n    if (this.hasAttribute('role') &&\n      VALID_ARIA_SELECTED_ROLES_REGEXP.test(this.getAttribute('role'))) {\n      this.setAttribute('aria-selected', this._selected);\n    }\n\n    // Toggle check icon\n    this._elements.checkIcon.hidden = !this._selected;\n\n    this.trigger('coral-selectlist-item:_selectedchanged');\n  }\n\n  /**\n   Whether this item is disabled.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n\n    this.selected = this.selected;\n  }\n\n  get _contentZones() {\n    return {'coral-selectlist-item-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'value']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    if (!this.hasAttribute('role')) {\n      this.setAttribute('role', 'option');\n    }\n\n    // Support cloneNode\n    const template = this.querySelector('._coral-SelectList-icon');\n    if (template) {\n      template.remove();\n    }\n\n    // Fetch or create the content content zone element\n    const content = this._elements.content;\n\n    // Move any remaining elements into the content sub-component\n    if (!content.parentNode) {\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Add template\n    this.appendChild(this._elements.checkIcon);\n\n    // Assign the content zones, moving them into place in the process\n    this.content = content;\n  }\n});\n\nexport default SelectListItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1163,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1164,
    "kind": "variable",
    "name": "VALID_ARIA_SELECTED_ROLES",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js~VALID_ARIA_SELECTED_ROLES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1165,
    "kind": "variable",
    "name": "VALID_ARIA_SELECTED_ROLES_REGEXP",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js~VALID_ARIA_SELECTED_ROLES_REGEXP",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 31,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1166,
    "kind": "variable",
    "name": "SelectListItem",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListItem.js~SelectListItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SelectList}",
    "description": "A SelectList item component",
    "lineNumber": 40,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SelectList.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A SelectList item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-selectlist-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-selectlist-item></coral-selectlist-item>",
      "<caption>JS constructor</caption>\nnew Coral.SelectList.Item();"
    ],
    "see": [
      "../examples/#list"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1167,
    "kind": "file",
    "name": "coral-spectrum/coral-component-list/src/scripts/SelectListItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.SelectList.Item.Content\n @classdesc The SelectList Item content\n @htmltag coral-selectlist-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-selectlist-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-list/src/scripts/SelectListItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1168,
    "kind": "function",
    "name": "SelectListItemContent",
    "memberof": "coral-spectrum/coral-component-list/src/scripts/SelectListItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-list/src/scripts/SelectListItemContent.js~SelectListItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SelectList}",
    "description": "The SelectList Item content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SelectList.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The SelectList Item content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-selectlist-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-selectlist-item-content></coral-selectlist-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.SelectList.Item.Content();"
    ],
    "see": [
      "../examples/#list"
    ],
    "params": []
  },
  {
    "__docId__": 1169,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport MasonryItem from './MasonryItem';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {validate, transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\nimport MasonryItemAccessibilityState from \"./MasonryItemAccessibilityState\";\n\nconst CLASSNAME = '_coral-Masonry';\n\n/** @ignore */\nconst isMacLike = /(Mac|iPhone|iPod|iPad)/i.test(window.navigator.platform);\n\n/**\n Enumeration for {@link Masonry} selection options.\n\n @typedef {Object} MasonrySelectionModeEnum\n\n @property {String} NONE\n None is default, selection of Masonry items doesn't happen based on click.\n @property {String} SINGLE\n Single selection mode, Masonry behaves like radio input elements.\n @property {String} MULTIPLE\n Multiple selection mode, Masonry behaves like checkbox input elements.\n */\nconst selectionMode = {\n  NONE: 'none',\n  SINGLE: 'single',\n  MULTIPLE: 'multiple'\n};\n\n/**\n Enumeration for {@link Masonry} layouts.\n\n @typedef {Object} MasonryLayoutsEnum\n\n @property {String} FIXED_CENTERED\n A Layout with fixed width centered items.\n @property {String} FIXED_SPREAD\n A layout with fixed width and evenly spread items.\n @property {String} VARIABLE\n A layout with variable width items.\n @property {String} DASHBOARD\n A layout with variable width items which are expanded in their height to fill gaps.\n */\nconst layouts = {\n  FIXED_CENTERED: 'fixed-centered',\n  FIXED_SPREAD: 'fixed-spread',\n  VARIABLE: 'variable',\n  DASHBOARD: 'dashboard'\n};\n\n/**\n Enumeration values to enable/disable aria grid support for {@link Masonry}.\n\n @typedef {Object} MasonryAriaGridEnum\n\n @property {String} ON\n Turn on auto aria grid roles.\n @property {String} OFF\n OFF is default. Turn off auto aria grid roles.\n */\nconst ariaGrid = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n// IE does not set the complete property to true if an image cannot be loaded. This code must be outside of the\n// masonry to make sure that the listener catches images which fail loading before the masonry is initalized.\n// @polyfill ie11\ndocument.addEventListener('error', (event) => {\n  const target = event.target;\n  if (target && target.tagName === 'IMG') {\n    target._loadError = true;\n  }\n}, true);\n\n// Ignore children which are being removed\nconst itemFilter = (element) => element && element.tagName === 'CORAL-MASONRY-ITEM' && !element.hasAttribute('_removing');\n\n// Filter out items being removed\nconst isRemovingOrRemoved = (item) => item.hasAttribute('_removing') || !item.parentNode;\n\n/**\n * Returns the position of the second element relative to the first element.\n */\nconst relativePosition = (el1, el2) => {\n  const rect1 = el1.getBoundingClientRect();\n  const rect2 = el2.getBoundingClientRect();\n  return {\n    left: rect2.left - rect1.left,\n    top: rect2.top - rect1.top\n  };\n};\n\nconst weightedDistance = (x1, y1, x2, y2, unitWidth, unitHeight) => Math.sqrt(Math.pow((x2 - x1) / unitWidth, 2) + Math.pow((y2 - y1) / unitHeight, 2));\n\nconst getPreviousItem = (item) => {\n  const previousItem = item.previousElementSibling;\n  return itemFilter(previousItem) ? previousItem : null;\n};\n\n/**\n @class Coral.Masonry\n @classdesc A Masonry component that allows to lay out items in a masonry grid.\n @htmltag coral-masonry\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Masonry = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Defaults\n    this._loaded = false;\n    this._layouted = false;\n    this._layoutScheduled = false;\n    this._forceDebounce = false;\n    this._debounceId = null;\n\n    this._newItems = [];\n    this._tabbableItem = null;\n\n    //a11y\n    this._defaultAriaRole = \"group\";\n\n    this._ariaGrid = ariaGrid.OFF;\n    this._preservedAriaRole = this._defaultAriaRole;\n    this._preservedParentAriaRole = null;\n\n    this._elements = {\n      accessibilityState: this.querySelector('coral-masonry-item-accessibilitystate') || new MasonryItemAccessibilityState()\n    };\n\n    this._delegateEvents({\n      'global:resize': '_onWindowResize',\n\n      // Loaded\n      'global:load': '_updateLoaded',\n      'capture:load img': '_updateLoaded',\n      'capture:error img': '_updateLoaded',\n\n      // Drag and drop\n      'coral-dragaction:dragstart coral-masonry-item': '_onItemDragStart',\n      'coral-dragaction:dragover coral-masonry-item': '_onItemDragMove',\n      'coral-dragaction:dragend coral-masonry-item': '_onItemDragEnd',\n\n      'coral-masonry-item:_selecteditemchanged': '_onMasonrySelectedItemChanged',\n\n      // Keyboard\n      'capture:focus coral-masonry-item': '_onItemFocus',\n\n      // Selection\n      'click coral-masonry-item': '_onItemClick',\n      'key:space coral-masonry-item': '_onItemClick',\n\n      // Messenger\n      'coral-masonry-item:_messengerconnected': '_onMessengerConnected'\n    });\n\n    // Relayout when child elements change or are added/removed\n    // Should this mutation observer become a bottleneck, it could be replaced with a resize listener\n    this._observer = new MutationObserver(this._scheduleLayout.bind(this, 'mutation'));\n    this._observer.observe(this, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n      attributes: true\n    });\n\n    // Used for eventing\n    this._oldSelection = [];\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   Allows to interact with the masonry items.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-masonry-item',\n        // allows masonry to be nested\n        itemSelector: ':scope > coral-masonry-item:not([_removing]):not([_placeholder])',\n        onlyHandleChildren: true,\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Selection mode of Masonry\n\n   @type {String}\n   @default MasonrySelectionModeEnum.NONE\n   @htmlattribute selectionmode\n   @htmlattributereflected\n   */\n  get selectionMode() {\n    return this._selectionMode || selectionMode.NONE;\n  }\n\n  set selectionMode(value) {\n    value = transform.string(value).toLowerCase();\n    this._selectionMode = validate.enumeration(selectionMode)(value) && value || selectionMode.NONE;\n    this._reflectAttribute('selectionmode', this._selectionMode);\n\n    const isGrid = this.ariaGrid === ariaGrid.ON && this.parentElement;\n\n    if (this._selectionMode === selectionMode.NONE) {\n      this.classList.remove('is-selectable');\n      if (isGrid) {\n        this.parentElement.removeAttribute('aria-multiselectable');\n      }\n    } else {\n      this.classList.add('is-selectable');\n      if (isGrid) {\n        this.parentElement.setAttribute('aria-multiselectable', this._selectionMode === selectionMode.MULTIPLE);\n      }\n    }\n\n    this._validateSelection();\n  }\n\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _onMasonrySelectedItemChanged(event) {\n    // this is a private event and should not leave the column view\n    event.stopImmediatePropagation();\n\n    // announce the selection state for the focused item\n    this._announceActiveElementState.call(event.target, event);\n  }\n\n  _announceActiveElementState() {\n    const accessibilityState = this._elements.accessibilityState;\n\n    const self = this;\n    const parentElement = this.parentElement;\n\n    if (this._addTimeout || this._removeTimeout) {\n      clearTimeout(this._addTimeout);\n      clearTimeout(this._removeTimeout);\n    }\n\n    // we use setTimeout instead of nextFrame to give screen reader more time to respond to live region update in order to announce complete text content when the state changes.\n    this._addTimeout = setTimeout(function () {\n      const activeElement = document.activeElement;\n\n      if (!self.contains(activeElement) || activeElement.tagName !== 'CORAL-MASONRY-ITEM') {\n        return;\n      }\n\n      const span = document.createElement('span');\n      span.appendChild(\n        document.createTextNode(\n          i18n.get(activeElement.selected ? 'checked' : 'not checked')\n        )\n      );\n      accessibilityState.innerHTML = '';\n      accessibilityState.hidden = false;\n      accessibilityState.removeAttribute('aria-live');\n      setTimeout(function () {\n        accessibilityState.appendChild(span);\n\n        // give screen reader 1.6 secs before clearing the live region, to provide enough time for announcement\n        self._removeTimeout = setTimeout(parentElement._resetAccessibilityState, 1600, accessibilityState, self);\n      }, 100);\n    }, 100);\n  }\n\n  // utility method to clean up accessibility state\n  _resetAccessibilityState(accessibilityState, self) {\n    accessibilityState.setAttribute('aria-live', 'off');\n\n    // @a11y only persist the checked state on macOS,\n    // where VoiceOver does not announce the selected state for a gridcell.\n    accessibilityState.hidden = !isMacLike || !self.selected;\n    if (!isMacLike || !self.selected) {\n      accessibilityState.innerHTML = '';\n    }\n  }\n\n  /**\n   Allows to interact with the masonry layout instance.\n\n   @type {MasonryLayout}\n   @readonly\n   */\n  get layoutInstance() {\n    return this._layoutInstance;\n  }\n\n  /**\n   The layout name for this masonry. Must be one of {@link Coral.Masonry.layouts}.\n   See {@link MasonryLayoutsEnum}.\n\n   @type {String}\n   @default MasonryLayoutsEnum.FIXED_CENTERED\n   @htmlattribute layout\n   @htmlattributereflected\n   */\n  get layout() {\n    return this._layout || layouts.FIXED_CENTERED;\n  }\n\n  set layout(value) {\n    value = transform.string(value);\n    const layoutEnum = this.constructor._layouts;\n\n    if (value === '') {\n      // Default is first registered layout which is \"fixed-centered\"\n      value = Object.keys(layoutEnum)[0];\n    }\n\n    if (value !== this._layout) {\n      if (layoutEnum[value]) {\n        this._layout = value;\n        this._reflectAttribute('layout', this._layout);\n\n        this._scheduleLayout('new layout');\n      } else {\n        commons._log('Coral.Masonry: Unknown layout:', value);\n      }\n    }\n  }\n\n  /**\n   The first selected item or <code>null</code> if no item is selected.\n\n   @type {MasonryItem}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected();\n  }\n\n  /**\n   An array of all selected items.\n\n   @type {Array.<MasonryItem>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  // TODO this is layout specific. move to layout?\n  /**\n   The spacing between the items and the masonry container in pixel. If this property is not set, then it falls\n   back to the CSS padding of the masonry and margin of the items.\n\n   @type {?Number}\n   @default null\n   @htmlattribute spacing\n   */\n  get spacing() {\n    return this._spacing || null;\n  }\n\n  set spacing(value) {\n    value = transform.number(value);\n    this._spacing = value !== null ? Math.max(0, value) : null;\n\n    this._scheduleLayout('spacing');\n  }\n\n  /**\n   Whether or not it is possible to order items with drag & drop.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute orderable\n   */\n  get orderable() {\n    return this._orderable || false;\n  }\n\n  set orderable(value) {\n    this._orderable = transform.booleanAttr(value);\n\n    const items = this.items.getAll();\n\n    for (let i = 0 ; i < items.length ; i++) {\n      items[i][this._orderable ? 'setAttribute' : 'removeAttribute']('_orderable', '');\n    }\n  }\n\n  /**\n   Attribute to enable/disable auto aria grid role assignment. Value must be one of {@link MasonryAriaGridEnum}.\n   Setting this property to {@link MasonryAriaGridEnum.ON} will do following to enable support for accessibility:\n   - Preserve current role attribute of the parent element of {@link Masonry}, and set new role as grid.\n   - Preserve current role attribute of the {@link Masonry}, and set new role as row.\n   - Set role attribute of all child {@link MasonryItem} to gridcell.\n\n   Setting the property to {@link MasonryAriaGridEnum.OFF} will do following:\n   - Restore preserved (if any) role attribute of the parent element of {@link Masonry}.\n   - Restore preserved role attribute of the {@link Masonry}.\n   - Remove role attribute of all child {@link MasonryItem}.\n\n   Setting the attribute to other than allowed values will fallback to {@link MasonryAriaGridEnum.OFF}.\n\n   @type {String}\n   @default {@link MasonryAriaGridEnum.OFF}\n   @htmlattribute ariagrid\n   @htmlattributereflected\n   */\n  get ariaGrid() {\n    return this._ariaGrid || ariaGrid.OFF;\n  }\n\n  set ariaGrid(value) {\n    value = transform.string(value);\n\n    // Ensure correct values\n    if (value !== ariaGrid.ON && value !== ariaGrid.OFF) {\n      console.warn('Coral.Masonry: Unsupported ariaGrid value: ', value, '. Will fallback to ', ariaGrid.OFF);\n      value = ariaGrid.OFF;\n    }\n\n    //update current state\n    this._ariaGrid = value;\n    this._reflectAttribute('ariagrid', this._ariaGrid);\n\n    // Update role for this masonry\n    if (this._ariaGrid === ariaGrid.ON) {\n      // Preserve existing role and set new role\n      this._preservedAriaRole = this.getAttribute('role');\n      this.setAttribute('role', 'row');\n    } else if (this._ariaGrid == ariaGrid.OFF) {\n      // Restore or remove role\n      if (this._preservedAriaRole) {\n        this.setAttribute('role', this._preservedAriaRole);\n      } else {\n        this.removeAttribute('role');\n      }\n    }\n\n    // Update parent and child item roles based on current state\n    this._updateAriaRoleForParent(this._ariaGrid);\n    this._updateAriaColumnCountForParent(this._ariaGrid);\n    this._updateAriaRoleForItems(this._ariaGrid);\n  }\n\n  /**\n   Specifies aria-label value\n\n   @type {?String}\n   @htmlattribute aria-label\n   @htmlattributereflected\n   */\n  get ariaLabel() {\n    return this.getAttribute('aria-label');\n  }\n\n  set ariaLabel(value) {\n    value = transform.string(value);\n    if (value === '') {\n      this.removeAttribute('aria-label');\n    } else {\n      this._reflectAttribute('aria-label', value);\n    }\n\n    if (!this.parentElement || this._ariaGrid === ariaGrid.OFF) {\n      return;\n    }\n\n    if (this.ariaLabel) {\n      this.parentElement.setAttribute('aria-label', this.ariaLabel);\n    } else {\n      this.parentElement.removeAttribute('aria-label');\n    }\n  }\n\n  /**\n   Specifies aria-labelledby value\n\n   @type {?String}\n   @htmlattribute aria-labelledby\n   @htmlattributereflected\n   */\n  get ariaLabelledby() {\n    return this.getAttribute('aria-labelledby');\n  }\n\n  set ariaLabelledby(value) {\n    value = transform.string(value);\n    if (value === '') {\n      this.removeAttribute('aria-labelledby');\n    } else {\n      this._reflectAttribute('aria-labelledby', value);\n    }\n\n    if (!this.parentElement || this._ariaGrid === ariaGrid.OFF) {\n      return;\n    }\n\n    if (this.ariaLabelledby) {\n      this.parentElement.setAttribute('aria-labelledby', this.ariaLabelledby);\n    } else {\n      this.parentElement.removeAttribute('aria-labelledby');\n    }\n  }\n\n  /** @private */\n  _updateAriaRoleForParent(activateAriaGrid) {\n    if (!this.parentElement) {\n      return;\n    }\n\n    if (activateAriaGrid === ariaGrid.ON) {\n      // Save/set role for the parent as grid\n      this._preservedParentAriaRole = this.parentElement.getAttribute('role');\n      this.parentElement.setAttribute('role', 'grid');\n\n      // parent grid should be labelled the same as coral-masonry\n      if (this.ariaLabel && this.parentElement.getAttribute('aria-label') !== this.ariaLabel) {\n        this._preservedParentAriaLabel = this.parentElement.getAttribute('aria-label');\n        this.parentElement.setAttribute('aria-label', this.ariaLabel);\n      }\n\n      if (this.ariaLabelledby && this.parentElement.getAttribute('aria-labelledby') !== this.ariaLabelledby) {\n        this._preservedParentAriaLabelledby = this.parentElement.getAttribute('aria-labelledby');\n        this.parentElement.setAttribute('aria-labelledby', this.ariaLabelledby);\n      }\n\n      if (this._selectionMode === selectionMode.NONE) {\n        this.parentElement.removeAttribute('aria-multiselectable');\n      } else {\n        this.parentElement.setAttribute('aria-multiselectable', this._selectionMode === selectionMode.MULTIPLE);\n      }\n    } else {\n      // Restore/remove role of the parent element\n      if (this._preservedParentAriaRole) {\n        this.parentElement.setAttribute('role', this._preservedParentAriaRole);\n      } else {\n        this.parentElement.removeAttribute('role');\n      }\n\n      // restore the aria-label or aria-labelledby values as well\n      if (this._preservedParentAriaLabel) {\n        this.parentElement.setAttribute('aria-label', this._preservedParentAriaLabel);\n        this._preservedParentAriaLabel = undefined;\n      } else {\n        this.parentElement.removeAttribute('aria-label');\n      }\n\n      if (this._preservedParentAriaLabelledby !== undefined) {\n        this.parentElement.setAttribute('aria-labelledby', this._preservedParentAriaLabelledby);\n      } else {\n        this.parentElement.removeAttribute('aria-labelledby');\n      }\n\n      // Remove aria-colcount\n      this.parentElement.removeAttribute('aria-colcount');\n\n      // Remove aria-multiselectable\n      this.parentElement.removeAttribute('aria-multiselectable');\n    }\n  }\n\n  /** @private */\n  _updateAriaRoleForItems(activateAriaGrid) {\n    let columnIndex = 1;\n    this.items.getAll().forEach((item) => {\n      this._updateAriaRoleForItem(item, columnIndex++, activateAriaGrid);\n    });\n  }\n\n  /** @private */\n  _updateAriaRoleForItem(item, columnIndex, activateAriaGrid) {\n    if (activateAriaGrid === ariaGrid.ON) {\n      item.setAttribute('role', 'gridcell');\n      item.setAttribute('aria-colindex', columnIndex);\n\n      // communicate aria-selected state of all cells\n      if (this.selectionMode !== selectionMode.NONE || this.parentElement.hasAttribute('aria-multiselectable')) {\n        item.setAttribute('aria-selected', item.selected);\n      }\n    } else {\n      item.removeAttribute('role');\n      item.removeAttribute('aria-colindex');\n      item.removeAttribute('aria-selected');\n    }\n  }\n\n  /** @private */\n  _updateAriaColumnCountForParent(activateAriaGrid) {\n    if (!this.parentElement) {\n      return;\n    }\n\n    if (activateAriaGrid === ariaGrid.ON) {\n      this.parentElement.setAttribute('aria-colcount', this.items.length);\n    } else {\n      this.parentElement.removeAttribute('aria-colcount');\n    }\n  }\n\n  _validateSelection(item) {\n    const selectedItems = this.selectedItems;\n\n    if (this.selectionMode === selectionMode.NONE) {\n      this.items.getAll().forEach((item) => {\n        // Don't trigger change events\n        this._preventTriggeringEvents = true;\n        if (item.selected) {\n          item.removeAttribute('selected');\n        }\n        item.removeAttribute('aria-selected');\n      });\n    } else if (this.selectionMode === selectionMode.SINGLE) {\n      // Last selected item wins if multiple selection while not allowed\n      item = item || selectedItems[selectedItems.length - 1];\n\n      if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  _triggerChangeEvent() {\n    const selectedItems = this.selectedItems;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && this._arraysAreDifferent(selectedItems, oldSelection)) {\n      if (this.selectionMode === selectionMode.MULTIPLE) {\n        this.trigger('coral-masonry:change', {\n          oldSelection: oldSelection,\n          selection: selectedItems\n        });\n      } else {\n        this.trigger('coral-masonry:change', {\n          oldSelection: oldSelection.length > 1 ? oldSelection : oldSelection[0] || null,\n          selection: selectedItems[0] || null\n        });\n      }\n\n      this._oldSelection = selectedItems;\n    }\n  }\n\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  _onItemClick(event) {\n    if (this.selectionMode !== selectionMode.NONE) {\n      event.preventDefault();\n\n      const item = event.matchedTarget;\n      item[item.hasAttribute('selected') ? 'removeAttribute' : 'setAttribute']('selected', '');\n    }\n  }\n\n  /** @private */\n  _setAllSelected(selected) {\n    const items = this.items.getAll();\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      if (item.hasAttribute('selected') !== selected) {\n        item[selected ? 'setAttribute' : 'removeAttribute']('selected', '');\n      }\n    }\n  }\n\n  /**\n   Schedules a layout for the next animation frame. Even if called many times, the layout happens still just once.\n\n   @private\n   */\n  _scheduleLayout() {\n    if (!this._forceDebounce && !this._layoutScheduled) {\n      window.requestAnimationFrame(() => {\n        // Skip layout if a layout was forced in between\n        if (this._layoutScheduled) {\n          this._doLayout();\n          // Cancel potentially scheduled layout if the current layout was enforced by calling doLayout directly\n          this._layoutScheduled = false;\n        }\n      });\n\n      this._layoutScheduled = true;\n    }\n  }\n\n  /** @private */\n  _scheduleDebouncedLayout(force) {\n    // Do not force debounce if the masonry isn't layouted yet. Safari sometimes triggers resize events while loading.\n    if (force && this._layouted) {\n      this._forceDebounce = true;\n    }\n    window.clearTimeout(this._debounceId);\n\n    this._debounceId = window.setTimeout(() => {\n      this._forceDebounce = false;\n      this._scheduleLayout('window resize');\n    }, 500);\n  }\n\n  /**\n   Callback which has to be called when the dimensions have changed or the masonry turned visible.\n\n   @private\n   */\n  _onResize() {\n    if (!this._layouted) {\n      // The masonry was first invisible, render it now immediately\n      this._doLayout('became visible');\n    } else {\n      this._scheduleDebouncedLayout(false);\n    }\n  }\n\n  /** @private */\n  _onWindowResize() {\n    this._scheduleDebouncedLayout(true);\n  }\n\n  /**\n   Performs a layout. Should only be called by {@link #_scheduleLayout} if possible.\n\n   @private\n   */\n  _doLayout() {\n    const visible = !!this.offsetParent;\n    const LayoutClass = this.constructor._layouts[this.layout];\n    if (this._forceDebounce || !LayoutClass || !visible) {\n      return;\n    }\n\n    if (!this._layoutInstance) {\n      this._layoutInstance = new LayoutClass(this);\n    }\n    // Check if the layout has changed\n    else if (this._layoutInstance.name !== this.layout) {\n      this._layoutInstance.destroy();\n      this._layoutInstance = new LayoutClass(this);\n    }\n\n    // Animate insertion. In the attachedCallback of the item, the is-beforeInserting class was already added. This\n    // class is now removed again which allows to transition between the is-beforeInserting and is-inserting class.\n    // By separating the code and batching the changes, the overhead is reduced significantly.\n    let i;\n    const newItems = this._newItems;\n    for (i = 0 ; i < newItems.length ; i++) {\n      newItems[i]._insert();\n    }\n\n    // Position the items\n    this._layoutInstance.layout();\n    this._layouted = true;\n\n    // Mark newly added items as managed. Before this class is added, the items are invisible. The reason why this is\n    // done here after positioning the items is that it seems to be the only way to ensure that the items are never\n    // shown at the wrong position. There used to be two cases when this happened:\n    // - When the masonry is first invisible and later shown because the resize event is triggered too late.\n    // - In some browsers (e.g. Safari) always when items are added dynamically\n    for (i = 0 ; i < newItems.length ; i++) {\n      newItems[i].classList.add('is-managed');\n    }\n    // clear\n    newItems.length = 0;\n\n    // Update loaded class. Cannot be done in _updateLoaded because it has to happen after the positioning.\n    this.classList.toggle('is-loaded', this._loaded);\n\n    // Ensure that the tabbable item is set & still valid\n    const tabbableItem = this._tabbableItem;\n    if (!tabbableItem || isRemovingOrRemoved(tabbableItem)) {\n      this._setTabbableItem(this.items.first());\n    }\n\n    // Focus the next item if the previously focused item has been removed\n    const focusedItem = this._focusedItem;\n    if (focusedItem) {\n      if (isRemovingOrRemoved(focusedItem) && this._focusedItemNext) {\n        this._focusedItemNext.focus();\n      } else if (focusedItem !== document.activeElement) {\n        this._focusedItem = null;\n        this._focusedItemNext = null;\n      }\n    }\n\n    // Update items, so that column indexes are correctly set\n    this._updateAriaRoleForItems(this.ariaGrid);\n    this._updateAriaColumnCountForParent(this.ariaGrid);\n\n    // Prevent endless observation loop (skip mutations which have been caused by the layout)\n    this._observer.takeRecords();\n  }\n\n  /** @ignore */\n  _updateLoaded() {\n    // Wait until complete because fonts might be loaded after interactive\n    if (!this._loaded && document.readyState === 'complete') {\n      let loaded = true;\n      const images = this.querySelectorAll('img');\n      for (let i = 0 ; i < images.length ; i++) {\n        const image = images[i];\n        // _loadError is set in a listener at the top of this file\n        if (image.src && !image.complete && !image._loadError) {\n          loaded = false;\n          break;\n        }\n      }\n      this._loaded = loaded;\n    }\n    // A loaded image might have made an item bigger\n    this._scheduleLayout();\n  }\n\n  /** @private */\n  _onItemConnected(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    this._prepareItem(item);\n  }\n\n  _prepareItem(item) {\n    // We don't care about transitions if the masonry is not in the body\n    if (!document.body.contains(this)) {\n      return;\n    }\n\n    // check if just moving\n    if (!item.hasAttribute('_removing') && this !== item._masonry && !item.hasAttribute('_placeholder')) {\n      item._masonry = this;\n\n      // Insert animation start style. This is separated from _insert because otherwise we would have to enforce a\n      // reflow between changing the classes for every item (which is slow).\n      item.classList.add('is-beforeInserting');\n\n      // Do it in the next frame so that the inserting animation is visible\n      window.requestAnimationFrame(() => {\n        this._onItemAdded(item);\n      });\n    }\n  }\n\n  _removeItem(item) {\n      item.removeAttribute('_removing');\n      item._masonry = null;\n\n      this._onItemRemoved(item);\n  }\n\n  /** @private */\n  _onItemDisconnected(item) {\n    // We don't care about transitions if the masonry is not in the body\n    if (!document.body.contains(this)) {\n      return;\n    }\n\n    // Ignore the item being dropped after ordering\n    if (item._dropping) {\n      return;\n    }\n\n    if (!item.hasAttribute('_removing') && item.showRemoveTransition) {\n      // Attach again for remove transition\n      item.setAttribute('_removing', '');\n      item._ignoreConnectedCallback = true;\n      this.appendChild(item);\n      item._ignoreConnectedCallback = false;\n      commons.transitionEnd(item, () => {\n        item.remove();\n        this._removeItem(item);\n      });\n    }\n    // remove transition completed\n    else {\n      this._removeItem(item);\n    }\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    item._updateDragAction(this.orderable);\n    this._newItems.push(item);\n\n    // Hack to prevent flickering in some browsers which don't support custom elements natively (e.g. Safari)\n    if (this._attaching && item.nextElementSibling === null) {\n      this._doLayout('last item attached');\n    }\n  }\n\n  /** @private */\n  _onItemRemoved(item) {\n    item._updateDragAction(false);\n    item.classList.remove('is-managed');\n  }\n\n  /** @private */\n  _onItemFocus(e) {\n    const item = e.target;\n    if (item === e.matchedTarget) {\n      this._setTabbableItem(item);\n\n      // Remember the focused item and a sibling for the case when the currently focused item is removed and another\n      // item has to be selected in _doLayout\n      this._focusedItem = item;\n      this._focusedItemNext = [item.nextElementSibling, item.previousElementSibling].filter(itemFilter)[0];\n    }\n  }\n\n  /** @private */\n  _setTabbableItem(item) {\n    if (this._tabbableItem) {\n      this._tabbableItem._setTabbable(false);\n    }\n    if (item) {\n      item._setTabbable(true);\n    }\n    this._tabbableItem = item;\n  }\n\n  /**\n   @return {Boolean} true if the new position isn't further away from the center of the placeholder than the\n   previous position.\n\n   @private\n   */\n  _isApproachingPlaceholder(pos, prevPos, placeholder) {\n    const placeholderPos = relativePosition(this, placeholder);\n    const placeholderWidth = placeholder.offsetWidth;\n    const placeholderHeight = placeholder.offsetHeight;\n    const placeholderX = placeholderPos.left + placeholderWidth / 2;\n    const placeholderY = placeholderPos.top + placeholderHeight / 2;\n\n    // A weighted distance is used to improve the user experience with rather long/high cards\n    return weightedDistance(placeholderX, placeholderY, pos.left, pos.top, placeholderWidth, placeholderHeight) <=\n      weightedDistance(placeholderX, placeholderY, prevPos.left, prevPos.top, placeholderWidth, placeholderHeight);\n  }\n\n  /** @private */\n  _onItemDragStart(e) {\n    const item = e.target;\n    if (item === e.matchedTarget) {\n      this._layoutInstance.detach(item);\n      item._oldBefore = getPreviousItem(item);\n\n      const placeholder = item._dropPlaceholder = new MasonryItem();\n      placeholder.setAttribute('_placeholder', '');\n\n      // Add a content div with the right dimension instead of setting the dimension on the item directly. This is\n      // necessary because some layouts modify the dimensions as well.\n      const contentDiv = document.createElement('div');\n      contentDiv.style.width = `${item.clientWidth}px`;\n      contentDiv.style.height = `${item.clientHeight}px`;\n      placeholder.appendChild(contentDiv);\n\n      // Insert placeholder before dragged item\n      placeholder.classList.add('_coral-Masonry-item--placeholder');\n\n      this.insertBefore(placeholder, item);\n    }\n  }\n\n  /** @private */\n  _onItemDragMove(e) {\n    const item = e.target;\n    const placeholder = item._dropPlaceholder;\n    if (item === e.matchedTarget && placeholder) {\n      const prevPos = item._prevDragPos;\n      const pos = relativePosition(this, item);\n      // If the current move is approaching the previous placeholder target, then it must not move the placeholder\n      // again. Otherwise it can happen with multi-column items that the items jump around hectically while dragging\n      // an item.\n      if (!prevPos || !this._isApproachingPlaceholder(pos, prevPos, placeholder)) {\n        // Find item below cursor\n        const itemBelow = this._layoutInstance.itemAt(pos.left, pos.top);\n\n        if (itemBelow && itemBelow !== placeholder) {\n          // If the item below (the dragged item) is preceding the placeholder, then it has to insert the placeholder\n          // before the item below (the dragged item)\n          if (placeholder.compareDocumentPosition(itemBelow) & document.DOCUMENT_POSITION_PRECEDING) {\n            itemBelow.parentNode.insertBefore(placeholder, itemBelow);\n          } else {\n            itemBelow.parentNode.insertBefore(placeholder, itemBelow.nextSibling);\n          }\n        }\n      }\n      item._prevDragPos = pos;\n    }\n  }\n\n  /** @private */\n  _onItemDragEnd(e) {\n    const item = e.target;\n    const placeholder = item._dropPlaceholder;\n    if (item === e.matchedTarget && placeholder) {\n      item._dropping = true;\n      // Replace the drop placeholder with this item\n      this.replaceChild(item, placeholder);\n      item._dropping = false;\n\n      // Trigger order event\n      item.trigger('coral-masonry:order', {\n        item: item,\n        oldBefore: item._oldBefore,\n        before: getPreviousItem(item)\n      }, true, false);\n\n      // // Drop transition\n      this._layoutInstance.reattach(item);\n      item.classList.add('is-dropping');\n      commons.transitionEnd(item, () => {\n        item.classList.remove('is-dropping');\n      });\n\n      // Update items, so that column indexes are correctly set\n      this._updateAriaRoleForItems(this.ariaGrid);\n    }\n    item._oldBefore = null;\n    item._dropPlaceholder = null;\n    item._prevDragPos = null;\n  }\n\n  get observedMessages() {\n    return {\n      'coral-masonry-item:_connected': '_onItemConnected',\n      'coral-masonry-item:_selectedchanged': '_onItemSelectedChanged',\n    };\n  }\n\n  /**\n   Registry for masonry layouts.\n\n   @type {Object.<string,Layout>}\n   @private\n   @readonly\n   */\n  static get _layouts() {\n    if (!this.__layouts) {\n      this.__layouts = {};\n    }\n\n    return this.__layouts;\n  }\n\n  /**\n   Registers a layout with the given name.\n   The name can then be set at {@link Coral.Masonry.layout} to render a masonry with the this registered layout.\n\n   @param {String} name of the layout\n   @param {Layout} Layout class which extends {@link Coral.Masonry.Layout}\n   */\n  static registerLayout(name, Layout) {\n    Layout.defineName(name);\n    this._layouts[name] = Layout;\n  }\n\n  /**\n   Returns {@link Masonry} layouts.\n\n   @return {MasonryLayoutsEnum}\n   */\n  static get layouts() {\n    return layouts;\n  }\n\n  /**\n   Returns {@link Masonry} selection mode options.\n\n   @return {MasonrySelectionModeEnum}\n   */\n  static get selectionMode() {\n    return selectionMode;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      selectionmode: 'selectionMode',\n      ariagrid: 'ariaGrid',\n      'aria-label': 'ariaLabel',\n      'aria-labelledby': 'ariaLabelledby',\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'selectionmode',\n      'layout',\n      'spacing',\n      'orderable',\n      'ariagrid',\n      'aria-label',\n      'aria-labelledby'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Keep the default behavior when ariaGrid is not enabled\n    if (this._ariaGrid === ariaGrid.OFF) {\n      // a11y\n      this.setAttribute('role', this._defaultAriaRole);\n    }\n\n    // Default reflected attributes\n    if (!this._layout) {\n      this.layout = layouts.FIXED_CENTERED;\n    }\n    if (!this._selectionMode) {\n      this.selectionMode = selectionMode.NONE;\n    }\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItems;\n\n    // Handles the resizing of the masonry\n    commons.addResizeListener(this, this._onResize.bind(this));\n\n    // Prepare items\n    this.items.getAll().forEach((item) => {\n      this._prepareItem(item);\n    });\n\n    // This indicates that the initial items are being attached\n    this._attaching = true;\n\n    window.requestAnimationFrame(() => {\n      this._attaching = false;\n      // Update loaded after all items have been attached\n      this._updateLoaded();\n    });\n  }\n\n  /**\n   Triggered when a {@link Masonry} item is reordered.\n\n   @typedef {CustomEvent} coral-masonry:order\n\n   @property {MasonryItem} detail.item\n   The reordered item\n   @property {?MasonryItem} detail.oldBefore\n   The previous item before the reordering.\n   @property {?MasonryItem} detail.before\n   The previous item after the reordering.\n   */\n\n  /**\n   Triggered when {@link Masonry} selected item has changed.\n\n   @typedef {CustomEvent} coral-masonry:change\n\n   @property {MasonryItem} detail.oldSelection\n   The prior selected item(s).\n   @property {MasonryItem} detail.selection\n   The newly selected item(s).\n   */\n});\n\nexport default Masonry;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1170,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1171,
    "kind": "variable",
    "name": "isMacLike",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~isMacLike",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1172,
    "kind": "typedef",
    "name": "MasonrySelectionModeEnum",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~MasonrySelectionModeEnum",
    "access": "public",
    "description": "Enumeration for {@link Masonry} selection options.",
    "lineNumber": 37,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "None is default, selection of Masonry items doesn't happen based on click."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SINGLE",
        "description": "Single selection mode, Masonry behaves like radio input elements."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MULTIPLE",
        "description": "Multiple selection mode, Masonry behaves like checkbox input elements."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "MasonrySelectionModeEnum"
    }
  },
  {
    "__docId__": 1173,
    "kind": "typedef",
    "name": "MasonryLayoutsEnum",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~MasonryLayoutsEnum",
    "access": "public",
    "description": "Enumeration for {@link Masonry} layouts.",
    "lineNumber": 57,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FIXED_CENTERED",
        "description": "A Layout with fixed width centered items."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FIXED_SPREAD",
        "description": "A layout with fixed width and evenly spread items."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VARIABLE",
        "description": "A layout with variable width items."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DASHBOARD",
        "description": "A layout with variable width items which are expanded in their height to fill gaps."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "MasonryLayoutsEnum"
    }
  },
  {
    "__docId__": 1174,
    "kind": "typedef",
    "name": "MasonryAriaGridEnum",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~MasonryAriaGridEnum",
    "access": "public",
    "description": "Enumeration values to enable/disable aria grid support for {@link Masonry}.",
    "lineNumber": 74,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Turn on auto aria grid roles."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "OFF is default. Turn off auto aria grid roles."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "MasonryAriaGridEnum"
    }
  },
  {
    "__docId__": 1175,
    "kind": "function",
    "name": "itemFilter",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~itemFilter",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 90,
    "undocument": true,
    "params": [
      {
        "name": "element",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1176,
    "kind": "function",
    "name": "isRemovingOrRemoved",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~isRemovingOrRemoved",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 93,
    "undocument": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1177,
    "kind": "function",
    "name": "relativePosition",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~relativePosition",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Returns the position of the second element relative to the first element.",
    "lineNumber": 98,
    "params": [
      {
        "name": "el1",
        "types": [
          "*"
        ]
      },
      {
        "name": "el2",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "{\"left\": *, \"top\": *}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1178,
    "kind": "function",
    "name": "weightedDistance",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~weightedDistance",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 107,
    "undocument": true,
    "params": [
      {
        "name": "x1",
        "types": [
          "*"
        ]
      },
      {
        "name": "y1",
        "types": [
          "*"
        ]
      },
      {
        "name": "x2",
        "types": [
          "*"
        ]
      },
      {
        "name": "y2",
        "types": [
          "*"
        ]
      },
      {
        "name": "unitWidth",
        "types": [
          "*"
        ]
      },
      {
        "name": "unitHeight",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1179,
    "kind": "function",
    "name": "getPreviousItem",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~getPreviousItem",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 109,
    "undocument": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1180,
    "kind": "variable",
    "name": "Masonry",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~Masonry",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "A Masonry component that allows to lay out items in a masonry grid.",
    "lineNumber": 121,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Masonry component that allows to lay out items in a masonry grid."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-masonry"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-masonry></coral-masonry>",
      "<caption>JS constructor</caption>\nnew Coral.Masonry();"
    ],
    "see": [
      "../examples/#masonry"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1181,
    "kind": "typedef",
    "name": "coral-masonry:order",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~coral-masonry:order",
    "access": "public",
    "description": "Triggered when a {@link Masonry} item is reordered.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The reordered item"
      },
      {
        "nullable": true,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldBefore",
        "description": "The previous item before the reordering."
      },
      {
        "nullable": true,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "The previous item after the reordering."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-masonry:order"
    }
  },
  {
    "__docId__": 1182,
    "kind": "typedef",
    "name": "coral-masonry:change",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/Masonry.js~coral-masonry:change",
    "access": "public",
    "description": "Triggered when {@link Masonry} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected item(s)."
      },
      {
        "nullable": null,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected item(s)."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-masonry:change"
    }
  },
  {
    "__docId__": 1183,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MasonryLayout from './MasonryLayout';\nimport {setTransition, setTransform, csspx, getPositiveNumberProperty} from './MasonryLayoutUtil';\nimport {Keys} from '../../../coral-utils';\n\n/**\n Base class for column-based masonry layouts.\n\n @class Coral.Masonry.ColumnLayout\n @classdesc A Masonry Column layout\n @extends {MasonryLayout}\n */\nclass MasonryColumnLayout extends MasonryLayout {\n  /**\n   Takes a {Masonry} instance as argument.\n\n   @param {Masonry} masonry\n   */\n  constructor(masonry) {\n    super(masonry);\n\n    this._columns = [];\n\n    const up = this._moveFocusVertically.bind(this, true);\n    const down = this._moveFocusVertically.bind(this, false);\n    const left = this._moveFocusHorizontally.bind(this, true);\n    const right = this._moveFocusHorizontally.bind(this, false);\n    const home = this._moveFocusHomeEnd.bind(this, true);\n    const end = this._moveFocusHomeEnd.bind(this, false);\n\n    const keys = this._keys = new Keys(masonry, {\n      context: this\n    });\n    keys.on('up', up).on('k', up);\n    keys.on('down', down).on('j', down);\n    keys.on('left', left).on('h', left);\n    keys.on('right', right).on('l', right);\n    keys.on('home', home);\n    keys.on('end', end);\n  }\n\n  /**\n   Hook to remove layout specific style and data from the item.\n\n   @param item\n   @private\n   */\n  // eslint-disable-next-line no-unused-vars\n  _resetItem(item) {\n    // To override\n  }\n\n  /**\n   Initialize layout variables.\n\n   @private\n   */\n  _init(items) {\n    const firstItem = items[0];\n    const masonry = this._masonry;\n    this._columnWidth = getPositiveNumberProperty(masonry, 'columnWidth', 'columnwidth', 200, 120);\n\n    this._zeroOffsetLeft = -csspx(firstItem, 'marginLeft');\n    // with padding\n    this._masonryInnerWidth = masonry.clientWidth;\n\n    const spacing = this._masonry.spacing;\n    if (typeof spacing === 'number') {\n      this._horSpacing = spacing;\n      this._verSpacing = spacing;\n      this._offsetLeft = spacing + this._zeroOffsetLeft;\n      this._offsetTop = spacing - csspx(firstItem, 'marginTop');\n      this._verPadding = 2 * spacing;\n      this._masonryAvailableWidth = masonry.clientWidth - spacing;\n    } else {\n      this._horSpacing = csspx(firstItem, 'marginLeft') + csspx(firstItem, 'marginRight');\n      this._verSpacing = csspx(firstItem, 'marginTop') + csspx(firstItem, 'marginBottom');\n      this._offsetLeft = csspx(masonry, 'paddingLeft');\n      this._offsetTop = csspx(masonry, 'paddingTop');\n      this._verPadding = this._offsetTop + this._verSpacing + csspx(masonry, 'paddingBottom');\n      this._masonryAvailableWidth = masonry.clientWidth - this._offsetLeft - csspx(masonry, 'paddingRight');\n    }\n\n    // Initialize column objects\n    const columnCount = Math.max(1, Math.floor(this._masonryAvailableWidth / (this._columnWidth + this._horSpacing)));\n    this._columns.length = columnCount;\n    for (let ci = 0 ; ci < columnCount ; ci++) {\n      this._columns[ci] = {\n        height: this._offsetTop,\n        items: []\n      };\n    }\n\n    // Prepare layout data\n    for (let ii = 0 ; ii < items.length ; ii++) {\n      const item = items[ii];\n\n      let layoutData = item._layoutData;\n      if (!layoutData) {\n        item._layoutData = layoutData = {};\n      }\n\n      // Read colspan\n      layoutData.colspan = Math.min(getPositiveNumberProperty(item, 'colspan', 'colspan', 1), this._columns.length);\n    }\n  }\n\n  /**\n   Updates the width of all items.\n\n   @param items\n   @private\n   */\n  _writeStyles(items) {\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      const layoutData = item._layoutData;\n\n      // Update width\n      const itemWidth = Math.round(this._getItemWidth(layoutData.colspan));\n      if (layoutData.width !== itemWidth) {\n        item.style.width = `${itemWidth}px`;\n        layoutData.width = itemWidth;\n      }\n      this._writeItemStyle(item);\n    }\n  }\n\n  /**\n   @param colspan column span of the item\n   @return the width of the item for the given colspan\n   @private\n   */\n  // eslint-disable-next-line no-unused-vars\n  _getItemWidth(colspan) {\n    // To override\n  }\n\n  /**\n   Hook to execute layout specific item preparation.\n\n   @param item\n   @private\n   */\n  // eslint-disable-next-line no-unused-vars\n  _writeItemStyle(item) {\n    // To override\n  }\n\n  /**\n   Reads the dimension of all items.\n\n   @param items\n   @private\n   */\n  _readStyles(items) {\n    // Record size of items in a separate loop to avoid unneccessary reflows\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      const layoutData = item._layoutData;\n      layoutData.height = Math.round(item.getBoundingClientRect().height);\n      layoutData.ignored = layoutData.detached || !item.offsetParent;\n    }\n  }\n\n  /**\n   Update the position of all items.\n\n   @param items\n   @private\n   */\n  _positionItems(items) {\n    let j;\n\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      const layoutData = item._layoutData;\n      // Skip ignored items\n      if (layoutData.ignored) {\n        continue;\n      }\n\n      // Search for column with the least height\n      const maxLength = this._columns.length - (layoutData.colspan - 1);\n      let minColumnIndex = -1;\n      let minColumnHeight;\n      for (j = 0 ; j < maxLength ; j++) {\n        // can be negative if set spacing < item css margin\n        let columnHeight = this._offsetTop;\n        for (let y = 0 ; y < layoutData.colspan ; y++) {\n          columnHeight = Math.max(columnHeight, this._columns[j + y].height);\n        }\n        if (minColumnIndex === -1 || columnHeight < minColumnHeight) {\n          minColumnIndex = j;\n          minColumnHeight = columnHeight;\n        }\n      }\n\n      const top = minColumnHeight;\n      const left = Math.round(this._getItemLeft(minColumnIndex));\n\n      // Check if position has changed\n      if (layoutData.left !== left || layoutData.top !== top) {\n        layoutData.columnIndex = minColumnIndex;\n        layoutData.itemIndex = this._columns[minColumnIndex].items.length;\n        layoutData.left = left;\n        layoutData.top = top;\n\n        setTransform(item, `translate(${left}px, ${top}px)`);\n      }\n\n      // Remember new column height to position all other items\n      const newColumnHeight = top + layoutData.height + this._verSpacing;\n      for (j = 0 ; j < layoutData.colspan ; j++) {\n        const column = this._columns[minColumnIndex + j];\n        column.height = newColumnHeight;\n        column.items.push(item);\n      }\n    }\n  }\n\n  /**\n   @param columnIndex\n   @return the left position for the given column index\n   @private\n   */\n  // eslint-disable-next-line no-unused-vars\n  _getItemLeft(columnIndex) {\n    // To override\n  }\n\n  /**\n   @returns {number} the height of the content (independent of the current gird container height)\n   @private\n   */\n  _getContentHeight() {\n    return this._columns.reduce((height, column) => Math.max(height, column.height), 0) - this._offsetTop;\n  }\n\n  /**\n   Hook which is called after the positioning is done.\n\n   @param contentHeight\n   @private\n   */\n  // eslint-disable-next-line no-unused-vars\n  _postLayout(contentHeight) {\n    // To override\n  }\n\n  /**\n   Moves the focus vertically.\n\n   @private\n   */\n  _moveFocusVertically(up, event) {\n    const currentLayoutData = event.target._layoutData;\n    if (!currentLayoutData) {\n      return;\n    }\n\n    // Choose item above or below\n    const nextItemIndex = currentLayoutData.itemIndex + (up ? -1 : 1);\n    let nextItem = this._columns[currentLayoutData.columnIndex].items[nextItemIndex];\n\n    if (nextItem) {\n      nextItem.focus();\n      // prevent scrolling at the same time\n      event.preventDefault();\n    } else {\n      // in case there is no item in the same column, we should move to first item in next column for down\n      // and last item of previous column for up key\n      let columnIndex = currentLayoutData.columnIndex;\n      if (up) {\n        if (columnIndex > 0) {\n          // move to last item of previous column\n          let prevColumn = this._columns[columnIndex - 1];\n          if (prevColumn) {\n            nextItem = prevColumn.items[prevColumn.items.length - 1]; // last item of previous column\n          }\n        }\n      } else {\n        // down key is pressed, go to first item of next column if exists\n        let columnCount = this._columns.length;\n        let nextColumnIndex = columnIndex + currentLayoutData.colspan;\n        if (nextColumnIndex < columnCount) {\n          nextItem = this._columns[nextColumnIndex].items[0]; // first item of next column\n        }\n      }\n      if (nextItem) {\n        nextItem.focus();\n        event.preventDefault(); // prevent scrolling at the same time\n      }\n    }\n  }\n\n  /**\n   Moves the focus horizontally.\n\n   @private\n   */\n  _moveFocusHorizontally(left, event) {\n    const currentLayoutData = event.target._layoutData;\n    if (!currentLayoutData) {\n      return;\n    }\n\n    let nextItem;\n    let items = this._masonry.items.getAll();\n    let collectionItemIndex = items.indexOf(event.target);\n\n    if (left) {\n      if (collectionItemIndex > 0) {\n        nextItem = items[collectionItemIndex - 1];\n      }\n    } else if (collectionItemIndex < items.length - 1) {\n      nextItem = items[collectionItemIndex + 1];\n    }\n\n    if (nextItem) {\n      nextItem.focus();\n      event.preventDefault(); // prevent scrolling at the same time\n    }\n  }\n\n  /**\n   Moves the focus to first or last item based on the visual order.\n\n   @private\n   */\n  _moveFocusHomeEnd(home, event) {\n    const currentLayoutData = event.target._layoutData;\n    if (!currentLayoutData) {\n      return;\n    }\n\n    let nextItem;\n    const columns = this._columns;\n\n    // when home is pressed, we take the first item of the first column\n    if (home) {\n      nextItem = columns[0] && columns[0].items[0];\n    } else {\n      // when end is pressed, we take the last item of the last column; since some columns are empty, we need to\n      // iterate backwards to find the first column that has items\n      for (let i = columns.length - 1 ; i > -1 ; i--) {\n        // since we found a column with items, we take the last item as the next one\n        if (columns[i].items.length > 0) {\n          nextItem = columns[i].items[columns[i].items.length - 1];\n          break;\n        }\n      }\n    }\n\n    if (nextItem) {\n      nextItem.focus();\n      // we prevent the scrolling\n      event.preventDefault();\n    }\n  }\n\n  /** @inheritdoc */\n  layout(secondTry) {\n    const masonry = this._masonry;\n\n    const items = masonry.items.getAll();\n    if (items.length > 0) {\n      // For best possible performance none of these function calls must both read and write attributes in a loop to\n      // avoid unnecessary reflows.\n      this._init(items);\n      this._writeStyles(items);\n      this._readStyles(items);\n      this._positionItems(items);\n    } else {\n      this._columns.length = 0;\n    }\n\n    // Update the height of the masonry (otherwise it has a height of 0px due to the absolutely positioned items)\n    const contentHeight = this._getContentHeight();\n    masonry.style.height = `${contentHeight - this._verSpacing + this._verPadding}px`;\n\n    // Check if the masonry has changed its width due to the changed height (can happen because of appearing/disappearing scrollbars)\n    if (!secondTry && this._masonryInnerWidth !== masonry.clientWidth) {\n      this.layout(true);\n    } else {\n      // Post layout hook for sub classes\n      this._postLayout(contentHeight);\n    }\n  }\n\n  /** @inheritdoc */\n  destroy() {\n    this._keys.destroy();\n\n    const items = this._masonry.items.getAll();\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      item._layoutData = undefined;\n      setTransform(item, '');\n      this._resetItem(item);\n    }\n  }\n\n  /** @inheritdoc */\n  detach(item) {\n    item._layoutData.detached = true;\n  }\n\n  /** @inheritdoc */\n  reattach(item) {\n    const layoutData = item._layoutData;\n    layoutData.detached = false;\n\n    const rect = item.getBoundingClientRect();\n    // Disable transition while repositioning\n    setTransition(item, 'none');\n    item.style.left = '';\n    item.style.top = '';\n    setTransform(item, '');\n\n    const nullRect = item.getBoundingClientRect();\n    layoutData.left = rect.left - nullRect.left;\n    layoutData.top = rect.top - nullRect.top;\n    setTransform(item, `translate(${layoutData.left}px, ${layoutData.top}px)`);\n    // Enforce position\n    item.getBoundingClientRect();\n    // Enable transition again\n    setTransition(item, '');\n  }\n\n  /** @inheritdoc */\n  itemAt(x, y) {\n    // TODO it would be more efficient to pick first the right column\n    const items = this._masonry.items.getAll();\n\n    for (let i = 0 ; i < items.length ; i++) {\n      const item = items[i];\n      const layoutData = item._layoutData;\n\n      if (layoutData && !layoutData.ignored && (\n        layoutData.left <= x && layoutData.left + layoutData.width >= x &&\n        layoutData.top <= y && layoutData.top + layoutData.height >= y)) {\n        return item;\n      }\n    }\n\n    return null;\n  }\n}\n\nexport default MasonryColumnLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1184,
    "kind": "class",
    "name": "MasonryColumnLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "A Masonry Column layout",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.ColumnLayout"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Masonry Column layout"
      }
    ],
    "interface": false,
    "extends": [
      "MasonryLayout"
    ],
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.ColumnLayout();"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1185,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#constructor",
    "access": "public",
    "description": "Takes a {Masonry} instance as argument.",
    "lineNumber": 30,
    "params": [
      {
        "nullable": null,
        "types": [
          "Masonry"
        ],
        "spread": false,
        "optional": false,
        "name": "masonry",
        "description": ""
      }
    ]
  },
  {
    "__docId__": 1186,
    "kind": "member",
    "name": "_columns",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_columns",
    "access": "private",
    "description": null,
    "lineNumber": 33,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 1187,
    "kind": "method",
    "name": "_resetItem",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_resetItem",
    "access": "private",
    "description": "Hook to remove layout specific style and data from the item.",
    "lineNumber": 60,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1188,
    "kind": "method",
    "name": "_init",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_init",
    "access": "private",
    "description": "Initialize layout variables.",
    "lineNumber": 69,
    "ignore": true,
    "params": [
      {
        "name": "items",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1189,
    "kind": "member",
    "name": "_columnWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_columnWidth",
    "access": "private",
    "description": null,
    "lineNumber": 72,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1190,
    "kind": "member",
    "name": "_zeroOffsetLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_zeroOffsetLeft",
    "access": "private",
    "description": null,
    "lineNumber": 74,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1191,
    "kind": "member",
    "name": "_masonryInnerWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_masonryInnerWidth",
    "access": "private",
    "description": null,
    "lineNumber": 76,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1192,
    "kind": "member",
    "name": "_horSpacing",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_horSpacing",
    "access": "private",
    "description": null,
    "lineNumber": 80,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1193,
    "kind": "member",
    "name": "_verSpacing",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_verSpacing",
    "access": "private",
    "description": null,
    "lineNumber": 81,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1194,
    "kind": "member",
    "name": "_offsetLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_offsetLeft",
    "access": "private",
    "description": null,
    "lineNumber": 82,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1195,
    "kind": "member",
    "name": "_offsetTop",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_offsetTop",
    "access": "private",
    "description": null,
    "lineNumber": 83,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1196,
    "kind": "member",
    "name": "_verPadding",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_verPadding",
    "access": "private",
    "description": null,
    "lineNumber": 84,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1197,
    "kind": "member",
    "name": "_masonryAvailableWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_masonryAvailableWidth",
    "access": "private",
    "description": null,
    "lineNumber": 85,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1204,
    "kind": "method",
    "name": "_writeStyles",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_writeStyles",
    "access": "private",
    "description": "Updates the width of all items.",
    "lineNumber": 125,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "items",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1205,
    "kind": "method",
    "name": "_getItemWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_getItemWidth",
    "access": "private",
    "description": "",
    "lineNumber": 146,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "colspan",
        "description": "column span of the item"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "the width of the item for the given colspan"
    },
    "ignore": true
  },
  {
    "__docId__": 1206,
    "kind": "method",
    "name": "_writeItemStyle",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_writeItemStyle",
    "access": "private",
    "description": "Hook to execute layout specific item preparation.",
    "lineNumber": 157,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1207,
    "kind": "method",
    "name": "_readStyles",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_readStyles",
    "access": "private",
    "description": "Reads the dimension of all items.",
    "lineNumber": 167,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "items",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1208,
    "kind": "method",
    "name": "_positionItems",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_positionItems",
    "access": "private",
    "description": "Update the position of all items.",
    "lineNumber": 183,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "items",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1209,
    "kind": "method",
    "name": "_getItemLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_getItemLeft",
    "access": "private",
    "description": "",
    "lineNumber": 239,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "columnIndex",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "the left position for the given column index"
    },
    "ignore": true
  },
  {
    "__docId__": 1210,
    "kind": "method",
    "name": "_getContentHeight",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_getContentHeight",
    "access": "private",
    "description": "",
    "lineNumber": 247,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{number} the height of the content (independent of the current gird container height)"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "number"
      ],
      "spread": false,
      "description": "the height of the content (independent of the current gird container height)"
    },
    "ignore": true,
    "params": []
  },
  {
    "__docId__": 1211,
    "kind": "method",
    "name": "_postLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_postLayout",
    "access": "private",
    "description": "Hook which is called after the positioning is done.",
    "lineNumber": 258,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "contentHeight",
        "description": ""
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1212,
    "kind": "method",
    "name": "_moveFocusVertically",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_moveFocusVertically",
    "access": "private",
    "description": "Moves the focus vertically.",
    "lineNumber": 267,
    "ignore": true,
    "params": [
      {
        "name": "up",
        "types": [
          "*"
        ]
      },
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1213,
    "kind": "method",
    "name": "_moveFocusHorizontally",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_moveFocusHorizontally",
    "access": "private",
    "description": "Moves the focus horizontally.",
    "lineNumber": 313,
    "ignore": true,
    "params": [
      {
        "name": "left",
        "types": [
          "*"
        ]
      },
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1214,
    "kind": "method",
    "name": "_moveFocusHomeEnd",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#_moveFocusHomeEnd",
    "access": "private",
    "description": "Moves the focus to first or last item based on the visual order.",
    "lineNumber": 342,
    "ignore": true,
    "params": [
      {
        "name": "home",
        "types": [
          "*"
        ]
      },
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1215,
    "kind": "method",
    "name": "layout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#layout",
    "access": "public",
    "description": null,
    "lineNumber": 374,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "name": "secondTry",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1216,
    "kind": "method",
    "name": "destroy",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#destroy",
    "access": "public",
    "description": null,
    "lineNumber": 403,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "params": [],
    "return": null
  },
  {
    "__docId__": 1217,
    "kind": "method",
    "name": "detach",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#detach",
    "access": "public",
    "description": null,
    "lineNumber": 416,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1218,
    "kind": "method",
    "name": "reattach",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#reattach",
    "access": "public",
    "description": null,
    "lineNumber": 421,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1219,
    "kind": "method",
    "name": "itemAt",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryColumnLayout.js~MasonryColumnLayout#itemAt",
    "access": "public",
    "description": null,
    "lineNumber": 443,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "name": "x",
        "types": [
          "*"
        ]
      },
      {
        "name": "y",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1220,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MasonryVariableLayout from './MasonryVariableLayout';\n\n/**\n Layout with variable width items which are expanded in their height to fill gaps (which are common with colspan).\n The minimal width of the items is defined with the <code>columnwidth</code> attribute.\n\n @example\n <coral-masonry layout=\"dashboard\" columnwidth=\"300\">\n\n @class Coral.Masonry.DashboardLayout\n @extends {MasonryVariableLayout}\n */\nclass MasonryDashboardLayout extends MasonryVariableLayout {\n  /** @inheritdoc */\n  _writeItemStyle(item) {\n    // Reset height because otherwise getBoundingClientRect() will not return the real height\n    this._resetItem(item);\n  }\n\n  /** @inheritdoc */\n  _postLayout(contentHeight) {\n    for (let columnIndex = 0 ; columnIndex < this._columns.length ; columnIndex++) {\n      const column = this._columns[columnIndex];\n      let nextItemTop = contentHeight + this._offsetTop;\n\n      // Fill gaps by expanding the height of the items\n      for (let itemIndex = column.items.length - 1 ; itemIndex >= 0 ; itemIndex--) {\n        const item = column.items[itemIndex];\n        const layoutData = item._layoutData;\n        if (layoutData.columnIndex === columnIndex) {\n          const expandedHeight = nextItemTop - layoutData.top - this._verSpacing;\n          item.style.height = `${expandedHeight}px`;\n        }\n        nextItemTop = layoutData.top;\n      }\n    }\n  }\n\n  /** @inheritdoc */\n  _resetItem(item) {\n    item.style.height = '';\n  }\n}\n\nexport default MasonryDashboardLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1221,
    "kind": "class",
    "name": "MasonryDashboardLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "Layout with variable width items which are expanded in their height to fill gaps (which are common with colspan).\nThe minimal width of the items is defined with the <code>columnwidth</code> attribute.",
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.DashboardLayout();",
      "<coral-masonry layout=\"dashboard\" columnwidth=\"300\">"
    ],
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.DashboardLayout"
      }
    ],
    "interface": false,
    "extends": [
      "MasonryVariableLayout"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1222,
    "kind": "method",
    "name": "_writeItemStyle",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout#_writeItemStyle",
    "access": "private",
    "description": null,
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1223,
    "kind": "method",
    "name": "_postLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout#_postLayout",
    "access": "private",
    "description": null,
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "contentHeight",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1224,
    "kind": "method",
    "name": "_resetItem",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryDashboardLayout.js~MasonryDashboardLayout#_resetItem",
    "access": "private",
    "description": null,
    "lineNumber": 52,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1225,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MasonryColumnLayout from './MasonryColumnLayout';\nimport {getFirstRowFilledColumns} from './MasonryLayoutUtil';\n\n/**\n Layout with fixed width centered items. The width of the items is defined with the <code>columnwidth</code>\n attribute.\n\n @example\n <coral-masonry layout=\"fixed-centered\" columnwidth=\"300\">\n\n @class Coral.Masonry.FixedCenteredLayout\n @extends {MasonryColumnLayout}\n */\nclass MasonryFixedCenteredLayout extends MasonryColumnLayout {\n  /** @inheritdoc */\n  _writeStyles(items) {\n    this._outerColumnWidth = this._columnWidth + this._horSpacing;\n\n    // If the first row isn't filled, then the items will be centered\n    const filledColumns = getFirstRowFilledColumns(this._columns, items);\n    this._offsetLeft += (this._masonryAvailableWidth - filledColumns * this._outerColumnWidth) / 2;\n\n    super._writeStyles(items);\n  }\n\n  /** @inheritdoc */\n  _getItemWidth(colspan) {\n    return this._columnWidth * colspan + this._horSpacing * (colspan - 1);\n  }\n\n  /** @inheritdoc */\n  _getItemLeft(columnIndex) {\n    return this._offsetLeft + this._outerColumnWidth * columnIndex;\n  }\n}\n\nexport default MasonryFixedCenteredLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1226,
    "kind": "class",
    "name": "MasonryFixedCenteredLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "Layout with fixed width centered items. The width of the items is defined with the <code>columnwidth</code>\nattribute.",
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.FixedCenteredLayout();",
      "<coral-masonry layout=\"fixed-centered\" columnwidth=\"300\">"
    ],
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.FixedCenteredLayout"
      }
    ],
    "interface": false,
    "extends": [
      "MasonryColumnLayout"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1227,
    "kind": "method",
    "name": "_writeStyles",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout#_writeStyles",
    "access": "private",
    "description": null,
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "items",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1228,
    "kind": "member",
    "name": "_outerColumnWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout#_outerColumnWidth",
    "access": "private",
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1229,
    "kind": "member",
    "name": "_offsetLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout#_offsetLeft",
    "access": "private",
    "description": null,
    "lineNumber": 33,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1230,
    "kind": "method",
    "name": "_getItemWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout#_getItemWidth",
    "access": "private",
    "description": null,
    "lineNumber": 39,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "colspan",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1231,
    "kind": "method",
    "name": "_getItemLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedCenteredLayout.js~MasonryFixedCenteredLayout#_getItemLeft",
    "access": "private",
    "description": null,
    "lineNumber": 44,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "columnIndex",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1232,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MasonryColumnLayout from './MasonryColumnLayout';\nimport {getFirstRowFilledColumns} from './MasonryLayoutUtil';\n\n/**\n Layout with fixed width and evenly spread items. The width of the items is defined with the <code>columnwidth</code>\n attribute.\n\n @example\n <coral-masonry layout=\"fixed-spread\" columnwidth=\"300\">\n\n @class Coral.Masonry.FixedSpreadLayout\n @extends {MasonryColumnLayout}\n */\nclass MasonryFixedSpreadLayout extends MasonryColumnLayout {\n  /** @inheritdoc */\n  _writeStyles(items) {\n    const columns = this._columns;\n\n    // If the first row is not filled, then the items should be aligned left\n    this._alignLeft = getFirstRowFilledColumns(columns, items) < columns.length;\n    if (!this._alignLeft) {\n      const remainingWidth = this._masonryInnerWidth - this._columnWidth * columns.length;\n      this._horSpacing = remainingWidth / (columns.length + 1);\n    }\n\n    super._writeStyles(items);\n  }\n\n  /** @inheritdoc */\n  _getItemWidth(colspan) {\n    return this._columnWidth * colspan + this._horSpacing * (colspan - 1);\n  }\n\n  /** @inheritdoc */\n  _getItemLeft(columnIndex) {\n    return this._zeroOffsetLeft + this._columnWidth * columnIndex + this._horSpacing * (columnIndex + 1);\n  }\n}\n\nexport default MasonryFixedSpreadLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1233,
    "kind": "class",
    "name": "MasonryFixedSpreadLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "Layout with fixed width and evenly spread items. The width of the items is defined with the <code>columnwidth</code>\nattribute.",
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.FixedSpreadLayout();",
      "<coral-masonry layout=\"fixed-spread\" columnwidth=\"300\">"
    ],
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.FixedSpreadLayout"
      }
    ],
    "interface": false,
    "extends": [
      "MasonryColumnLayout"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1234,
    "kind": "method",
    "name": "_writeStyles",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout#_writeStyles",
    "access": "private",
    "description": null,
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "items",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1235,
    "kind": "member",
    "name": "_alignLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout#_alignLeft",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1236,
    "kind": "member",
    "name": "_horSpacing",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout#_horSpacing",
    "access": "private",
    "description": null,
    "lineNumber": 35,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1237,
    "kind": "method",
    "name": "_getItemWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout#_getItemWidth",
    "access": "private",
    "description": null,
    "lineNumber": 42,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "colspan",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1238,
    "kind": "method",
    "name": "_getItemLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryFixedSpreadLayout.js~MasonryFixedSpreadLayout#_getItemLeft",
    "access": "private",
    "description": null,
    "lineNumber": 47,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "columnIndex",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1239,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {DragAction} from '../../../coral-dragaction';\nimport '../../../coral-component-checkbox';\nimport quickactions from '../templates/quickactions';\nimport {transform, commons, validate, i18n} from '../../../coral-utils';\nimport MasonryItemAccessibilityState from './MasonryItemAccessibilityState';\nimport {Messenger} from '../../../coral-messenger';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Masonry-item';\n\n/** @ignore */\nconst isMacLike = /(Mac|iPhone|iPod|iPad)/i.test(window.navigator.platform);\n\n/**\n @class Coral.Masonry.Item\n @classdesc A Masonry Item component\n @htmltag coral-masonry-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst MasonryItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // messenger\n    this._messenger = new Messenger(this);\n\n    // Represents ownership (necessary when the item is moved which triggers callbacks)\n    this._masonry = null;\n\n    // Default value\n    this._dragAction = null;\n\n    // Template\n    this._elements = {};\n\n    quickactions.call(this._elements);\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Specify while disconnecting the item, should it show transition or not.\n   This is useful when replacing large items, this result in delay.\n\n   @type {Boolean}\n   @default true\n   @private No need to update in public document.\n   */\n  get showRemoveTransition() {\n    return !(this._showRemoveTransition === false);\n  }\n\n  set showRemoveTransition(value) {\n    this._showRemoveTransition = transform.boolean(value);\n  }\n\n\n  /**\n   Specify whether the item is in removing state or not.\n   @type {Boolean}\n   */\n  get removing() {\n    return this.hasAttribute('_removing');\n  }\n\n  /**\n   Whether the item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n\n    if(validate.valueMustChange(this._selected, value)) {\n      this._selected = value;\n      this._reflectAttribute('selected', value);\n      this.trigger('coral-masonry-item:_selecteditemchanged');\n\n      this.setAttribute('aria-selected', value);\n      this.classList.toggle('is-selected', value);\n\n      this._elements.check[value ? 'setAttribute' : 'removeAttribute']('checked', '');\n\n      this._messenger.postMessage('coral-masonry-item:_selectedchanged');\n    }\n  }\n\n  /**\n   Animates the insertion of the item.\n\n   @private\n   */\n  _insert() {\n    if (this.classList.contains('is-beforeInserting')) {\n      this.classList.remove('is-beforeInserting');\n      this.classList.add('is-inserting');\n\n      commons.transitionEnd(this, () => {\n        this.classList.remove('is-inserting');\n      });\n    }\n  }\n\n  /** @private */\n  _setTabbable(tabbable) {\n    this.setAttribute('tabindex', tabbable ? 0 : -1);\n  }\n\n  /** @private */\n  _updateDragAction(enabled) {\n    let handle;\n    if (enabled) {\n      // Find handle\n      if (this.getAttribute('coral-masonry-draghandle') !== null) {\n        handle = this;\n      } else {\n        handle = this.querySelector('[coral-masonry-draghandle]');\n        if (!handle) {\n          // Disable drag&drop if handle wasn't found\n          enabled = false;\n        }\n      }\n    }\n\n    if (enabled) {\n      if (!this._dragAction) {\n        this._dragAction = new DragAction(this);\n        this._dragAction.dropZone = this.parentNode;\n      }\n      this._dragAction.handle = handle;\n    } else if (this._dragAction) {\n      this._dragAction.destroy();\n      this._dragAction = null;\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', '_removing', '_orderable']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_removing') {\n      // Do it in the next frame so that the removing animation is visible\n      window.requestAnimationFrame(() => {\n        this.classList.toggle('is-removing', value !== null);\n      });\n    } else if (name === '_orderable') {\n      this._updateDragAction(value !== null);\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  _suspendCallback() {\n    super._suspendCallback();\n    this._messenger.disconnect();\n  }\n\n  /** @ignore */\n  _resumeCallback() {\n    this._messenger.connect();\n    super._resumeCallback();\n    // In case an already connected element is switched to new parent,\n    // we would be ignoring the connected callback,\n    // as the item will be connected to new parent, the new parent should be informed immediately\n    this._messenger.postMessage('coral-masonry-item:_connected');\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    this._messenger.connect();\n    super.connectedCallback();\n\n    // Inform masonry immediately\n    this._messenger.postMessage('coral-masonry-item:_connected');\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // @a11y\n    this.setAttribute('tabindex', '-1');\n\n    // @a11y Add live region element to ensure announcement of selected state\n    const accessibilityState = this._elements.accessibilityState || this.querySelector('coral-masonry-item-accessibilitystate') || new MasonryItemAccessibilityState();\n\n    // @a11y Style to be visually hidden yet accessible to screen readers\n    if (!accessibilityState.classList.contains('u-coral-screenReaderOnly')) {\n      accessibilityState.classList.add('u-coral-screenReaderOnly');\n    }\n\n    // @a11y accessibility state string should announce in document lang, rather than item lang.\n    accessibilityState.setAttribute('lang', i18n.locale);\n\n    // @a11y accessibility state has role=\"status\" to announce as a live region\n    accessibilityState.setAttribute('role', 'status');\n    accessibilityState.setAttribute('aria-live', 'off');\n    accessibilityState.hidden = true;\n\n    accessibilityState.id = accessibilityState.id || commons.getUID();\n\n    // @a11y Wait a frame and append live region content element so that it is the last child within item.\n    // wait for next macrotask to avoid appending the accessibility state element before quickactions.\n    setTimeout(() => {\n      if (!accessibilityState.parentNode) {\n        this.appendChild(accessibilityState);\n      }\n\n      // @a11y Item should be labelled by accessibility state.\n      if (isMacLike) {\n        const ariaLabelledby = this.getAttribute('aria-labelledby');\n        if (ariaLabelledby) {\n          this.setAttribute('aria-labelledby', ariaLabelledby + ' ' + accessibilityState.id);\n        }\n      }\n    });\n\n    this._elements.accessibilityState = accessibilityState;\n\n    // Support cloneNode\n    const template = this.querySelector('._coral-Masonry-item-quickActions');\n    if (template) {\n      template.remove();\n    }\n    this.insertBefore(this._elements.quickactions, this.firstChild);\n    // todo workaround to not give user possibility to tab into checkbox\n    this._elements.check._labellableElement.tabIndex = -1;\n    this._elements.check.setAttribute('aria-hidden', 'true');\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    // disconnect messenger before calling masonry._onItemDisconnected\n    this._messenger.disconnect();\n\n    // Handle it in masonry immediately\n    const masonry = this._masonry;\n    if (masonry) {\n      masonry._onItemDisconnected(this);\n    }\n  }\n});\n\nexport default MasonryItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1240,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1241,
    "kind": "variable",
    "name": "isMacLike",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js~isMacLike",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1242,
    "kind": "variable",
    "name": "MasonryItem",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItem.js~MasonryItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "A Masonry Item component",
    "lineNumber": 34,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Masonry Item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-masonry-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-masonry-item></coral-masonry-item>",
      "<caption>JS constructor</caption>\nnew Coral.Masonry.Item();"
    ],
    "see": [
      "../examples/#masonry"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1243,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItemAccessibilityState.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * @class Coral.Masonry.Item.AccessibilityState\n * @classdesc The Masonry Item Accessibility State\n * @htmltag coral-masonry-item-accessibilitystate\n * @extends HTMLElement\n*/\n export default () => {\n    const element = document.createElement('coral-masonry-item-accessibilitystate');\n    element.className = 'u-coral-screenReaderOnly';\n    return element;\n};",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryItemAccessibilityState.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1244,
    "kind": "function",
    "name": "MasonryItemAccessibilityState",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItemAccessibilityState.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryItemAccessibilityState.js~MasonryItemAccessibilityState",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "The Masonry Item Accessibility State",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.Item.AccessibilityState"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Masonry Item Accessibility State"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-masonry-item-accessibilitystate"
      },
      {
        "tagName": "@extends",
        "tagValue": "HTMLElement"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-masonry-item-accessibilitystate></coral-masonry-item-accessibilitystate>",
      "<caption>JS constructor</caption>\nnew Coral.Masonry.Item.AccessibilityState();"
    ],
    "see": [
      "../examples/#masonry"
    ],
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1245,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Base class for masonry layouts.\n\n Whenever a change is detected, the {@link Coral.Masonry.Layout#layout} method is called. This method must then\n ensure that all the items are positioned correctly.\n\n Layout-specific keyboard support must be handled by adding event listeners to the masonry in the constructor. Such\n event listeners must be removed in the {@link Coral.Masonry.Layout#destroy} method.\n\n @param masonry\n @class Coral.Masonry.Layout\n */\nclass MasonryLayout {\n  /**\n   * this is constructor description.\n   * @param {number} arg1 this is arg1 description.\n   * @param {string[]} arg2 this is arg2 description.\n   */\n  constructor(masonry) {\n    this._masonry = masonry;\n  }\n\n  /**\n   Layout name. Uses the constructor given name by default if defined.\n\n   @type {String}\n   */\n  get name() {\n    return this._name || this.constructor._name;\n  }\n\n  set name(value) {\n    this._name = value;\n  }\n\n  /**\n   Lays out the masonry items according to the implementation.\n   */\n  layout() {\n    // To override\n  }\n\n  /**\n   Removes all layout-specific attributes, style, data and event listeners from the masonry and its items.\n   */\n  destroy() {\n    // To override\n  }\n\n  /**\n   Removes the item from the control of the layout. This can be used to position the item differently,\n   for example for drag&drop.\n\n   @param {MasonryItem} item\n   */\n  // eslint-disable-next-line no-unused-vars\n  detach(item) {\n    // To override\n  }\n\n  /**\n   Adds the item to the control of the layout again. The layout has to ensure that the item will be transitioned to\n   its normal position flawlessly.\n\n   @param {MasonryItem} item\n   */\n  // eslint-disable-next-line no-unused-vars\n  reattach(item) {\n    // To override\n  }\n\n  /**\n   Returns the item at the given position. The position coordinates are relative to the masonry.\n\n   If an item is being transitioned when this method is called, then it must choose the item based on the final\n   instead of the current position.\n\n   @param {number} x\n   @param {number} y\n   @return {?Coral.Masonry.Item}\n   */\n  // eslint-disable-next-line no-unused-vars\n  itemAt(x, y) {\n    // To override\n  }\n\n  /**\n   Defines the name of the Layout\n\n   @param {String} name\n   */\n  static defineName(name) {\n    this._name = name;\n  }\n}\n\nexport default MasonryLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1246,
    "kind": "class",
    "name": "MasonryLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "Base class for masonry layouts.\n\nWhenever a change is detected, the {@link Coral.Masonry.Layout#layout} method is called. This method must then\nensure that all the items are positioned correctly.\n\nLayout-specific keyboard support must be handled by adding event listeners to the masonry in the constructor. Such\nevent listeners must be removed in the {@link Coral.Masonry.Layout#destroy} method.",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.Layout"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "masonry",
        "description": ""
      }
    ],
    "interface": false,
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.Layout();"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1247,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#constructor",
    "access": "public",
    "description": "this is constructor description.",
    "lineNumber": 31,
    "params": [
      {
        "nullable": null,
        "types": [
          "number"
        ],
        "spread": false,
        "optional": false,
        "name": "arg1",
        "description": "this is arg1 description."
      },
      {
        "nullable": null,
        "types": [
          "string[]"
        ],
        "spread": false,
        "optional": false,
        "name": "arg2",
        "description": "this is arg2 description."
      }
    ]
  },
  {
    "__docId__": 1248,
    "kind": "member",
    "name": "_masonry",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#_masonry",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1249,
    "kind": "member",
    "name": "name",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#name",
    "access": "public",
    "description": "Layout name. Uses the constructor given name by default if defined.",
    "lineNumber": 40,
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1251,
    "kind": "member",
    "name": "_name",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#_name",
    "access": "private",
    "description": null,
    "lineNumber": 45,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1252,
    "kind": "method",
    "name": "layout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#layout",
    "access": "public",
    "description": "Lays out the masonry items according to the implementation.",
    "lineNumber": 51,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1253,
    "kind": "method",
    "name": "destroy",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#destroy",
    "access": "public",
    "description": "Removes all layout-specific attributes, style, data and event listeners from the masonry and its items.",
    "lineNumber": 58,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1254,
    "kind": "method",
    "name": "detach",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#detach",
    "access": "public",
    "description": "Removes the item from the control of the layout. This can be used to position the item differently,\nfor example for drag&drop.",
    "lineNumber": 69,
    "params": [
      {
        "nullable": null,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": ""
      }
    ],
    "return": null
  },
  {
    "__docId__": 1255,
    "kind": "method",
    "name": "reattach",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#reattach",
    "access": "public",
    "description": "Adds the item to the control of the layout again. The layout has to ensure that the item will be transitioned to\nits normal position flawlessly.",
    "lineNumber": 80,
    "params": [
      {
        "nullable": null,
        "types": [
          "MasonryItem"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": ""
      }
    ],
    "return": null
  },
  {
    "__docId__": 1256,
    "kind": "method",
    "name": "itemAt",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout#itemAt",
    "access": "public",
    "description": "Returns the item at the given position. The position coordinates are relative to the masonry.\n\nIf an item is being transitioned when this method is called, then it must choose the item based on the final\ninstead of the current position.",
    "lineNumber": 95,
    "params": [
      {
        "nullable": null,
        "types": [
          "number"
        ],
        "spread": false,
        "optional": false,
        "name": "x",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "number"
        ],
        "spread": false,
        "optional": false,
        "name": "y",
        "description": ""
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "Coral.Masonry.Item"
      ],
      "spread": false,
      "description": ""
    }
  },
  {
    "__docId__": 1257,
    "kind": "method",
    "name": "defineName",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout.defineName",
    "access": "public",
    "description": "Defines the name of the Layout",
    "lineNumber": 104,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "name",
        "description": ""
      }
    ],
    "return": null
  },
  {
    "__docId__": 1258,
    "kind": "member",
    "name": "_name",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayout.js~MasonryLayout._name",
    "access": "private",
    "description": null,
    "lineNumber": 105,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1259,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/** @ignore */\nconst setTransform = (el, value) => {\n  el.style.setProperty('-webkit-transform', value);\n  el.style.setProperty('-ms-transform', value);\n  el.style.transform = value;\n};\n\n/** @ignore */\nconst setTransition = (el, value) => {\n  el.style.setProperty('-webkit-transition', value);\n  el.style.setProperty('-ms-transition', value);\n  el.style.transition = value;\n};\n\n/** @ignore */\nconst getFirstRowFilledColumns = (columns, items) => {\n  let filledColumns = 0;\n  for (let i = 0 ; i < items.length ; i++) {\n    const item = items[i];\n    filledColumns += item._layoutData.colspan;\n    if (filledColumns >= columns.length) {\n      return columns.length;\n    }\n  }\n  return filledColumns;\n};\n\n/** @ignore */\nconst csspx = (el, property) => parseFloat(window.getComputedStyle(el)[property], 10);\n\n// TODO if the property changes, it will not automatically relayout the masonry\n// TODO test columnWidth and colspan property and default values\n/** @ignore */\nconst getPositiveNumberProperty = (element, property, attribute, defaultValue, mobileValue) => {\n  let value = element[property];\n  if (value === undefined) {\n    value = element.getAttribute(attribute);\n  }\n  value = parseInt(value, 10);\n  if (value <= 0 || isNaN(value)) {\n    value = defaultValue;\n  }\n  if(mobileValue && window.innerWidth <= 500) {\n    value = mobileValue;\n  }\n  return value;\n};\n\nexport {setTransform, setTransition, getFirstRowFilledColumns, csspx, getPositiveNumberProperty};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1260,
    "kind": "function",
    "name": "setTransform",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js~setTransform",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{setTransform}",
    "description": null,
    "lineNumber": 14,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1261,
    "kind": "function",
    "name": "setTransition",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js~setTransition",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{setTransition}",
    "description": null,
    "lineNumber": 21,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1262,
    "kind": "function",
    "name": "getFirstRowFilledColumns",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js~getFirstRowFilledColumns",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getFirstRowFilledColumns}",
    "description": null,
    "lineNumber": 28,
    "ignore": true,
    "params": [
      {
        "name": "columns",
        "types": [
          "*"
        ]
      },
      {
        "name": "items",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1263,
    "kind": "function",
    "name": "csspx",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js~csspx",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{csspx}",
    "description": null,
    "lineNumber": 41,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      },
      {
        "name": "property",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1264,
    "kind": "function",
    "name": "getPositiveNumberProperty",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryLayoutUtil.js~getPositiveNumberProperty",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getPositiveNumberProperty}",
    "description": null,
    "lineNumber": 46,
    "ignore": true,
    "params": [
      {
        "name": "element",
        "types": [
          "*"
        ]
      },
      {
        "name": "property",
        "types": [
          "*"
        ]
      },
      {
        "name": "attribute",
        "types": [
          "*"
        ]
      },
      {
        "name": "defaultValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "mobileValue",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1265,
    "kind": "file",
    "name": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport MasonryColumnLayout from './MasonryColumnLayout';\n\n/**\n Layout with variable width items. The minimal width of the items is defined with the <code>columnwidth</code>\n attribute.\n\n @example\n <coral-masonry layout=\"dashboard\" columnwidth=\"300\">\n\n @class Coral.Masonry.VariableLayout\n @extends {MasonryColumnLayout}\n */\nclass MasonryVariableLayout extends MasonryColumnLayout {\n  /** @inheritdoc */\n  _getItemWidth(colspan) {\n    return this._masonryAvailableWidth / this._columns.length * colspan - this._horSpacing;\n  }\n\n  /** @inheritdoc */\n  _getItemLeft(columnIndex) {\n    return this._offsetLeft + this._masonryAvailableWidth * columnIndex / this._columns.length;\n  }\n}\n\nexport default MasonryVariableLayout;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1266,
    "kind": "class",
    "name": "MasonryVariableLayout",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js~MasonryVariableLayout",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Masonry}",
    "description": "Layout with variable width items. The minimal width of the items is defined with the <code>columnwidth</code>\nattribute.",
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.Masonry.VariableLayout();",
      "<coral-masonry layout=\"dashboard\" columnwidth=\"300\">"
    ],
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Masonry.VariableLayout"
      }
    ],
    "interface": false,
    "extends": [
      "MasonryColumnLayout"
    ],
    "see": [
      "../examples/#masonry"
    ]
  },
  {
    "__docId__": 1267,
    "kind": "method",
    "name": "_getItemWidth",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js~MasonryVariableLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js~MasonryVariableLayout#_getItemWidth",
    "access": "private",
    "description": null,
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "colspan",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1268,
    "kind": "method",
    "name": "_getItemLeft",
    "memberof": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js~MasonryVariableLayout",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-masonry/src/scripts/MasonryVariableLayout.js~MasonryVariableLayout#_getItemLeft",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "unknown": [
      {
        "tagName": "@inheritdoc",
        "tagValue": ""
      }
    ],
    "ignore": true,
    "params": [
      {
        "name": "columnIndex",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1269,
    "kind": "file",
    "name": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport '../../../coral-component-textfield';\nimport {BaseComponent} from '../../../coral-base-component';\nimport MultifieldCollection from './MultifieldCollection';\nimport {commons, i18n, validate, transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Multifield';\nconst IS_DRAGGING_CLASS = 'is-dragging';\nconst IS_AFTER_CLASS = 'is-after';\nconst IS_BEFORE_CLASS = 'is-before';\nconst TEMPLATE_SUPPORT = 'content' in document.createElement('template');\n\n/**\n @class Coral.Multifield\n @classdesc A Multifield component that enables adding, reordering, and removing multiple instances of a component.\n Multifield partially supports the <code>template</code> element in IE 11. If adding/removing items in the template\n is required, <code>template.content</code> should be used.\n Child elements can be given a special attribute to enable functionality:\n - <code>[coral-multifield-add]</code>. Click to add an item.\n @htmltag coral-multifield\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Multifield = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this.setAttribute('id', this.id || commons.getUID());\n\n    // Attach events\n    const events = {\n      'coral-dragaction:dragstart coral-multifield-item': '_onDragStart',\n      'coral-dragaction:drag coral-multifield-item': '_onDrag',\n      'coral-dragaction:dragend coral-multifield-item': '_onDragEnd',\n\n      'click [coral-multifield-add]': '_onAddItemClick',\n      'click ._coral-Multifield-remove': '_onRemoveItemClick',\n      'click [coral-multifield-move]': '_onClickDragHandle',\n      'key:up [coral-multifield-move]': '_onMoveItemUp',\n      'key:pageup [coral-multifield-move]': '_onMoveItemUp',\n      'key:down [coral-multifield-move]': '_onMoveItemDown',\n      'key:pagedown [coral-multifield-move]': '_onMoveItemDown',\n      'key:home [coral-multifield-move]': '_onMoveItemHome',\n      'key:end [coral-multifield-move]': '_onMoveItemEnd',\n      'key:esc [coral-multifield-move]': '_onMoveItemEsc',\n      'click [coral-multifield-up]': '_onUpClick',\n      'click [coral-multifield-down]': '_onDownClick',\n      'capture:blur [coral-multifield-move]': '_onBlurDragHandle',\n      'change coral-multifield-item-content > input': '_onInputChange'\n    };\n\n    events[`global:key:escape #${this.id} > [coral-multifield-move]`] = '_onMoveItemEsc';\n\n    this._delegateEvents(events);\n\n    // Templates\n    this._elements = {\n      template: this.querySelector(`#${this.id} > template[coral-multifield-template]`) || document.createElement('template')\n    };\n    this._elements.template.setAttribute('coral-multifield-template', '');\n\n    // In case <template> is not supported\n    this._handleTemplateSupport(this._elements.template);\n\n    // Template support: move nodes added to the <template> to its content fragment\n    this._observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n          const addedNode = mutation.addedNodes[i];\n          const template = this.template;\n\n          if (template.contains(addedNode) && template !== addedNode) {\n            // Move the node to the template content\n            template.content.appendChild(addedNode);\n            // Update all items content with the template content\n            this.items.getAll().forEach((item) => {\n              this._renderTemplate(item);\n            });\n            this._updatePosInSet();\n          }\n        }\n      });\n    });\n\n    // Watch for changes to the template element\n    this._observer.observe(this, {\n      childList: true,\n      subtree: true\n    });\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the Coral.Multifield items that the component contains.\n\n   @type {MultifieldCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new MultifieldCollection({\n        host: this,\n        itemTagName: 'coral-multifield-item',\n        // allows multifields to be nested\n        itemSelector: ':scope > coral-multifield-item',\n        onlyHandleChildren: true,\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The Multifield template element. It will be used to render a new item once the element with the attribute\n   <code>coral-multifield-add</code> is clicked. It supports the <code>template</code> tag. While specifying the\n   template from markup, it should include the <code>coral-multifield-template</code> attribute.\n   NOTE: On IE11, only <code>template.content</code> is supported to add/remove elements to the template.\n\n   @type {HTMLElement}\n   @contentzone\n   */\n  get template() {\n    return this._getContentZone(this._elements.template);\n  }\n\n  set template(value) {\n    this._setContentZone('template', value, {\n      handle: 'template',\n      tagName: 'template',\n      insert: function (template) {\n        this.appendChild(template);\n      },\n      set: function (content) {\n        // Additionally add support for template\n        this._handleTemplateSupport(content);\n      }\n    });\n  }\n\n  /**\n   Whether this multifield is readOnly or not. Indicating that the user cannot modify the value of the multifield fields.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n   get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    value = transform.booleanAttr(value);\n    this._readOnly = value;\n    this._reflectAttribute('readonly', value);\n\n    this.items.getAll().forEach((item) => {\n      item[value ? 'setAttribute' : 'removeAttribute']('_readonly', '');\n    });\n\n    let addBtn = this.querySelector('[coral-multifield-add]');\n    if (addBtn) {\n      addBtn.disabled = value;\n    }\n\n  }\n\n  /**\n    Specifies the minimum number of items multifield should render.\n    If component contains less items, remaining items will be added.\n\n    @type {Number}\n    @default 0\n    @htmlattribute min\n    @htmlattributereflected\n    */\n  get min() {\n    return this._min || 0;\n  }\n\n  set min(value) {\n    const self = this;\n    value = transform.number(value);\n\n    if(value && validate.valueMustChange(self._min, value)) {\n      self._min = value;\n      self._reflectAttribute('min', value);\n      self._validateMinItems();\n    }\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      reorderupdown: 'reorderUpDown',\n      readonly: 'readOnly'\n    });\n  }\n\n  /**\n   Whether this multifield require up and down buttons.\n   @type {Boolean}\n   @default false\n   @htmlattribute reorderupdown\n   @htmlattributereflected\n   */\n  get reorderUpDown() {\n    return this._reorderUpDown || false;\n  }\n\n  set reorderUpDown(value) {\n     value = transform.booleanAttr(value);\n     this._reorderUpDown = value;\n     this._reflectAttribute('reorderupdown', value);\n  }\n\n  /**\n   * Validates minimum items required. will add items, if validation fails.\n   * @param schedule schedule validation in next frame\n   * @ignore\n   */\n  _validateMinItems(schedule) {\n    // only validate when multifield is connected\n    if(this._disconnected === false) {\n      const self = this;\n      const items = self.items;\n      let currentLength = items.length;\n      let currentMin = self.min;\n      let deletable = true;\n\n      if(currentLength <= currentMin) {\n        let itemsToBeAdded = currentMin - currentLength;\n\n        for(let i = 0; i < itemsToBeAdded; i++) {\n          let item = document.createElement('coral-multifield-item');\n          items.add(item);\n          item._readOnly = this.readOnly;\n        }\n\n        deletable = !deletable;\n      }\n\n      if(!schedule) {\n        window.cancelAnimationFrame(self._updateItemsDeletableId);\n        delete self._updateItemsDeletableId;\n        self._updateItemsDeletable(items.getAll(), deletable);\n      } else if(!self._updateItemsDeletableId) {\n        self._updateItemsDeletableId = window.requestAnimationFrame(() => {\n          delete self._updateItemsDeletableId;\n          self._updateItemsDeletable(items.getAll(), deletable);\n        });\n      }\n    }\n  }\n\n  /**\n   * Change the deletable property of passed items to the specified deletable value\n   * @ignore\n   */\n  _updateItemsDeletable(items, deletable) {\n    deletable = transform.boolean(deletable);\n    items = !Array.isArray(items) ? [items] : items;\n\n    items.forEach(function(item) {\n      item._deletable = deletable;\n    });\n  }\n\n  /** @ignore */\n  _handleTemplateSupport(template) {\n    // @polyfill IE\n    if (!TEMPLATE_SUPPORT && !template.content) {\n      const frag = document.createDocumentFragment();\n      while (template.firstChild) {\n        frag.appendChild(template.firstChild);\n      }\n      template.content = frag;\n    }\n  }\n\n  /** @ignore */\n  _onAddItemClick(event) {\n    if (event.matchedTarget.closest('coral-multifield') === this) {\n      this.items.add(document.createElement('coral-multifield-item'));\n\n      // Wait for MO to render item template\n      window.requestAnimationFrame(() => {\n        this.trigger('change');\n\n        this._trackEvent('click', 'add item button', event);\n\n        // Focus the newly created input if it can receive focus\n        var addBtn = event.target;\n        const items = this.items.getAll();\n        const setsize = items.length;\n        const itemToFocus = items[setsize - 1];\n        const focusableItem = itemToFocus.querySelector(commons.TABBABLE_ELEMENT_SELECTOR);\n\n        if (focusableItem.hasAttribute('disabled')) {\n          addBtn.focus();\n        } else {\n          focusableItem.focus();\n        }\n      });\n    }\n  }\n\n  /** @ignore */\n  _onRemoveItemClick(event) {\n    if (event.matchedTarget.closest('coral-multifield') === this) {\n      const item = event.matchedTarget.closest('coral-multifield-item');\n      if (item) {\n        // manage focus when item is removed\n        let itemToFocus;\n        const items = this.items.getAll();\n        const setsize = items.length;\n        if (setsize > 1) {\n          const itemIndex = items.indexOf(item);\n          if (itemIndex === setsize - 1) {\n            itemToFocus = items[itemIndex - 1];\n          } else {\n            itemToFocus = items[itemIndex + 1];\n          }\n        }\n        item.remove();\n        if (itemToFocus) {\n          itemToFocus._elements.remove.focus();\n        } else {\n          itemToFocus = this.querySelector('[coral-multifield-add]');\n          if (itemToFocus) {\n            itemToFocus.focus();\n          }\n        }\n      }\n\n      this.trigger('change');\n\n      this._trackEvent('click', 'remove item button', event);\n    }\n  }\n\n  /**\n   * Toggles keyboard accessible dragging of the current multifield item.\n   * @ignore\n   */\n  _toggleItemDragging(multiFieldItem, dragging = false) {\n    if (multiFieldItem._dragging === dragging) {\n      return;\n    }\n    multiFieldItem._dragging = dragging;\n    if (dragging) {\n      this._oldBefore = multiFieldItem.previousElementSibling;\n      this._before = multiFieldItem.nextElementSibling;\n    } else {\n      this.trigger('coral-multifield:beforeitemorder', {\n        item: multiFieldItem,\n        oldBefore: this._oldBefore,\n        before: this._before\n      });\n      this.trigger('coral-multifield:itemorder', {\n        item: multiFieldItem,\n        oldBefore: this._oldBefore,\n        before: multiFieldItem.nextElementSibling\n      });\n      this.trigger('change');\n      this._oldBefore = null;\n      this._before = null;\n    }\n  }\n\n  /**\n   * Clicking dragHandle toggles keyboard accessible dragging of the current multifield item.\n   * @ignore\n   */\n  _onClickDragHandle(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const multiFieldItem = event.matchedTarget.closest('coral-multifield-item');\n    this._toggleItemDragging(multiFieldItem, !multiFieldItem._dragging);\n  }\n\n  /**\n   * When the drag handle blurs, cancel dragging, leaving item where it is.\n   * @ignore\n   */\n  _onBlurDragHandle(event) {\n    const dragHandle = event.matchedTarget;\n    const multiFieldItem = dragHandle.closest('coral-multifield-item');\n    commons.nextFrame(() => {\n      if (document.activeElement !== dragHandle) {\n        this._toggleItemDragging(multiFieldItem, false);\n      }\n    });\n  }\n\n  /**\n   * Moves multiField item selected for dragging up one index position in the multifield collection.\n   * @ignore\n   */\n  _onMoveItemUp(event) {\n    const dragHandle = event.matchedTarget;\n    const dragElement = dragHandle.closest('coral-multifield-item');\n    if (!dragElement._dragging) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const items = this.items.getAll();\n    const dragElementIndex = items.indexOf(dragElement);\n    if (dragElementIndex > 0) {\n      this.insertBefore(dragElement, dragElement.previousElementSibling);\n    }\n    dragElement._dragging = true;\n    dragHandle.focus();\n  }\n\n  /**\n   * Moves multiField item selected for dragging down one index position in the multifield collection.\n   * @ignore\n   */\n  _onMoveItemDown(event) {\n    const dragHandle = event.matchedTarget;\n    const dragElement = dragHandle.closest('coral-multifield-item');\n    if (!dragElement._dragging) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const items = this.items.getAll();\n    const dragElementIndex = items.indexOf(dragElement);\n    if (dragElementIndex < items.length - 1) {\n      const nextElement = dragElement.nextElementSibling;\n      this.insertBefore(dragElement, nextElement.nextElementSibling);\n    }\n    dragElement._dragging = true;\n    dragHandle.focus();\n  }\n\n  /**\n   * Moves multiField item selected for dragging to start of multifield collection.\n   * @ignore\n   */\n  _onMoveItemHome(event) {\n    const dragHandle = event.matchedTarget;\n    let dragElement = dragHandle.closest('coral-multifield-item');\n    if (!dragElement._dragging) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const items = this.items.getAll();\n    const dragElementIndex = items.indexOf(dragElement);\n    if (dragElementIndex > 0) {\n      this.insertBefore(dragElement, this.items.first());\n    }\n    dragElement._dragging = true;\n    dragHandle.focus();\n  }\n\n  /**\n   * Moves multiField item selected for dragging to end of multifield collection.\n   * @ignore\n   */\n  _onMoveItemEnd(event) {\n    const dragHandle = event.matchedTarget;\n    let dragElement = dragHandle.closest('coral-multifield-item');\n    if (!dragElement._dragging) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const items = this.items.getAll();\n    const dragElementIndex = items.indexOf(dragElement);\n    if (dragElementIndex < items.length - 1) {\n      this.insertBefore(dragElement, this.items.last().nextElementSibling);\n    }\n    dragElement._dragging = true;\n    dragHandle.focus();\n  }\n\n  /**\n   * Cancels keyboard drag and drop operation, restoring item to its previous location.\n   * @ignore\n   */\n  _onMoveItemEsc(event) {\n    const dragHandle = event.matchedTarget;\n    const multiFieldItem = dragHandle.closest('coral-multifield-item');\n    if (multiFieldItem._dragging && this._oldBefore && this._before) {\n      event.stopPropagation();\n      this.insertBefore(multiFieldItem, this._before);\n      dragHandle.focus();\n    }\n    this._toggleItemDragging(multiFieldItem, false);\n  }\n\n  _onInputChange(event) {\n    this._trackEvent('change', 'input', event);\n  }\n\n  /** @ignore */\n  _onDragStart(event) {\n    if (event.target.closest('coral-multifield') === this) {\n      document.body.classList.add('u-coral-closedHand');\n\n      const dragElement = event.detail.dragElement;\n      const items = this.items.getAll();\n      const dragElementIndex = items.indexOf(dragElement);\n\n      // Toggle dragging state on multifield item.\n      dragElement._dragging = true;\n      dragElement.classList.add(IS_DRAGGING_CLASS);\n      items.forEach((item, i) => {\n        if (i < dragElementIndex) {\n          item.classList.add(IS_BEFORE_CLASS);\n        } else if (i > dragElementIndex) {\n          item.classList.add(IS_AFTER_CLASS);\n        }\n      });\n    }\n  }\n\n  /** @ignore */\n  _onDrag(event) {\n    if (event.target.closest('coral-multifield') === this) {\n      const items = this.items.getAll();\n      let marginBottom = 0;\n\n      if (items.length) {\n        marginBottom = parseFloat(window.getComputedStyle(items[0]).marginBottom);\n      }\n\n      items.forEach((item) => {\n        if (!item.classList.contains(IS_DRAGGING_CLASS)) {\n          const dragElement = event.detail.dragElement;\n          const dragElementBoundingClientRect = dragElement.getBoundingClientRect();\n          const itemBoundingClientRect = item.getBoundingClientRect();\n          const dragElementOffsetTop = dragElementBoundingClientRect.top;\n          const itemOffsetTop = itemBoundingClientRect.top;\n\n          const isAfter = dragElementOffsetTop < itemOffsetTop;\n          const itemReorderedTop = `${dragElementBoundingClientRect.height + marginBottom}px`;\n\n          item.classList.toggle(IS_AFTER_CLASS, isAfter);\n          item.classList.toggle(IS_BEFORE_CLASS, !isAfter);\n\n          if (item.classList.contains(IS_AFTER_CLASS)) {\n            item.style.top = items.indexOf(item) < items.indexOf(dragElement) ? itemReorderedTop : '';\n          }\n\n          if (item.classList.contains(IS_BEFORE_CLASS)) {\n            const afterDragElement = items.indexOf(item) > items.indexOf(dragElement);\n            item.style.top = afterDragElement ? `-${itemReorderedTop}` : '';\n          }\n        }\n      });\n    }\n  }\n\n  /** @ignore */\n  _onDragEnd(event) {\n    if (event.target.closest('coral-multifield') === this) {\n      document.body.classList.remove('u-coral-closedHand');\n\n      const dragElement = event.detail.dragElement;\n      const items = this.items.getAll();\n      const beforeArr = [];\n      const afterArr = [];\n\n      items.forEach((item) => {\n        if (item.classList.contains(IS_AFTER_CLASS)) {\n          afterArr.push(item);\n        } else if (item.classList.contains(IS_BEFORE_CLASS)) {\n          beforeArr.push(item);\n        }\n\n        item.classList.remove(IS_DRAGGING_CLASS, IS_AFTER_CLASS, IS_BEFORE_CLASS);\n        item.style.top = '';\n        item.style.position = '';\n      });\n\n      const oldBefore = dragElement.previousElementSibling;\n      const before = afterArr.shift();\n      const after = beforeArr.pop();\n      const beforeEvent = this.trigger('coral-multifield:beforeitemorder', {\n        item: dragElement,\n        oldBefore: oldBefore,\n        before: before\n      });\n\n      if (!beforeEvent.defaultPrevented) {\n        if (before) {\n          this.insertBefore(dragElement, before);\n        }\n        if (after) {\n          this.insertBefore(dragElement, after.nextElementSibling);\n        }\n\n        // Toggle dragging state on multifield item.\n        dragElement._dragging = false;\n\n        this.trigger('coral-multifield:itemorder', {\n          item: dragElement,\n          oldBefore: oldBefore,\n          before: before\n        });\n\n        this.trigger('change');\n\n        dragElement._elements.move.focus();\n      }\n    }\n  }\n\n  /** @ignore */\n  _onUpClick(event) {\n    const upHandle = event.matchedTarget;\n    const shiftElement = upHandle.closest('coral-multifield-item');\n    if(shiftElement.previousElementSibling.tagName === 'CORAL-MULTIFIELD-ITEM') {\n      this.insertBefore(shiftElement, shiftElement.previousElementSibling);\n    }\n  }\n\n  /** @ignore */\n  _onDownClick(event) {\n    const upHandle = event.matchedTarget;\n    const shiftElement = upHandle.closest('coral-multifield-item');\n    if(shiftElement.nextElementSibling.tagName === 'CORAL-MULTIFIELD-ITEM') {\n      this.insertBefore(shiftElement.nextElementSibling, shiftElement);\n    }\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    const self = this;\n    // Update the item content with the template content\n    if (item.parentNode === self) {\n      self._renderTemplate(item);\n      self._updatePosInSet();\n    }\n\n    if(self.items.length === self.min + 1) {\n      self._validateMinItems();\n    }\n\n    // a11y\n    self._handleRoleList();\n  }\n\n  /** @private */\n  _onItemRemoved() {\n    const self = this;\n    self._updatePosInSet();\n\n    // only validate when required\n    if(self.items.length <= self.min) {\n      self._validateMinItems();\n    }\n\n    // a11y\n    self._handleRoleList();\n  }\n\n  /**\n   * handle role list of the multifield based on number of items\n   * @private\n   */\n  _handleRoleList() {\n    const self = this;\n    if (self.items.length > 0 && self.getAttribute('role') !== 'list') {\n      self.setAttribute('role', 'list');\n    } else if (self.items.length === 0 && self.getAttribute('role') === 'list') {\n      self.removeAttribute('role');\n    }\n  }\n\n  /**\n   * update aria-posinset and aria-setsize for each item in the collection\n   * @private\n   */\n  _updatePosInSet() {\n    const items = this.items.getAll();\n    const setsize = items.length;\n    items.forEach((item, i) => {\n      item.setAttribute('aria-posinset', i + 1);\n      item.setAttribute('aria-setsize', setsize);\n      item.setAttribute('aria-label', i18n.get('({0} of {1})', i + 1, setsize));\n      // so long as item content is not another multifield,\n      // add aria-labelledby so that the item is labelled by its content and itself.\n      if (!item.querySelector('coral-multifield')) {\n        item.setAttribute('aria-labelledby', `${item.id}-content ${item.id}`);\n      }\n    });\n  }\n\n  /** @private */\n  _renderTemplate(item) {\n    const content = item.content || item.querySelector('coral-multifield-item-content') || item;\n\n    // Insert the template if item content is empty\n    if (!content.firstChild) {\n      // @polyfill IE\n      if (!TEMPLATE_SUPPORT) {\n        // Before cloning, put the nested templates content back in the DOM\n        const nestedTemplates = this.template.content.querySelectorAll('template[coral-multifield-template]');\n\n        Array.prototype.forEach.call(nestedTemplates, (template) => {\n          while (template.content.firstChild) {\n            template.appendChild(template.content.firstChild);\n          }\n        });\n      }\n\n      // Clone the template and append it to the item content\n      content.appendChild(document.importNode(this.template.content, true));\n    }\n  }\n\n  get _contentZones() {\n    return {template: 'template'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'min',\n      'readonly',\n      'reorderupdown'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, 'coral-Well');\n\n    // a11y\n    this._handleRoleList();\n\n    // a11y Add aria-label to the add button if exists to give context to screen reader users\n    const coralMultifieldAddBtn = this.querySelector('[coral-multifield-add]');\n    if (coralMultifieldAddBtn){\n      coralMultifieldAddBtn.setAttribute(\"aria-label\",\"Add\");\n    }\n\n    // Assign the content zones, moving them into place in the process\n    this.template = this._elements.template;\n\n    // Prepare items content based on the given template\n    this.items.getAll().forEach((item) => {\n      this._renderTemplate(item);\n    });\n\n    // update aria-posinset and aria-setsize for each item in the collection\n    this._updatePosInSet();\n\n    this._validateMinItems(true);\n  }\n\n  /**\n   Triggered when the {@link Multifield} item are reordered.\n\n   @typedef {CustomEvent} coral-multifield:beforeitemorder\n\n   @property {MultifieldItem} detail.item\n   The item to be ordered.\n   @property {MultifieldItem} detail.oldBefore\n   Ordered item next sibling before the swap. If <code>null</code>, the item was the last item.\n   @property {MultifieldItem} detail.before\n   Ordered item will be inserted before this sibling item. If <code>null</code>, the item is inserted at the end.\n   */\n\n  /**\n   Triggered when the {@link Multifield} item are reordered.\n\n   @typedef {CustomEvent} coral-multifield:itemorder\n\n   @property {MultifieldItem} detail.item\n   The ordered item.\n   @property {MultifieldItem} detail.oldBefore\n   Ordered item next sibling before the swap. If <code>null</code>, the item was the last item.\n   @property {MultifieldItem} detail.before\n   Ordered item was inserted before this sibling item. If <code>null</code>, the item was inserted at the end.\n   */\n});\n\nexport default Multifield;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1270,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1271,
    "kind": "variable",
    "name": "IS_DRAGGING_CLASS",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~IS_DRAGGING_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1272,
    "kind": "variable",
    "name": "IS_AFTER_CLASS",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~IS_AFTER_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1273,
    "kind": "variable",
    "name": "IS_BEFORE_CLASS",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~IS_BEFORE_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1274,
    "kind": "variable",
    "name": "TEMPLATE_SUPPORT",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~TEMPLATE_SUPPORT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1275,
    "kind": "variable",
    "name": "Multifield",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~Multifield",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Multifield}",
    "description": "A Multifield component that enables adding, reordering, and removing multiple instances of a component.\nMultifield partially supports the <code>template</code> element in IE 11. If adding/removing items in the template\nis required, <code>template.content</code> should be used.\nChild elements can be given a special attribute to enable functionality:\n- <code>[coral-multifield-add]</code>. Click to add an item.",
    "lineNumber": 35,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Multifield"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Multifield component that enables adding, reordering, and removing multiple instances of a component.\nMultifield partially supports the <code>template</code> element in IE 11. If adding/removing items in the template\nis required, <code>template.content</code> should be used.\nChild elements can be given a special attribute to enable functionality:\n- <code>[coral-multifield-add]</code>. Click to add an item."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-multifield"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-multifield></coral-multifield>",
      "<caption>JS constructor</caption>\nnew Coral.Multifield();"
    ],
    "see": [
      "../examples/#multifield"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1276,
    "kind": "typedef",
    "name": "coral-multifield:beforeitemorder",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~coral-multifield:beforeitemorder",
    "access": "public",
    "description": "Triggered when the {@link Multifield} item are reordered.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The item to be ordered."
      },
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldBefore",
        "description": "Ordered item next sibling before the swap. If <code>null</code>, the item was the last item."
      },
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "Ordered item will be inserted before this sibling item. If <code>null</code>, the item is inserted at the end."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-multifield:beforeitemorder"
    }
  },
  {
    "__docId__": 1277,
    "kind": "typedef",
    "name": "coral-multifield:itemorder",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/Multifield.js~coral-multifield:itemorder",
    "access": "public",
    "description": "Triggered when the {@link Multifield} item are reordered.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The ordered item."
      },
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldBefore",
        "description": "Ordered item next sibling before the swap. If <code>null</code>, the item was the last item."
      },
      {
        "nullable": null,
        "types": [
          "MultifieldItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "Ordered item was inserted before this sibling item. If <code>null</code>, the item was inserted at the end."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-multifield:itemorder"
    }
  },
  {
    "__docId__": 1278,
    "kind": "file",
    "name": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection} from '../../../coral-collection';\n\nclass MultifieldCollection extends Collection {\n  add(item, insertBefore) {\n    // _container and _itemTagName are the minimum options that need to be provided to automatically handle this function\n    if (this._container && this._itemTagName) {\n      if (!(item instanceof HTMLElement)) {\n        // creates an instance of an item from the object\n        item = document.createElement(this._itemTagName).set(item);\n      }\n\n      if (!insertBefore) {\n        insertBefore = this.last();\n        if (insertBefore) {\n          // Insert before the last item\n          insertBefore = insertBefore.nextElementSibling;\n        }\n      }\n\n      // inserts the element in the specified container\n      this._container.insertBefore(item, insertBefore || this._container.firstChild);\n\n      return item;\n    }\n  }\n}\n\nexport default MultifieldCollection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1279,
    "kind": "class",
    "name": "MultifieldCollection",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js~MultifieldCollection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{MultifieldCollection}",
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "interface": false,
    "extends": [
      "coral-spectrum/coral-collection.js~Collection"
    ]
  },
  {
    "__docId__": 1280,
    "kind": "method",
    "name": "add",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js~MultifieldCollection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldCollection.js~MultifieldCollection#add",
    "access": "public",
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      },
      {
        "name": "insertBefore",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1281,
    "kind": "file",
    "name": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-button';\nimport item from '../templates/item';\nimport {DragAction} from '../../../coral-dragaction';\nimport {i18n, transform, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Multifield-item';\n\n/**\n @class Coral.Multifield.Item\n @classdesc A Multifield item component. It can have a pre-filled content different from the Multifield template but\n added items will always be rendered based on the template.\n @htmltag coral-multifield-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst MultifieldItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Create or fetch the content zones\n      content: this.querySelector('coral-multifield-item-content') || document.createElement('coral-multifield-item-content')\n    };\n\n    const uid = this.id || commons.getUID();\n    this.setAttribute('id', uid);\n    this._elements.content.setAttribute('id', `${uid}-content`);\n    item.call(this._elements, {i18n, uid});\n  }\n\n  /**\n   The item content.\n\n   @type {MultifieldItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-multifield-item-content',\n      insert: function (content) {\n        // Insert the content zone before the move and remove buttons\n        this.insertBefore(content, this.firstChild);\n      }\n    });\n  }\n\n  /**\n    Specify whether the remove button is in disabled state or not.\n\n    @type {Boolean}\n    @default false\n    @private\n    */\n  get _deletable() {\n    return typeof this.__deletable === 'boolean' ? this.__deletable : true;\n  }\n\n  set _deletable(value) {\n    value = transform.boolean(value);\n    this.__deletable = value;\n\n    if(!this._readOnly) {\n      this._elements.remove.disabled = !value;\n    }\n  }\n\n  /**\n   Whether the item is set to be reorder using the keyboard\n\n   @type {boolean}\n   @private\n   */\n  get _dragging() {\n    return this.__dragging || false;\n  }\n\n  set _dragging(value) {\n    this.__dragging = transform.boolean(value);\n    if (this.__dragging) {\n      // Setting role=\"application\" to the move button forces\n      // NVDA and JAWS screen readers into forms mode,\n      // so arrow keys can be used to reorder.\n      this._elements.move.setAttribute('role', 'application');\n    } else {\n      // when reordering stops, restore the default role for the move button\n      this._elements.move.removeAttribute('role');\n    }\n    // aria-grabbed, may be deprecated in WAI-ARIA 1.1, but it is still reported by NVDA as \"draggable\" or \"dragging\"\n    this._elements.move.setAttribute('aria-grabbed', this.__dragging);\n    this._elements.move.setAttribute('aria-pressed', this.__dragging);\n    this._elements.move.selected = this.__dragging;\n  }\n\n  /**\n   Whether this multifieldItem is readOnly or not. Indicating that the user cannot modify the value of the multifieldItem fields.\n   @type {Boolean}\n   @default false\n   @private\n   */\n  get _readOnly() {\n    return this.__readOnly || false;\n  }\n\n  set _readOnly(value) {\n    value = transform.booleanAttr(value);\n    this.__readOnly = value;\n    this._reflectAttribute('_readonly', value);\n\n    // get all fields and set readonly to those whose has this property\n    let allFields = this.querySelectorAll(\"*\");\n    Array.prototype.forEach.call(allFields, (field) => {\n      if(typeof field.readOnly === \"boolean\") {\n        field.readOnly = value;\n      }\n    });\n\n    this._elements.move.disabled = value;\n    this._elements.remove.disabled = value;\n    this._elements.reorderup.disabled = value;\n    this._elements.reorderdown.disabled = value;\n  }\n\n  get _contentZones() {\n    return {'coral-multifield-item-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      '_readonly'\n    ]);\n  }\n\n  /** @ignore */\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      _readonly: '_readOnly',\n    });\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'listitem');\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    const templateHandleNames = ['move', 'remove', 'reorderup', 'reorderdown'];\n\n    // Render the main template\n    fragment.appendChild(this._elements.remove);\n    fragment.appendChild(this._elements.move);\n    fragment.appendChild(this._elements.reorderup);\n    fragment.appendChild(this._elements.reorderdown);\n\n    const content = this._elements.content;\n\n    // Remove it so we can process children\n    if (content.parentNode) {\n      this.removeChild(content);\n    }\n\n    // Process remaining elements as necessary\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        content.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Assign the content zones, moving them into place in the process\n    this.content = content;\n\n    // Attach drag events\n    const dragAction = new DragAction(this);\n    dragAction.axis = 'vertical';\n    dragAction.handle = this._elements.move;\n    dragAction.scroll = true;\n    dragAction.useScrollParent = true;\n  }\n});\n\nexport default MultifieldItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1282,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1283,
    "kind": "variable",
    "name": "MultifieldItem",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItem.js~MultifieldItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Multifield}",
    "description": "A Multifield item component. It can have a pre-filled content different from the Multifield template but\nadded items will always be rendered based on the template.",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Multifield.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Multifield item component. It can have a pre-filled content different from the Multifield template but\nadded items will always be rendered based on the template."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-multifield-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-multifield-item></coral-multifield-item>",
      "<caption>JS constructor</caption>\nnew Coral.Multifield.Item();"
    ],
    "see": [
      "../examples/#multifield"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1284,
    "kind": "file",
    "name": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Multifield.Item.Content\n @classdesc The Multifield item content\n @htmltag coral-multifield-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-multifield-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-multifield/src/scripts/MultifieldItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1285,
    "kind": "function",
    "name": "MultifieldItemContent",
    "memberof": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-multifield/src/scripts/MultifieldItemContent.js~MultifieldItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Multifield}",
    "description": "The Multifield item content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Multifield.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Multifield item content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-multifield-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-multifield-item-content></coral-multifield-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.Multifield.Item.Content();"
    ],
    "see": [
      "../examples/#multifield"
    ],
    "params": []
  },
  {
    "__docId__": 1286,
    "kind": "file",
    "name": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport '../../../coral-component-button';\nimport '../../../coral-component-textfield';\nimport {Icon} from '../../../coral-component-icon';\nimport base from '../templates/base';\nimport {transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Stepper';\nlet clearLiveRegionTimeout;\nconst LIVEREGION_TIMEOUT_DELAY = 3000;\nconst MSPOINTER_TYPE_MOUSE = 0x00000004;\nlet flagTouchStart = false;\nlet flagStepButtonClick = false;\n\nconst exponentialToDecimalString = (value) => {\n  const notation = value.toString();\n  if (notation.indexOf('e') !== -1) {\n    const negative = notation.indexOf('-') === 0;\n    const exponent = parseInt(notation.split('-')[negative ? 2 : 1], 10);\n    return value.toFixed(exponent).toString();\n  }\n\n  return value.toString();\n};\n\nconst handleDecimalOperation = (operator, value1, value2) => {\n  let result;\n\n  const operation = (operator, value1, value2) => {\n    if (operator === '+') {\n      return value1 + value2;\n    } else if (operator === '-') {\n      return value1 - value2;\n    } else if (operator === '%') {\n      return value1 % value2;\n    }\n  };\n\n  // Check if we have decimals\n  if (value1 % 1 !== 0 || value2 % 1 !== 0) {\n    const value1Decimal = exponentialToDecimalString(value1).split('.');\n    const value2Decimal = exponentialToDecimalString(value2).split('.');\n    const value1DecimalLength = value1Decimal[1] && value1Decimal[1].length || 0;\n    const value2DecimalLength = value2Decimal[1] && value2Decimal[1].length || 0;\n    const multiplier = Math.pow(10, Math.max(value1DecimalLength, value2DecimalLength));\n\n    // Transform the decimals to integers based on the multiplier\n    value1 = Math.round(value1 * multiplier);\n    value2 = Math.round(value2 * multiplier);\n\n    // Perform the operation on integers values to make sure we don't get a fancy decimal value\n    result = operation(operator, value1, value2);\n\n    // Transform the integer result back to decimal\n    result /= multiplier;\n  } else {\n    result = operation(operator, value1, value2);\n  }\n\n  return result;\n};\n\n/**\n @class Coral.NumberInput\n @classdesc A NumberInput component is a numeric control form field. It follows the ARIA specification for spinbutton.\n This means the following keys are valid for interacting with it: <code>up</code>, <code>down</code>, <code>left</code>,\n <code>right</code>, <code>pageup</code>, <code>pagedown</code>, <code>home</code>, <code>end</code> and the Mouse Wheel.\n @htmltag coral-numberinput\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst NumberInput = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      'key:up': '_onKeyUp',\n      'key:pageup': '_onKeyUp',\n      'key:down': '_onKeyDown',\n      'key:pagedown': '_onKeyDown',\n      'key:home': '_onKeyHome',\n      'key:end': '_onKeyEnd',\n      'touchstart [handle=stepUp], [handle=stepDown]': '_onTouchStart',\n      'pointerdown [handle=stepUp], [handle=stepDown]': '_onTouchStart',\n      'MSPointerDown [handle=stepUp], [handle=stepUp]': '_onTouchStart',\n      'MSPointerDown [handle=stepDown], [handle=stepDown]': '_onTouchStart',\n\n      'click [handle=stepUp]': '_onStepUpButtonClick',\n      'click [handle=stepDown]': '_onStepDownButtonClick',\n\n      'mousewheel [handle=\"input\"]': '_onInputMouseWheel',\n      'DOMMouseScroll [handle=\"input\"]': '_onInputMouseWheel',\n\n      'capture:focus': '_onFocus',\n      'capture:blur': '_onBlur'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {i18n, commons, Icon});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Default is null\n    this._min = this._max = null;\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.input.value;\n  }\n\n  set value(value) {\n    value = isNaN(value) ? '' : String(value);\n\n    // sets the value immediately so it is picked up in form submits\n    this._elements.input.value = value;\n\n    // in order to keep the reset value in sync, we need to handle the \"value\" attribute of the inner input\n    const valueAttribute = this.getAttribute('value');\n    this._elements.input[valueAttribute ? 'setAttribute' : 'removeAttribute']('value', valueAttribute);\n\n    // @a11y: aria-valuetext is used so that VoiceOver does not announce a percentage\n    if (this.value) {\n      this._elements.input.setAttribute('aria-valuenow', this.value);\n      this._elements.input.setAttribute('aria-valuetext', this.value);\n    } else {\n      this._elements.input.removeAttribute('aria-valuenow');\n      this._elements.input.removeAttribute('aria-valuetext');\n    }\n\n    // If the event triggering a value change is a click on a +/- button,\n    // announce the new value using the live region.\n    if (flagStepButtonClick || !!window.chrome) {\n      this._updateLiveRegion(this.value);\n      // Otherwise, clear the live region.\n    } else {\n      this._updateLiveRegion();\n    }\n\n    flagStepButtonClick = false;\n\n    this.invalid = this.hasAttribute('invalid');\n    this.disabled = this.hasAttribute('disabled');\n  }\n\n  /**\n   The value returned as a Number. Value is <code>NaN</code> if conversion to Number is not possible.\n\n   @type {Number}\n   @default NaN\n   */\n  get valueAsNumber() {\n    let valueAsNumber = this._valueAsNumber;\n\n    if (typeof valueAsNumber !== 'undefined' && valueAsNumber !== null) {\n      return valueAsNumber;\n    }\n\n    valueAsNumber = transform.number(this.value);\n    if (valueAsNumber !== null) {\n      return valueAsNumber;\n    }\n\n    return NaN;\n  }\n\n  set valueAsNumber(value) {\n    this._valueAsNumber = transform.number(value);\n\n    this.value = this._valueAsNumber;\n    this.invalid = this.hasAttribute('invalid');\n    this.disabled = this.hasAttribute('disabled');\n  }\n\n  /**\n   The minimum value for the NumberInput. If a value below the minimum is set, the NumberInput will be marked as\n   invalid but the value will be preserved. Stepping down the NumberInput via {@link Coral.NumberInput#stepDown}\n   or the decrement button respects the minimum value. It reflects the <code>min</code> attribute to the DOM.\n\n   @type {?Number}\n   @default null\n   @htmlattribute min\n   @htmlattributereflected\n   */\n  get min() {\n    return this._min;\n  }\n\n  set min(value) {\n    value = transform.number(value);\n\n    this._min = isNaN(value) ? null : value;\n\n    if (this._min === null) {\n      this._reflectAttribute('min', false);\n\n      this._elements.input.removeAttribute('aria-valuemin');\n      this._elements.input.removeAttribute('min');\n    } else {\n      this._reflectAttribute('min', this._min);\n      // sets the min in the input so that keyboard handles this component\n      this._elements.input.setAttribute('aria-valuemin', this._min);\n      this._elements.input.min = this._min;\n    }\n\n    this.invalid = this.hasAttribute('invalid');\n    this.disabled = this.hasAttribute('disabled');\n  }\n\n  /**\n   The maximum value for the NumberInput. If a value above the maximum is set, the NumberInput will be marked as\n   invalid but the value will be preserved. Stepping up the NumberInput via {@link Coral.NumberInput#stepUp} or\n   the increment button respects the maximum value. It reflects the <code>max</code> attribute to the DOM.\n\n   @type {?Number}\n   @default null\n   @htmlattribute max\n   @htmlattributereflected\n   */\n  get max() {\n    return this._max;\n  }\n\n  set max(value) {\n    value = transform.number(value);\n\n    this._max = isNaN(value) ? null : value;\n\n    if (this.max === null) {\n      this._reflectAttribute('max', false);\n\n      this._elements.input.removeAttribute('aria-valuemax');\n      this._elements.input.removeAttribute('max');\n    } else {\n      this._reflectAttribute('max', this._max);\n      // sets the max in the input so that keyboard handles this component\n      this._elements.input.setAttribute('aria-valuemax', this._max);\n      this._elements.input.max = this._max;\n    }\n\n    this.invalid = this.hasAttribute('invalid');\n    this.disabled = this.hasAttribute('disabled');\n  }\n\n  /**\n   The amount to increment by when stepping up or down. It can be the string <code>any</code> or any positive\n   floating point number. If this is not set to <code>any<code>, the control accepts only values at multiples of\n   the step value greater than the minimum.\n\n   @type {Number|String}\n   @default 1\n   @htmlattribute step\n   @htmlattributereflected\n   */\n  get step() {\n    return this._step || 1;\n  }\n\n  set step(value) {\n    if (value !== null && (value > 0 || value === 'any')) {\n      this._step = value === 'any' ? value : transform.number(value);\n      this._reflectAttribute('step', this._step);\n\n      this._elements.input.step = this._step;\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input.disabled = this._disabled;\n\n    this._setButtonState();\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.input.readOnly = this._readOnly;\n    this._setButtonState();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n    this._elements.input.invalid = this._invalid;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    this[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n  }\n\n  /**\n   Short hint that describes the expected value of the NumberInput. It is displayed when the NumberInput is empty.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  get placeholder() {\n    return this._elements.input.placeholder || '';\n  }\n\n  set placeholder(value) {\n    value = transform.string(value);\n    this._reflectAttribute('placeholder', value);\n\n    this._elements.input.placeholder = value;\n  }\n\n  // overrides the behavior from BaseFormField\n  reset() {\n    // since there is an internal value, this one handles the reset\n    this._elements.input.reset();\n  }\n\n  // overrides the behavior from BaseFormField\n  clear() {\n    // since there is an internal value, this one handles the clear\n    this._elements.input.clear();\n  }\n\n  /**\n   Increments the value by <code>step</code>. If the current value is <code>null</code> or <code>''</code>, it is\n   considered as 0. The new value will always respect the <code>min</code> and <code>max</code> values if available.\n   */\n  stepUp() {\n    // uses the Number representation since it simplifies the calculations\n    const value = this.valueAsNumber;\n    const step = this._getActualStep();\n    if (isNaN(value)) {\n      this.value = this.max !== null ? Math.min(step, this.max) : step;\n    } else {\n      const newValue = handleDecimalOperation('+', value, step);\n\n      this.value = this.max !== null ? Math.min(newValue, this.max) : newValue;\n    }\n  }\n\n  /**\n   Decrements the value by <code>step</code>. If the current value is <code>null</code> or <code>''</code>, it is\n   considered as 0. The new value will always respect the <code>min</code> and <code>max</code> values if available.\n   */\n  stepDown() {\n    // uses the Number representation since it simplifies the calculations\n    const value = this.valueAsNumber;\n    const step = this._getActualStep();\n    if (isNaN(value)) {\n      this.value = this.min !== null ? Math.max(-step, this.min) : -step;\n    } else {\n      const newValue = handleDecimalOperation('-', value, step);\n\n      this.value = this.min !== null ? Math.max(newValue, this.min) : newValue;\n    }\n  }\n\n  /**\n   If the value is 'any' there is no allowed step, that means we incremenet with the default (as if the step was not\n   defined).\n\n   @returns {Number} the valid step according to the specs.\n\n   @ignore\n   */\n  _getActualStep() {\n    return this.step === 'any' ? 1 : this.step;\n  }\n\n  /**\n   Checks if the current NumberInput is valid or not. This is done by checking that the current value is between the\n   provided <code>min</code> and <code>max</code> values. This check is only performed on user interaction.\n\n   @ignore\n   */\n  _validateInputValue() {\n    this.invalid = this.value !== '' && (isNaN(Number(this.value)) ||\n      (this.max !== null && this.value > this.max || this.min !== null && this.value < this.min) ||\n      this.step !== 'any' && handleDecimalOperation('%', Number(this.value), this._getActualStep()) !== 0);\n  }\n\n  /**\n   Sets the correct state of the buttons based on <code>disabled</code>, <code>min</code>, <code>max</code> and\n   <code>readOnly</code> properties.\n\n   @ignore\n   */\n  _setButtonState() {\n    this._elements.stepUp.disabled = this.disabled || this.max !== null && this.value >= this.max || this.readOnly;\n    this._elements.stepDown.disabled = this.disabled || this.min !== null && this.value <= this.min || this.readOnly;\n  }\n\n  /**\n   Triggers a change event. This is only done if the provided values are different.\n\n   @param {String} newValue\n   The new value of the component.\n   @param {String} oldValue\n   The old value of the component.\n\n   @private\n   */\n  _triggerChange(newValue, oldValue) {\n    // if the underlaying value stayed the same, there no need to trigger an event\n    if (newValue !== oldValue) {\n      this.trigger('change');\n    }\n  }\n\n  /**\n   Flags a touchstart or pointer event so that we can determine if an event originates from a touch screen interaction\n   or from a mouse interaction. An event originating from a mouse interaction should shift the focus to the input,\n   while an event originating from a touch interaction should not change the focus. On a touch screen, if the user\n   presses the increment or decrement button, focus should not shift to the input and open the software keyboard.\n\n   @ignore\n   */\n  _onTouchStart(event) {\n    if (event.type === 'touchstart' || event.pointerType !== 'mouse' && event.pointerType !== MSPOINTER_TYPE_MOUSE) {\n      flagTouchStart = true;\n    }\n  }\n\n  /**\n   Per WAI-ARIA spinbutton design pattern, http://www.w3.org/TR/wai-aria-practices/#spinbutton, shift focus to the\n   input if it does not currently have focus. We make an exception for touch devices, because a better user\n   experience is for the focus to remain on an increment or decrement button without shifting focus and opening the\n   soft keyboard.\n\n   @ignore\n   */\n  _setFocusToInput() {\n    if (!flagTouchStart && document.activeElement !== this._elements.input) {\n      this._elements.input.focus();\n    }\n    flagTouchStart = false;\n  }\n\n  /**\n   Handles the click on the step up button. It causes the NumberInput to step up its value and returns the focus back\n   to the input. This way the clicked button does not get focus.\n\n   @emits {change}\n   @ignore\n   */\n  _onStepUpButtonClick(event) {\n    event.preventDefault();\n\n    // stores the old value before stepup\n    const oldValue = this.value;\n\n    flagStepButtonClick = event.type === 'click';\n\n    this._setFocusToInput();\n\n    this.stepUp();\n\n    // we only do this on user interaction\n    this._validateInputValue();\n\n    // checks if we need to trigger a change event\n    this._triggerChange(this.value, oldValue);\n  }\n\n  /**\n   Handles the click on the step down button. It causes the NumberInput to step down its value and returns the focus\n   back to the input. This way the clicked button does not get focus.\n\n   @emits {change}\n   @ignore\n   */\n  _onStepDownButtonClick(event) {\n    event.preventDefault();\n\n    // stores the old value before stepdown\n    const oldValue = this.value;\n\n    flagStepButtonClick = event.type === 'click';\n\n    this._setFocusToInput();\n\n    this.stepDown();\n\n    // we only do this on user interaction\n    this._validateInputValue();\n\n    // checks if we need to trigger a change event\n    this._triggerChange(this.value, oldValue);\n  }\n\n  /**\n   Handles the home key press. If a max has been set, the value will be modified to match it, otherwise the key is\n   ignored.\n\n   @ignore\n   */\n  _onKeyHome(event) {\n    event.preventDefault();\n\n    // stops interaction if the numberinput is disabled or readonly\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    // sets the max value only if it exists\n    if (this.max !== null) {\n      // stores the old value before setting the max\n      const oldValue = this.value;\n\n      // When appropriate flagStepButtonClick will trigger a live region update.\n      flagStepButtonClick = true;\n\n      this.value = this.max;\n\n      // checks if we need to trigger a change event\n      this._triggerChange(this.value, oldValue);\n    }\n\n    this._setFocusToInput();\n  }\n\n  /**\n   Handles the end key press. If a min has been set, the value will be modified to match it, otherwise the key is\n   ignored.\n\n   @ignore\n   */\n  _onKeyEnd(event) {\n    event.preventDefault();\n\n    // stops interaction if the numberinput is disabled or readonly\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    // sets the min value only if it exists\n    if (this.min !== null) {\n      // stores the old value before setting the min\n      const oldValue = this.value;\n\n      // When appropriate, flagStepButtonClick will trigger a live region update.\n      flagStepButtonClick = true;\n\n      this.value = this.min;\n\n      // checks if we need to trigger a change event\n      this._triggerChange(this.value, oldValue);\n    }\n\n    this._setFocusToInput();\n  }\n\n  /**\n   Handles the up action by steping up the NumberInput. It prevents the default action.\n\n   @ignore\n   */\n  _onKeyUp(event) {\n    event.preventDefault();\n\n    // stops interaction if the numberinput is disabled or readonly\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    this._onStepUpButtonClick(event);\n  }\n\n  /**\n   Handles the down action by steping down the NumberInput. It prevents the default action.\n\n   @ignore\n   */\n  _onKeyDown(event) {\n    event.preventDefault();\n\n    // stops interaction if the numberinput is disabled or readonly\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    this._onStepDownButtonClick(event);\n  }\n\n  /**\n   Handles the Mousewheel to increment/decrement values.\n\n   @ignore\n   */\n  _onInputMouseWheel(event) {\n    // stops interaction if the numberinput is disabled or readonly or is not focused (this is the case where its hovered but not focused)\n    if (this.disabled || this.readOnly || this._elements.input !== document.activeElement) {\n      return;\n    }\n\n    // else we prevent the default event like user scrolling the page and handle the mouse wheel input\n    event.preventDefault();\n\n    // stores the old value to calculate the change\n    const oldValue = this.value;\n\n    const delta = Math.max(-1, Math.min(1, event.wheelDelta || -event.detail || event.deltaY));\n    if (delta < 0) {\n      this.stepDown();\n    } else {\n      this.stepUp();\n    }\n\n    // checks if we need to trigger a change event\n    this._triggerChange(this.value, oldValue);\n  }\n\n  /**\n   Overrides the method from formField to be able to add validation after the user has changed the value.\n\n   @private\n   */\n  _onInputChange(event) {\n    // stops the current event\n    event.stopPropagation();\n\n    // we only do this on user interaction\n    this._validateInputValue();\n\n    // we force the sync of the value,invalid and disabled properties\n    this.value = this.value;\n    this.invalid = this.invalid;\n    this.disabled = this.disabled;\n\n    // we always trigger a change since it came from user interaction\n    this.trigger('change');\n  }\n\n  /**\n   Handles focus event.\n\n   @ignore\n   */\n  _onFocus() {\n    this.classList.add('is-focused');\n    this._elements.input.classList.add('is-focused');\n    this._elements.liveregion.removeAttribute('role');\n    this._elements.liveregion.removeAttribute('aria-hidden');\n  }\n\n  /**\n   Handles blur event.\n\n   @ignore\n   */\n  _onBlur() {\n    this.classList.remove('is-focused');\n    this._elements.input.classList.remove('is-focused');\n\n    // clear liveregion\n    this._elements.liveregion.setAttribute('role', 'presentation');\n    this._elements.liveregion.setAttribute('aria-hidden', true);\n    this._clearLiveRegion();\n  }\n\n  /** @ignore */\n  _clearLiveRegion() {\n    const liveregion = this._elements.liveregion;\n    if (liveregion.firstChild) {\n      liveregion.removeChild(liveregion.firstChild);\n    }\n  }\n\n  /** @ignore */\n  _updateLiveRegion(value) {\n    let textNode;\n\n    clearTimeout(clearLiveRegionTimeout);\n    this._clearLiveRegion();\n\n    if (value && value !== '') {\n      textNode = document.createTextNode(value);\n      window.requestAnimationFrame(() => {\n        this._elements.liveregion.appendChild(textNode);\n\n        clearLiveRegionTimeout = window.setTimeout(() => {\n          this._clearLiveRegion();\n        }, LIVEREGION_TIMEOUT_DELAY);\n      });\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'min',\n      'max',\n      'step',\n      'placeholder'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._step) {\n      this.step = 1;\n    }\n\n    // a11y\n    this.setAttribute('role', 'group');\n\n    // remove duplicated aria-labelledby\n    if (this.hasAttribute('aria-labelledby')) {\n      this._elements.input.removeAttribute('aria-labelledby');\n    }\n\n    if (this._elements.input.type === 'text') {\n      this._elements.input.setAttribute('role', 'spinbutton');\n    }\n\n    const frag = document.createDocumentFragment();\n\n    const templateHandleNames = ['presentation', 'input'];\n\n    // Render main template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.presentation);\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the frag\n        frag.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n  }\n});\n\nexport default NumberInput;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1287,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1288,
    "kind": "variable",
    "name": "LIVEREGION_TIMEOUT_DELAY",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~LIVEREGION_TIMEOUT_DELAY",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1289,
    "kind": "variable",
    "name": "MSPOINTER_TYPE_MOUSE",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~MSPOINTER_TYPE_MOUSE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1290,
    "kind": "variable",
    "name": "flagTouchStart",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~flagTouchStart",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 26,
    "undocument": true,
    "type": {
      "types": [
        "boolean"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1291,
    "kind": "variable",
    "name": "flagStepButtonClick",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~flagStepButtonClick",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 27,
    "undocument": true,
    "type": {
      "types": [
        "boolean"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1292,
    "kind": "function",
    "name": "exponentialToDecimalString",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~exponentialToDecimalString",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1293,
    "kind": "function",
    "name": "handleDecimalOperation",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~handleDecimalOperation",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 40,
    "undocument": true,
    "params": [
      {
        "name": "operator",
        "types": [
          "*"
        ]
      },
      {
        "name": "value1",
        "types": [
          "*"
        ]
      },
      {
        "name": "value2",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1294,
    "kind": "variable",
    "name": "NumberInput",
    "memberof": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-numberinput/src/scripts/NumberInput.js~NumberInput",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{NumberInput}",
    "description": "A NumberInput component is a numeric control form field. It follows the ARIA specification for spinbutton.\nThis means the following keys are valid for interacting with it: <code>up</code>, <code>down</code>, <code>left</code>,\n<code>right</code>, <code>pageup</code>, <code>pagedown</code>, <code>home</code>, <code>end</code> and the Mouse Wheel.",
    "lineNumber": 87,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.NumberInput"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A NumberInput component is a numeric control form field. It follows the ARIA specification for spinbutton.\nThis means the following keys are valid for interacting with it: <code>up</code>, <code>down</code>, <code>left</code>,\n<code>right</code>, <code>pageup</code>, <code>pagedown</code>, <code>home</code>, <code>end</code> and the Mouse Wheel."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-numberinput"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-numberinput></coral-numberinput>",
      "<caption>JS constructor</caption>\nnew Coral.NumberInput();"
    ],
    "see": [
      "../examples/#numberinput"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1295,
    "kind": "file",
    "name": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseOverlay} from '../../../coral-base-overlay';\nimport PopperJS from 'popper.js';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst DEPRECATED_ALIGN = 'Coral.Overlay: alignAt and alignMy have been deprecated. Please use the offset, inner and placement properties instead.';\nconst DEPRECATED_FLIP_FIT = 'Coral.Overlay.collision.FLIP_FIT has been deprecated. Please use Coral.Overlay.collision.FLIP instead.';\n\n/**\n Enumeration for {@link Overlay} alignment pairs.\n @deprecated\n\n @typedef {Object} OverlayAlignEnum\n\n @property {String} LEFT_TOP\n Use the top of the left side as an anchor point.\n @property {String} LEFT_CENTER\n Use the center of the left side as an anchor point.\n @property {String} LEFT_BOTTOM\n Use the bottom of the left side as an anchor point.\n @property {String} CENTER_TOP\n Use the center of the top side as an anchor point.\n @property {String} CENTER_CENTER\n Use the center as an anchor point.\n @property {String} CENTER_BOTTOM\n Use the center of the bottom side as an anchor point.\n @property {String} RIGHT_TOP\n Use the top of the right side as an anchor point.\n @property {String} RIGHT_CENTER\n Use the center of the right side as an anchor point.\n @property {String} RIGHT_BOTTOM\n Use the bottom of the right side as an anchor point.\n */\nconst align = {\n  LEFT_TOP: 'left top',\n  LEFT_CENTER: 'left center',\n  LEFT_BOTTOM: 'left bottom',\n  CENTER_TOP: 'center top',\n  CENTER_CENTER: 'center center',\n  CENTER_BOTTOM: 'center bottom',\n  RIGHT_TOP: 'right top',\n  RIGHT_CENTER: 'right center',\n  RIGHT_BOTTOM: 'right bottom'\n};\n\n/**\n Enumeration for {@link Overlay} collision detection strategies.\n\n @typedef {Object} OverlayCollisionEnum\n\n @property {String} FLIP\n Flips the element to the opposite side of the target and the collision detection is run again to see if it will fit. Whichever side allows more of the element to be visible will be used.\n @property {String} FIT\n Shift the element away from the edge of the window.\n @property {String} FLIP_FIT\n Deprecated. First applies the flip logic, placing the element on whichever side allows more of the element to be visible. Then the fit logic is applied to ensure as much of the element is visible as possible.\n @property {String} NONE\n Does not apply any collision detection.\n */\nconst collision = {\n  FLIP: 'flip',\n  FIT: 'fit',\n  FLIP_FIT: 'flipfit',\n  NONE: 'none'\n};\n\n/**\n Enumeration for {@link Overlay} anchored overlay targets.\n\n @typedef {Object} OverlayTargetEnum\n\n @property {String} PREVIOUS\n Use the previous sibling element in the DOM.\n @property {String} NEXT\n Use the next sibling element in the DOM.\n */\nconst target = {\n  PREVIOUS: '_prev',\n  NEXT: '_next'\n};\n\n/**\n Enumeration for {@link Overlay} placement values.\n\n @typedef {Object} OverlayPlacementEnum\n\n @property {String} LEFT\n An overlay anchored to the left of the target.\n @property {String} RIGHT\n An overlay anchored to the right of the target.\n @property {String} BOTTOM\n An overlay anchored at the bottom the target.\n @property {String} TOP\n An overlay anchored at the top target.\n */\nconst placement = {\n  LEFT: 'left',\n  RIGHT: 'right',\n  BOTTOM: 'bottom',\n  TOP: 'top'\n};\n\n/**\n Enumeration for {@link Overlay} interaction values.\n\n @typedef {Object} OverlayInteractionEnum\n\n @property {String} ON\n Keyboard interaction is enabled.\n @property {String} OFF\n Keyboard interaction is disabled.\n */\nconst interaction = {\n  ON: 'on',\n  OFF: 'off'\n};\n\nconst CLASSNAME = '_coral-Overlay';\n\n/**\n @class Coral.Overlay\n @classdesc A generic Overlay component.\n @htmltag coral-overlay\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseOverlay}\n */\nclass ExtensibleOverlay extends BaseOverlay(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Override from BaseOverlay\n    this._overlayAnimationTime = 0;\n\n    // Popper default\n    this._withinOffset = 5;\n\n    // Events\n    this._delegateEvents({\n      'global:key:escape': '_handleEscape',\n      'click [coral-close]': '_handleCloseClick'\n    });\n  }\n\n  /**\n   The element the overlay should position relative to. It accepts values from {@link OverlayTargetEnum}, as\n   well as a DOM element or a CSS selector. If a CSS selector is provided, the first matching element will be used.\n\n   @type {?HTMLElement|String}\n   @default null\n   */\n  get target() {\n    return this._target || null;\n  }\n\n  set target(value) {\n    // We don't want to validate that the value must change here\n    // If a selector is provided, we'll take the first element matching that selector\n    // If the DOM is modified and the user wants a new target with the same selector,\n    // They should be able to set target = 'selector' again and get a different element\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      const targetElement = this._getTarget();\n\n      if (targetElement) {\n        // To make it return focus to the right item, change the target\n        if (this._returnFocus === this.constructor.returnFocus.ON) {\n          this.returnFocusTo(targetElement);\n        }\n\n        // update popper if popper already initialised or it is not explicitly avoid.\n        if(this._popper || !this._avoidPopperInit) {\n          this._initPopper(false, targetElement);\n        }\n      }\n    }\n  }\n\n  /**\n   The point on the overlay we should anchor from when positioning. See {@link OverlayAlignEnum}.\n\n   @type {String}\n   @default OverlayAlignEnum.CENTER_CENTER\n   @htmlattribute alignmy\n\n   @deprecated\n   */\n  get alignMy() {\n    return this._alignMy || align.CENTER_CENTER;\n  }\n\n  set alignMy(value) {\n    commons._log('warn', DEPRECATED_ALIGN);\n\n    value = transform.string(value).toLowerCase();\n    this._alignMy = validate.enumeration(align)(value) && value || align.CENTER_CENTER;\n  }\n\n  /**\n   The point on the target we should anchor to when positioning. See {@link OverlayAlignEnum}.\n\n   @type {String}\n   @default Coral.Overlay.align.CENTER_CENTER\n   @htmlattribute alignat\n\n   @deprecated\n   */\n  get alignAt() {\n    return this._alignAt || align.CENTER_CENTER;\n  }\n\n  set alignAt(value) {\n    commons._log('warn', DEPRECATED_ALIGN);\n\n    value = transform.string(value).toLowerCase();\n    this._alignAt = validate.enumeration(align)(value) && value || align.CENTER_CENTER;\n  }\n\n  /**\n   The distance the overlay should be from its target.\n\n   @type {Number}\n   @default 0\n   @htmlattribute offset\n   */\n  get offset() {\n    return transform.number(this.lengthOffset);\n  }\n\n  set offset(value) {\n    value = transform.number(value);\n    if (typeof value === 'number') {\n      this.lengthOffset = `${value}px`;\n      this.breadthOffset = '0px';\n\n      this.reposition();\n    }\n  }\n\n  /**\n   Whether the overlay flows toward the inner of the target element. By default, it's placed outside the target element.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute inner\n   */\n  get inner() {\n    return this._inner || false;\n  }\n\n  set inner(value) {\n    this._inner = transform.booleanAttr(value);\n\n    this.reposition();\n  }\n\n  /**\n   The distance the overlay should be from its target along the length axis.\n\n   @type {String}\n   @default '0px'\n   @htmlattribute lengthoffset\n   */\n  get lengthOffset() {\n    return this._lengthOffset || '0px';\n  }\n\n  set lengthOffset(value) {\n    this._lengthOffset = transform.string(value) || '0px';\n\n    this.reposition();\n  }\n\n  /**\n   The distance the overlay should be from its target along the breadth axis.\n\n   @type {String}\n   @default '0px'\n   @htmlattribute breadthoffset\n   */\n  get breadthOffset() {\n    return this._breadthOffset || '0px';\n  }\n\n  set breadthOffset(value) {\n    this._breadthOffset = transform.string(value) || '0px';\n\n    this.reposition();\n  }\n\n  /**\n   The placement of the overlay. See {@link OverlayPlacementEnum}.\n\n   @type {String}\n   @default OverlayPlacementEnum.RIGHT\n   @htmlattribute placement\n   */\n  get placement() {\n    return this._placement || placement.RIGHT;\n  }\n\n  set placement(value) {\n    value = transform.string(value).toLowerCase();\n    this._placement = validate.enumeration(placement)(value) && value || placement.RIGHT;\n\n    this.reposition();\n  }\n\n  /**\n   The bounding element for the overlay. The overlay will be sized and positioned such that it is contained within\n   this element. It accepts both a DOM Element or a CSS selector. If a CSS selector is provided, the first matching\n   element will be used.\n\n   @type {HTMLElement|String}\n   @default 'scrollParent'\n   */\n  get within() {\n    return this._within || 'scrollParent';\n  }\n\n  set within(value) {\n    if (value instanceof HTMLElement || typeof value === 'string') {\n      this._within = value;\n\n      this.reposition();\n    }\n  }\n\n  /**\n   Amount of pixel used to define a minimum distance between the boundaries and the overlay.\n   This makes sure the overlay always has a little padding between the edges of its container.\n\n   @type {Number}\n   @default 5\n   @htmlattribute withinOffset\n   */\n  get withinOffset() {\n    return this._withinOffset;\n  }\n\n  set withinOffset(value) {\n    value = transform.number(value);\n    if (typeof value === 'number') {\n      this._withinOffset = value;\n      this.reposition();\n    }\n  }\n\n  /**\n   The collision handling strategy when positioning the overlay relative to a target. See {@link OverlayCollisionEnum}.\n\n   @type {String}\n   @default OverlayCollisionEnum.FLIP\n   @htmlattribute collision\n   */\n  get collision() {\n    return this._collision || collision.FLIP;\n  }\n\n  set collision(value) {\n    value = transform.string(value).toLowerCase();\n    this._collision = validate.enumeration(collision)(value) && value || collision.FLIP;\n\n    if (this._collision === collision.FLIP_FIT) {\n      commons._log('warn', DEPRECATED_FLIP_FIT);\n    }\n\n    this.reposition();\n  }\n\n  /**\n   Whether keyboard interaction is enabled. See {@link OverlayInteractionEnum}.\n\n   @type {String}\n   @default OverlayInteractionEnum.ON\n   */\n  get interaction() {\n    return this._interaction || interaction.ON;\n  }\n\n  set interaction(value) {\n    value = transform.string(value).toLowerCase();\n    this._interaction = validate.enumeration(interaction)(value) && value || interaction.ON;\n  }\n\n  /**\n   Whether the overlay is allowed to change its DOM position for better positioning based on its context.\n\n   @type {Boolean}\n   @default false\n   */\n  get smart() {\n    return this._smart || false;\n  }\n\n  set smart(value) {\n    this._smart = transform.booleanAttr(value);\n\n    this._toggleSmartBehavior(this.open);\n  }\n\n  /**\n   Inherited from {@link BaseOverlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    // initialise popper if undefined, used when popper initialisation avoided while setting target.\n    if(!this._popper) {\n      this._initPopper(true);\n    }\n\n    super.open = value;\n\n    this._toggleSmartBehavior(this.open);\n  }\n\n  _toggleSmartBehavior(toggle) {\n    if (toggle) {\n      if (this.smart) {\n        this._validateParentOverflow();\n      }\n\n      this._togglePopperEventListener(true);\n\n      // We need an additional frame to help popper read the correct offsets\n      window.requestAnimationFrame(() => {\n        this.reposition();\n      });\n    } else {\n      this._togglePopperEventListener(false);\n    }\n  }\n\n  _togglePopperEventListener(toggle) {\n    if (this._popper) {\n      this._popper[toggle ? 'enableEventListeners' : 'disableEventListeners']();\n    }\n  }\n\n  /** @ignore */\n  _validateParentOverflow() {\n    let reposition = false;\n\n    // Check parents if they potentially truncate the overlay\n    let parent = this.parentElement;\n    while (!reposition && parent) {\n      if (parent !== document.body) {\n        const computedStyle = window.getComputedStyle(parent);\n        if (computedStyle.overflow === 'auto' || computedStyle.overflow === 'hidden' ||\n          parent.clientHeight === 0 || parent.clientWidth === 0) {\n          reposition = true;\n        }\n\n        parent = parent.parentElement;\n      } else {\n        parent = null;\n      }\n    }\n\n    // If it's the case then we move the overlay to make sure it's not truncated\n    if (reposition) {\n      this._ignoreConnectedCallback = true;\n      this._repositioned = true;\n      document.body.appendChild(this);\n      this._ignoreConnectedCallback = false;\n    }\n  }\n\n  /** @ignore */\n  _onUpdate(data) {\n    // Trigger once positioned the first time\n    if (!this._oldPosition) {\n      this._oldPosition = data.styles.transform;\n\n      // Do it in the next frame to avoid triggering the event too early\n      window.requestAnimationFrame(() => {\n        this.trigger('coral-overlay:positioned', data);\n      });\n    }\n    // Trigger again only if position changed\n    else {\n      this._oldPosition = this._oldPosition || data.styles.transform;\n\n      if (this._oldPosition !== data.styles.transform) {\n        this.trigger('coral-overlay:positioned', data);\n      }\n\n      this._oldPosition = data.styles.transform;\n    }\n  }\n\n  /**\n   @todo maybe this should be base or something\n   @ignore\n   */\n  _handleCloseClick(event) {\n    const dismissTarget = event.matchedTarget;\n    const dismissValue = dismissTarget.getAttribute('coral-close');\n    if (!dismissValue || this.matches(dismissValue)) {\n      this.hide();\n      event.stopPropagation();\n\n      this._trackEvent('close', this.tagName.toLowerCase(), event);\n    }\n  }\n\n  /**\n   Hides the overlay if it's on the top. When <code>interaction</code> is OFF it is ignored.\n\n   @ignore\n   */\n  _handleEscape(event) {\n    if (this.interaction === interaction.ON && this.open && this._isTopOverlay()) {\n      event.stopPropagation();\n      this.hide();\n    }\n  }\n\n  _getTarget(targetValue) {\n    return this.constructor._getTarget(this, targetValue);\n  }\n\n  _initPopper(forceReposition, targetElement) {\n    targetElement = targetElement || this._getTarget();\n    if(targetElement) {\n      this._popper = this._popper || new PopperJS(targetElement, this, {onUpdate: this._onUpdate.bind(this)});\n      // Make sure popper options modifiers are up to date\n      this.reposition(forceReposition);\n    }\n  }\n  /**\n   Re-position the overlay if it's currently open.\n\n   @function\n   @param {Boolean} forceReposition\n   Whether to force repositioning even if closed.\n   */\n  reposition(forceReposition) {\n    if (this._popper) {\n      const targetElement = this._getTarget();\n\n      // Update target only if valid\n      if (targetElement) {\n        this._popper.reference = targetElement;\n      }\n\n      this._popper.options.placement = this.placement;\n\n      this._popper.modifiers.forEach((modifier) => {\n        if (modifier.name === 'offset') {\n          modifier.offset = `${this.breadthOffset}, ${this.lengthOffset}`;\n        } else if (modifier.name === 'flip') {\n          modifier.enabled = this.collision !== collision.FIT && this.collision !== collision.NONE;\n        } else if (modifier.name === 'inner') {\n          modifier.enabled = this.inner;\n        } else if (modifier.name === 'preventOverflow') {\n          modifier.enabled = this.collision !== collision.NONE;\n\n          const within = this.within;\n          let boundary;\n          // Check for allowed PopperJS strings\n          if (within instanceof HTMLElement || ['scrollParent', 'window', 'viewport'].indexOf(within) !== -1) {\n            boundary = within;\n          } else if (typeof within === 'string') {\n            boundary = document.querySelector(within);\n            // Fallback to default if element is not found in the document\n            if (!(boundary instanceof HTMLElement)) {\n              boundary = 'scrollParent';\n            }\n          }\n\n          modifier.boundariesElement = boundary;\n\n          modifier.padding = this.withinOffset;\n        }\n      });\n\n      if (this.open || forceReposition) {\n        this._popper.update();\n      }\n    }\n  }\n\n  /**\n   Get the element the overlay is anchored to.\n\n   @param {HTMLElement} [el]\n   The reference element.\n   @param {HTMLElement|String} [target]\n   A specific target value to use.\n   If not provided, the current target of the element will be used.\n   @returns {HTMLElement|null}\n   */\n  static _getTarget(el, targetValue) {\n    // Use passed target\n    targetValue = targetValue || el.target;\n\n    if (targetValue instanceof Node) {\n      // Just return the provided Node\n      return targetValue;\n    }\n\n    // Dynamically get the target node based on target\n    let newTarget = null;\n    if (typeof targetValue === 'string') {\n      if (targetValue === target.PREVIOUS) {\n        newTarget = el.previousElementSibling;\n      } else if (targetValue === target.NEXT) {\n        newTarget = el.nextElementSibling;\n      } else {\n        newTarget = document.querySelector(targetValue);\n      }\n    }\n\n    return newTarget;\n  }\n\n  /**\n   @deprecated\n\n   Returns {@link Overlay} align options.\n\n   @return {OverlayAlignEnum}\n   */\n  static get align() {\n    return align;\n  }\n\n  /**\n   Returns {@link Overlay} collision options.\n\n   @return {OverlayCollisionEnum}\n   */\n  static get collision() {\n    return collision;\n  }\n\n  /**\n   Returns {@link Overlay} target options.\n\n   @return {OverlayTargetEnum}\n   */\n  static get target() {\n    return target;\n  }\n\n  /**\n   Returns {@link Overlay} placement options.\n\n   @return {OverlayPlacementEnum}\n   */\n  static get placement() {\n    return placement;\n  }\n\n  /**\n   Returns {@link Overlay} interaction options.\n\n   @return {OverlayInteractionEnum}\n   */\n  static get interaction() {\n    return interaction;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      alignmy: 'alignMy',\n      alignat: 'alignAt',\n      lengthoffset: 'lengthOffset',\n      breadthoffset: 'breadthOffset',\n      withinoffset: 'withinOffset'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'alignmy',\n      'alignat',\n      'offset',\n      'lengthoffset',\n      'breadthoffset',\n      'placement',\n      'within',\n      'withinoffset',\n      'collision',\n      'interaction',\n      'target',\n      'inner',\n      'smart'\n    ]);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    // In case it was not added to the DOM, make sure popper is initialized by setting target\n    this.target = this.target;\n\n    // We need an additional frame to help popper read the correct offsets\n    if (this._popper) {\n      window.requestAnimationFrame(() => {\n        this.reposition(true); // Force repositioning\n        !this.open && this._togglePopperEventListener(false);\n      });\n    }\n  }\n\n  /** @ignore */\n  render() {\n    this.classList.add(CLASSNAME);\n\n    // Hidden by default\n    this.style.display = 'none';\n  }\n\n  /**\n   Triggered after the {@link Overlay} is positioned.\n\n   @typedef {CustomEvent} coral-overlay:positioned\n   */\n}\n\nconst Overlay = Decorator(ExtensibleOverlay);\n\nexport {Overlay, ExtensibleOverlay};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1296,
    "kind": "variable",
    "name": "DEPRECATED_ALIGN",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~DEPRECATED_ALIGN",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1297,
    "kind": "variable",
    "name": "DEPRECATED_FLIP_FIT",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~DEPRECATED_FLIP_FIT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1298,
    "kind": "typedef",
    "name": "OverlayAlignEnum",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~OverlayAlignEnum",
    "access": "public",
    "description": "Enumeration for {@link Overlay} alignment pairs.",
    "lineNumber": 47,
    "deprecated": true,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT_TOP",
        "description": "Use the top of the left side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT_CENTER",
        "description": "Use the center of the left side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT_BOTTOM",
        "description": "Use the bottom of the left side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER_TOP",
        "description": "Use the center of the top side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER_CENTER",
        "description": "Use the center as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER_BOTTOM",
        "description": "Use the center of the bottom side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT_TOP",
        "description": "Use the top of the right side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT_CENTER",
        "description": "Use the center of the right side as an anchor point."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT_BOTTOM",
        "description": "Use the bottom of the right side as an anchor point."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayAlignEnum"
    }
  },
  {
    "__docId__": 1299,
    "kind": "typedef",
    "name": "OverlayCollisionEnum",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~OverlayCollisionEnum",
    "access": "public",
    "description": "Enumeration for {@link Overlay} collision detection strategies.",
    "lineNumber": 73,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FLIP",
        "description": "Flips the element to the opposite side of the target and the collision detection is run again to see if it will fit. Whichever side allows more of the element to be visible will be used."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FIT",
        "description": "Shift the element away from the edge of the window."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FLIP_FIT",
        "description": "Deprecated. First applies the flip logic, placing the element on whichever side allows more of the element to be visible. Then the fit logic is applied to ensure as much of the element is visible as possible."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "Does not apply any collision detection."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayCollisionEnum"
    }
  },
  {
    "__docId__": 1300,
    "kind": "typedef",
    "name": "OverlayTargetEnum",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~OverlayTargetEnum",
    "access": "public",
    "description": "Enumeration for {@link Overlay} anchored overlay targets.",
    "lineNumber": 90,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PREVIOUS",
        "description": "Use the previous sibling element in the DOM."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NEXT",
        "description": "Use the next sibling element in the DOM."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayTargetEnum"
    }
  },
  {
    "__docId__": 1301,
    "kind": "typedef",
    "name": "OverlayPlacementEnum",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~OverlayPlacementEnum",
    "access": "public",
    "description": "Enumeration for {@link Overlay} placement values.",
    "lineNumber": 109,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT",
        "description": "An overlay anchored to the left of the target."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT",
        "description": "An overlay anchored to the right of the target."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BOTTOM",
        "description": "An overlay anchored at the bottom the target."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TOP",
        "description": "An overlay anchored at the top target."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayPlacementEnum"
    }
  },
  {
    "__docId__": 1302,
    "kind": "typedef",
    "name": "OverlayInteractionEnum",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~OverlayInteractionEnum",
    "access": "public",
    "description": "Enumeration for {@link Overlay} interaction values.",
    "lineNumber": 126,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Keyboard interaction is enabled."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Keyboard interaction is disabled."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "OverlayInteractionEnum"
    }
  },
  {
    "__docId__": 1303,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 131,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1304,
    "kind": "variable",
    "name": "Overlay",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~Overlay",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Overlay}",
    "description": null,
    "lineNumber": 743,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1305,
    "kind": "class",
    "name": "ExtensibleOverlay",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Overlay}",
    "description": "A generic Overlay component.",
    "lineNumber": 141,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Overlay"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A generic Overlay component."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-overlay"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent",
      "BaseOverlay"
    ],
    "expressionExtends": "BaseOverlay(BaseComponent(HTMLElement))",
    "examples": [
      "<caption>Markup</caption>\n<coral-overlay></coral-overlay>",
      "<caption>JS constructor</caption>\nnew Coral.Overlay();"
    ],
    "see": [
      "../examples/#overlay"
    ]
  },
  {
    "__docId__": 1306,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 143,
    "ignore": true
  },
  {
    "__docId__": 1307,
    "kind": "member",
    "name": "_overlayAnimationTime",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_overlayAnimationTime",
    "access": "private",
    "description": null,
    "lineNumber": 147,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 1308,
    "kind": "member",
    "name": "_withinOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_withinOffset",
    "access": "private",
    "description": null,
    "lineNumber": 150,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 1309,
    "kind": "member",
    "name": "target",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#target",
    "access": "public",
    "description": "The element the overlay should position relative to. It accepts values from {@link OverlayTargetEnum}, as\nwell as a DOM element or a CSS selector. If a CSS selector is provided, the first matching element will be used.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 166,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      }
    ],
    "type": {
      "nullable": true,
      "types": [
        "HTMLElement",
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1311,
    "kind": "member",
    "name": "_target",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_target",
    "access": "private",
    "description": null,
    "lineNumber": 176,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1312,
    "kind": "member",
    "name": "alignMy",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#alignMy",
    "access": "public",
    "description": "The point on the overlay we should anchor from when positioning. See {@link OverlayAlignEnum}.\n<ul><li><code>OverlayAlignEnum.CENTER_CENTER</code> by default.</li></ul>",
    "lineNumber": 203,
    "deprecated": true,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayAlignEnum.CENTER_CENTER"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "alignmy"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1314,
    "kind": "member",
    "name": "_alignMy",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_alignMy",
    "access": "private",
    "description": null,
    "lineNumber": 211,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1315,
    "kind": "member",
    "name": "alignAt",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#alignAt",
    "access": "public",
    "description": "The point on the target we should anchor to when positioning. See {@link OverlayAlignEnum}.\n<ul><li><code>Coral.Overlay.align.CENTER_CENTER</code> by default.</li></ul>",
    "lineNumber": 223,
    "deprecated": true,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "Coral.Overlay.align.CENTER_CENTER"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "alignat"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1317,
    "kind": "member",
    "name": "_alignAt",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_alignAt",
    "access": "private",
    "description": null,
    "lineNumber": 231,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1318,
    "kind": "member",
    "name": "offset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#offset",
    "access": "public",
    "description": "The distance the overlay should be from its target.\n<ul><li><code>0</code> by default.</li></ul>",
    "lineNumber": 241,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "0"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "offset"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1322,
    "kind": "member",
    "name": "inner",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#inner",
    "access": "public",
    "description": "Whether the overlay flows toward the inner of the target element. By default, it's placed outside the target element.\n<ul><li><code>false</code> by default.</li></ul>",
    "lineNumber": 262,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "inner"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1324,
    "kind": "member",
    "name": "_inner",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_inner",
    "access": "private",
    "description": null,
    "lineNumber": 267,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1325,
    "kind": "member",
    "name": "lengthOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#lengthOffset",
    "access": "public",
    "description": "The distance the overlay should be from its target along the length axis.\n<ul><li><code>'0px'</code> by default.</li></ul>",
    "lineNumber": 279,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "'0px'"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "lengthoffset"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1327,
    "kind": "member",
    "name": "_lengthOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_lengthOffset",
    "access": "private",
    "description": null,
    "lineNumber": 284,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1328,
    "kind": "member",
    "name": "breadthOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#breadthOffset",
    "access": "public",
    "description": "The distance the overlay should be from its target along the breadth axis.\n<ul><li><code>'0px'</code> by default.</li></ul>",
    "lineNumber": 296,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "'0px'"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "breadthoffset"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1330,
    "kind": "member",
    "name": "_breadthOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_breadthOffset",
    "access": "private",
    "description": null,
    "lineNumber": 301,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1331,
    "kind": "member",
    "name": "placement",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#placement",
    "access": "public",
    "description": "The placement of the overlay. See {@link OverlayPlacementEnum}.\n<ul><li><code>OverlayPlacementEnum.RIGHT</code> by default.</li></ul>",
    "lineNumber": 313,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayPlacementEnum.RIGHT"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "placement"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1333,
    "kind": "member",
    "name": "_placement",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_placement",
    "access": "private",
    "description": null,
    "lineNumber": 319,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1334,
    "kind": "member",
    "name": "within",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#within",
    "access": "public",
    "description": "The bounding element for the overlay. The overlay will be sized and positioned such that it is contained within\nthis element. It accepts both a DOM Element or a CSS selector. If a CSS selector is provided, the first matching\nelement will be used.\n<ul><li><code>'scrollParent'</code> by default.</li></ul>",
    "lineNumber": 332,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "'scrollParent'"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement",
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1336,
    "kind": "member",
    "name": "_within",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_within",
    "access": "private",
    "description": null,
    "lineNumber": 338,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1337,
    "kind": "member",
    "name": "withinOffset",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#withinOffset",
    "access": "public",
    "description": "Amount of pixel used to define a minimum distance between the boundaries and the overlay.\nThis makes sure the overlay always has a little padding between the edges of its container.\n<ul><li><code>5</code> by default.</li></ul>",
    "lineNumber": 352,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "5"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "withinOffset"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1340,
    "kind": "member",
    "name": "collision",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#collision",
    "access": "public",
    "description": "The collision handling strategy when positioning the overlay relative to a target. See {@link OverlayCollisionEnum}.\n<ul><li><code>OverlayCollisionEnum.FLIP</code> by default.</li></ul>",
    "lineNumber": 371,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayCollisionEnum.FLIP"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "collision"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1342,
    "kind": "member",
    "name": "_collision",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_collision",
    "access": "private",
    "description": null,
    "lineNumber": 377,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1343,
    "kind": "member",
    "name": "interaction",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#interaction",
    "access": "public",
    "description": "Whether keyboard interaction is enabled. See {@link OverlayInteractionEnum}.\n<ul><li><code>OverlayInteractionEnum.ON</code> by default.</li></ul>",
    "lineNumber": 392,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "OverlayInteractionEnum.ON"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1345,
    "kind": "member",
    "name": "_interaction",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_interaction",
    "access": "private",
    "description": null,
    "lineNumber": 398,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1346,
    "kind": "member",
    "name": "smart",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#smart",
    "access": "public",
    "description": "Whether the overlay is allowed to change its DOM position for better positioning based on its context.\n<ul><li><code>false</code> by default.</li></ul>",
    "lineNumber": 407,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1348,
    "kind": "member",
    "name": "_smart",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_smart",
    "access": "private",
    "description": null,
    "lineNumber": 412,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1349,
    "kind": "member",
    "name": "open",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#open",
    "access": "public",
    "description": "Inherited from {@link BaseOverlay#open}.",
    "lineNumber": 420,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1351,
    "kind": "method",
    "name": "_toggleSmartBehavior",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_toggleSmartBehavior",
    "access": "private",
    "description": null,
    "lineNumber": 435,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "toggle",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1352,
    "kind": "method",
    "name": "_togglePopperEventListener",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_togglePopperEventListener",
    "access": "private",
    "description": null,
    "lineNumber": 452,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "toggle",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1353,
    "kind": "method",
    "name": "_validateParentOverflow",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_validateParentOverflow",
    "access": "private",
    "description": null,
    "lineNumber": 459,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1354,
    "kind": "member",
    "name": "_ignoreConnectedCallback",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_ignoreConnectedCallback",
    "access": "private",
    "description": null,
    "lineNumber": 480,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 1355,
    "kind": "member",
    "name": "_repositioned",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_repositioned",
    "access": "private",
    "description": null,
    "lineNumber": 481,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 1357,
    "kind": "method",
    "name": "_onUpdate",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_onUpdate",
    "access": "private",
    "description": null,
    "lineNumber": 488,
    "ignore": true,
    "params": [
      {
        "name": "data",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1358,
    "kind": "member",
    "name": "_oldPosition",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_oldPosition",
    "access": "private",
    "description": null,
    "lineNumber": 491,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1361,
    "kind": "method",
    "name": "_handleCloseClick",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_handleCloseClick",
    "access": "private",
    "description": "",
    "lineNumber": 514,
    "todo": [
      "maybe this should be base or something"
    ],
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1362,
    "kind": "method",
    "name": "_handleEscape",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_handleEscape",
    "access": "private",
    "description": "Hides the overlay if it's on the top. When <code>interaction</code> is OFF it is ignored.",
    "lineNumber": 530,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1363,
    "kind": "method",
    "name": "_getTarget",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_getTarget",
    "access": "private",
    "description": null,
    "lineNumber": 537,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "targetValue",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1364,
    "kind": "method",
    "name": "_initPopper",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_initPopper",
    "access": "private",
    "description": null,
    "lineNumber": 541,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "forceReposition",
        "types": [
          "*"
        ]
      },
      {
        "name": "targetElement",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1365,
    "kind": "member",
    "name": "_popper",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#_popper",
    "access": "private",
    "description": null,
    "lineNumber": 544,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1366,
    "kind": "method",
    "name": "reposition",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#reposition",
    "access": "public",
    "description": "Re-position the overlay if it's currently open.",
    "lineNumber": 556,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": ""
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "forceReposition",
        "description": "Whether to force repositioning even if closed."
      }
    ],
    "return": null
  },
  {
    "__docId__": 1367,
    "kind": "method",
    "name": "_getTarget",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay._getTarget",
    "access": "private",
    "description": "Get the element the overlay is anchored to.",
    "lineNumber": 612,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement|null}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": true,
        "name": "el",
        "description": "The reference element."
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement",
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "target",
        "description": "A specific target value to use.\nIf not provided, the current target of the element will be used."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement",
        "null"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 1368,
    "kind": "member",
    "name": "align",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.align",
    "access": "public",
    "description": "",
    "lineNumber": 643,
    "deprecated": "\nReturns {@link Overlay} align options.",
    "return": {
      "nullable": null,
      "types": [
        "OverlayAlignEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1369,
    "kind": "member",
    "name": "collision",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.collision",
    "access": "public",
    "description": "Returns {@link Overlay} collision options.",
    "lineNumber": 652,
    "return": {
      "nullable": null,
      "types": [
        "OverlayCollisionEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1370,
    "kind": "member",
    "name": "target",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.target",
    "access": "public",
    "description": "Returns {@link Overlay} target options.",
    "lineNumber": 661,
    "return": {
      "nullable": null,
      "types": [
        "OverlayTargetEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1371,
    "kind": "member",
    "name": "placement",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.placement",
    "access": "public",
    "description": "Returns {@link Overlay} placement options.",
    "lineNumber": 670,
    "return": {
      "nullable": null,
      "types": [
        "OverlayPlacementEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1372,
    "kind": "member",
    "name": "interaction",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.interaction",
    "access": "public",
    "description": "Returns {@link Overlay} interaction options.",
    "lineNumber": 679,
    "return": {
      "nullable": null,
      "types": [
        "OverlayInteractionEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1373,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 683,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1374,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 694,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1375,
    "kind": "method",
    "name": "connectedCallback",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#connectedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 713,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1377,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay#render",
    "access": "public",
    "description": null,
    "lineNumber": 729,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1378,
    "kind": "typedef",
    "name": "coral-overlay:positioned",
    "memberof": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay",
    "static": true,
    "longname": "coral-spectrum/coral-component-overlay/src/scripts/Overlay.js~ExtensibleOverlay.coral-overlay:positioned",
    "access": "public",
    "description": "Triggered after the {@link Overlay} is positioned.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-overlay:positioned"
    }
  },
  {
    "__docId__": 1379,
    "kind": "file",
    "name": "coral-spectrum/coral-component-panelstack/src/scripts/Panel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Panel';\n\n/**\n @class Coral.Panel\n @classdesc A Panel component\n @htmltag coral-panel\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Panel = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      content: this.querySelector('coral-panel-content') || document.createElement('coral-panel-content')\n    };\n  }\n\n  /**\n   The content of the panel.\n\n   @type {PanelContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-panel-content',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Whether the item is selected. When true, the item will appear as the active element in the PanelStack. The item\n   must be a child of a PanelStack before this property is set to true. This property cannot be programmatically set\n   to false.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    let _selected = transform.booleanAttr(value);\n\n    if(this._selected === _selected) {\n      return;\n    }\n\n    this._selected = _selected;\n    this._reflectAttribute('selected', this._selected);\n\n    this.classList.toggle('is-selected', this._selected);\n    this.setAttribute('aria-hidden', !this.selected);\n\n    this.trigger('coral-panel:_selectedchanged');\n  }\n\n  get _contentZones() {\n    return {'coral-panel-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Adds the role to support accessibility when role is not already defined.\n    if (!this.hasAttribute('role')) {\n      this.setAttribute('role', 'region');\n    }\n\n    // Fetch the content zone elements\n    const content = this._elements.content;\n\n    // Move the content into the content zone if none specified\n    if (!content.parentNode) {\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Assign the content zone so the insert function will be called\n    this.content = content;\n  }\n});\n\nexport default Panel;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-panelstack/src/scripts/Panel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1380,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/Panel.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/Panel.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1381,
    "kind": "variable",
    "name": "Panel",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/Panel.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/Panel.js~Panel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Panel}",
    "description": "A Panel component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Panel"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Panel component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-panel"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-panel></coral-panel>",
      "<caption>JS constructor</caption>\nnew Coral.Panel();"
    ],
    "see": [
      "../examples/#panelstack"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1382,
    "kind": "file",
    "name": "coral-spectrum/coral-component-panelstack/src/scripts/PanelContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Panel.Content\n @classdesc A PanelStack Item Content component\n @htmltag coral-panel-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-panel-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-panelstack/src/scripts/PanelContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1383,
    "kind": "function",
    "name": "PanelContent",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/PanelContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/PanelContent.js~PanelContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Panel}",
    "description": "A PanelStack Item Content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Panel.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A PanelStack Item Content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-panel-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-panel-content></coral-panel-content>",
      "<caption>JS constructor</caption>\nnew Coral.Panel.Content();"
    ],
    "see": [
      "../examples/#panelstack"
    ],
    "params": []
  },
  {
    "__docId__": 1384,
    "kind": "file",
    "name": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-PanelStack';\n\n/**\n @class Coral.PanelStack\n @classdesc A PanelStack component holding a collection of panels. It wraps content, keeping only the selected panel in view.\n @htmltag coral-panelstack\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst PanelStack = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      // private\n      'coral-panel:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-panel',\n        // allows panels to be nested\n        itemSelector: ':scope > coral-panel',\n        onlyHandleChildren: true,\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item of the PanelStack.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n\n    // Last selected item wins if multiple selection while not allowed\n    item = item || selectedItems[selectedItems.length - 1];\n\n    if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-panelstack:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.setAttribute('role', 'presentation');\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /**\n   Triggered when {@link PanelStack} selected panel has changed.\n\n   @typedef {CustomEvent} coral-panelstack:change\n\n   @property {Panel} detail.selection\n   The new selected panel.\n   @property {Panel} detail.oldSelection\n   The prior selected panel.\n   */\n});\n\nexport default PanelStack;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1385,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1386,
    "kind": "variable",
    "name": "PanelStack",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js~PanelStack",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{PanelStack}",
    "description": "A PanelStack component holding a collection of panels. It wraps content, keeping only the selected panel in view.",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.PanelStack"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A PanelStack component holding a collection of panels. It wraps content, keeping only the selected panel in view."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-panelstack"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-panelstack></coral-panelstack>",
      "<caption>JS constructor</caption>\nnew Coral.PanelStack();"
    ],
    "see": [
      "../examples/#panelstack"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1387,
    "kind": "typedef",
    "name": "coral-panelstack:change",
    "memberof": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-panelstack/src/scripts/PanelStack.js~coral-panelstack:change",
    "access": "public",
    "description": "Triggered when {@link PanelStack} selected panel has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Panel"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The new selected panel."
      },
      {
        "nullable": null,
        "types": [
          "Panel"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected panel."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-panelstack:change"
    }
  },
  {
    "__docId__": 1388,
    "kind": "file",
    "name": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ExtensibleOverlay, Overlay} from '../../../coral-component-overlay';\nimport {Icon} from '../../../coral-component-icon';\n// Popover relies on Dialog styles partially\nimport '../../../coral-component-dialog';\nimport base from '../templates/base';\nimport {commons, transform, validate, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Popover';\n\nconst OFFSET = 5;\n\n// Used to map icon with variant\nconst capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);\n\n// If it's empty and has no non-textnode children\nconst _isEmpty = (el) => !el || el.children.length === 0 && el.textContent.replace(/\\s*/g, '') === '';\n\n/**\n Enumeration for {@link Popover} closable state.\n\n @typedef {Object} PopoverClosableEnum\n\n @property {String} ON\n Show a close button on the popover and close the popover when clicked.\n @property {String} OFF\n Do not show a close button. Elements with the <code>coral-close</code> attributes will still close the\n popover.\n */\nconst closable = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link Popover} variants.\n\n @typedef {Object} PopoverVariantEnum\n\n @property {String} DEFAULT\n A default popover without header icon.\n @property {String} ERROR\n A popover with an error header and icon, indicating that an error has occurred.\n @property {String} WARNING\n A popover with a warning header and icon, notifying the user of something important.\n @property {String} SUCCESS\n A popover with a success header and icon, indicates to the user that an operation was successful.\n @property {String} HELP\n A popover with a question header and icon, provides the user with help.\n @property {String} INFO\n A popover with an info header and icon, informs the user of non-critical information.\n */\nconst variant = {\n  DEFAULT: 'default',\n  ERROR: 'error',\n  WARNING: 'warning',\n  SUCCESS: 'success',\n  HELP: 'help',\n  INFO: 'info',\n  _COACHMARK: '_coachmark'\n};\n\n// A string of all possible variant classnames\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  if (variantValue !== 'COACHMARK') {\n    ALL_VARIANT_CLASSES.push(`_coral-Dialog--${variant[variantValue]}`);\n  }\n}\n\n// A string of all possible placement classnames\nconst placement = Overlay.placement;\nconst ALL_PLACEMENT_CLASSES = [];\nfor (const placementKey in placement) {\n  ALL_PLACEMENT_CLASSES.push(`${CLASSNAME}--${placement[placementKey]}`);\n}\n\n/**\n @class Coral.Popover\n @classdesc A Popover component for small overlay content.\n @htmltag coral-popover\n @extends {Overlay}\n */\nconst Popover = Decorator(class extends ExtensibleOverlay {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = commons.extend(this._elements, {\n      // Fetch or create the content zone elements\n      header: this.querySelector('coral-popover-header') || document.createElement('coral-popover-header'),\n      content: this.querySelector('coral-popover-content') || document.createElement('coral-popover-content'),\n      footer: this.querySelector('coral-popover-footer') || document.createElement('coral-popover-footer')\n    });\n    base.call(this._elements, {i18n});\n\n    // Events\n    this._delegateEvents({\n      'global:capture:click': '_handleClick',\n      'coral-overlay:positioned': '_onPositioned',\n      'coral-overlay:_animate': '_onAnimate',\n    });\n\n    // Override defaults from Overlay\n    this._focusOnShow = this.constructor.focusOnShow.ON;\n    this._trapFocus = this.constructor.trapFocus.ON;\n    this._returnFocus = this.constructor.returnFocus.ON;\n    this._overlayAnimationTime = this.constructor.FADETIME;\n    this._lengthOffset = OFFSET;\n\n    // Listen for mutations\n    ['header', 'footer'].forEach((name) => {\n      this[`_${name}Observer`] = new MutationObserver(() => {\n        this._hideContentZoneIfEmpty(name);\n        this._toggleFlyout();\n      });\n\n      // Watch for changes\n      this._observeContentZone(name);\n    });\n  }\n\n  /**\n   The popover's content element.\n\n   @contentzone\n   @name content\n   @type {PopoverContent}\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-popover-content',\n      insert: function (content) {\n        content.classList.add('_coral-Dialog-content');\n        const footer = this.footer;\n        // The content should always be before footer\n        this.insertBefore(content, this.contains(footer) && footer || null);\n      }\n    });\n  }\n\n  /**\n   The popover's header element.\n\n   @contentzone\n   @name header\n   @type {PopoverHeader}\n   */\n  get header() {\n    return this._getContentZone(this._elements.header);\n  }\n\n  set header(value) {\n    this._setContentZone('header', value, {\n      handle: 'header',\n      tagName: 'coral-popover-header',\n      insert: function (header) {\n        header.classList.add('_coral-Dialog-title');\n        this._elements.headerWrapper.insertBefore(header, this._elements.headerWrapper.firstChild);\n      },\n      set: function () {\n        // Stop observing the old header and observe the new one\n        this._observeContentZone('header');\n\n        // Check if header needs to be hidden\n        this._hideContentZoneIfEmpty('header');\n      }\n    });\n  }\n\n  /**\n   The popover's footer element.\n\n   @type {PopoverFooter}\n   @contentzone\n   */\n  get footer() {\n    return this._getContentZone(this._elements.footer);\n  }\n\n  set footer(value) {\n    this._setContentZone('footer', value, {\n      handle: 'footer',\n      tagName: 'coral-popover-footer',\n      insert: function (footer) {\n        footer.classList.add('_coral-Dialog-footer');\n        // The footer should always be after content\n        this.appendChild(footer);\n      },\n      set: function () {\n        // Stop observing the old header and observe the new one\n        this._observeContentZone('footer');\n\n        // Check if header needs to be hidden\n        this._hideContentZoneIfEmpty('footer');\n      }\n    });\n  }\n\n  /**\n   The popover's variant. See {@link PopoverVariantEnum}.\n\n   @type {String}\n   @default PopoverVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    // Insert SVG icon\n    this._insertTypeIcon();\n\n    // Remove all variant classes\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    // Toggle dialog mode\n    this._toggleFlyout();\n\n    if (this._variant === variant._COACHMARK) {\n      // ARIA\n      this.setAttribute('role', 'dialog');\n\n      this._toggleCoachMark(true);\n    } else {\n      this._toggleCoachMark(false);\n\n      if (this._variant === variant.DEFAULT) {\n        // ARIA\n        if (!this.hasAttribute('role')) {\n          this.setAttribute('role', 'dialog');\n        }\n      } else {\n        // Set new variant class\n        this.classList.add(`_coral-Dialog--${this._variant}`);\n\n        // ARIA\n        this.setAttribute('role', 'alertdialog');\n      }\n    }\n  }\n\n  /**\n   Whether the popover should have a close button. See {@link PopoverClosableEnum}.\n\n   @type {String}\n   @default PopoverClosableEnum.OFF\n   @htmlattribute closable\n   @htmlattributereflected\n   */\n  get closable() {\n    return this._closable || closable.OFF;\n  }\n\n  set closable(value) {\n    value = transform.string(value).toLowerCase();\n    this._closable = validate.enumeration(closable)(value) && value || closable.OFF;\n    this._reflectAttribute('closable', this._closable);\n\n    this._elements.closeButton.style.display = this._closable === closable.ON ? 'block' : 'none';\n  }\n\n  /**\n   Inherited from {@link Overlay#target}.\n   */\n  get target() {\n    return super.target;\n  }\n\n  set target(value) {\n    // avoid popper initialization while connecting for first time and not opened.\n    this._avoidPopperInit = this.open || this._popper ? false : true;\n\n    super.target = value;\n\n    // Coach Mark specific\n    const target = this._getTarget();\n    if (target && target.tagName === 'CORAL-COACHMARK') {\n      this.setAttribute('variant', variant._COACHMARK);\n    }\n\n    this._setAriaExpandedOnTarget();\n\n    delete this._avoidPopperInit;\n  }\n\n  /**\n   Inherited from {@link Overlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    super.open = value;\n\n    const target = this._getTarget();\n    if (target) {\n      const is = target.getAttribute('is');\n      if (is === 'coral-button' || is === 'coral-anchorbutton') {\n        target.classList.toggle('is-selected', this.open);\n      }\n\n      this._setAriaExpandedOnTarget();\n\n      if (this._popper) {\n        setTimeout(() => {\n          if (this.open) {\n            this.reposition(true); // GRANITE-62346 required for safari to render dropdown correctly\n            this._popper.scheduleUpdate();\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   @ignore\n\n   Not supported anymore.\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    this._icon = transform.string(value);\n  }\n\n  _setAriaExpandedOnTarget() {\n    const target = this._getTarget();\n    if (target) {\n      const hasPopupAttribute = target.hasAttribute('aria-haspopup');\n      if (hasPopupAttribute || target.querySelector('[aria-haspopup]') !== null) {\n        const targetElements = hasPopupAttribute ? [target] : target.querySelectorAll('[aria-haspopup]');\n        targetElements.forEach((targetElement) => targetElement.setAttribute('aria-expanded', this.open));\n      }\n    }\n  }\n\n  _onPositioned(event) {\n    if (this.open) {\n      // Set arrow placement\n      this.classList.remove(...ALL_PLACEMENT_CLASSES);\n      this.classList.add(`${CLASSNAME}--${event.detail.placement}`);\n    }\n  }\n\n  _onAnimate() {\n    // popper attribute\n    const popperPlacement = this.getAttribute('x-placement');\n\n    // popper takes care of setting left, top to 0 on positioning\n    if (popperPlacement === 'left') {\n      this.style.left = '8px';\n    } else if (popperPlacement === 'top') {\n      this.style.top = '8px';\n    } else if (popperPlacement === 'right') {\n      this.style.left = '-8px';\n    } else if (popperPlacement === 'bottom') {\n      this.style.top = '-8px';\n    }\n  }\n\n  _insertTypeIcon() {\n    if (this._elements.icon) {\n      this._elements.icon.remove();\n    }\n\n    let variantValue = this.variant;\n\n    // Warning icon is same as ERROR icon\n    if (variantValue === variant.WARNING || variantValue === variant.ERROR) {\n      variantValue = 'alert';\n    }\n\n    // Inject the SVG icon\n    if (variantValue !== variant.DEFAULT && variantValue !== variant._COACHMARK) {\n      const iconName = capitalize(variantValue);\n      this._elements.headerWrapper.insertAdjacentHTML('beforeend', Icon._renderSVG(`spectrum-css-icon-${iconName}Medium`, ['_coral-Dialog-typeIcon', `_coral-UIIcon-${iconName}Medium`]));\n      this._elements.icon = this.querySelector('._coral-Dialog-typeIcon');\n    }\n  }\n\n  _observeContentZone(name) {\n    const observer = this[`_${name}Observer`];\n    if (observer) {\n      observer.disconnect();\n      observer.observe(this._elements[name], {\n        // Catch changes to childList\n        childList: true,\n        // Catch changes to textContent\n        characterData: true,\n        // Monitor any child node\n        subtree: true\n      });\n    }\n  }\n\n  _hideContentZoneIfEmpty(name) {\n    const contentZone = this._elements[name];\n    const target = name === 'header' ? this._elements.headerWrapper : contentZone;\n\n    // If it's empty and has no non-textnode children, hide the header\n    const hiddenValue = _isEmpty(contentZone);\n\n    // Only bother if the hidden status has changed\n    if (hiddenValue !== target.hidden) {\n      target.hidden = hiddenValue;\n\n      // Reposition as the height has changed\n      this.reposition();\n    }\n  }\n\n  _toggleCoachMark(isCoachMark) {\n    this.classList.toggle('_coral-CoachMarkPopover', isCoachMark);\n    this._elements.headerWrapper.classList.toggle('_coral-Dialog-header', !isCoachMark);\n    this._elements.headerWrapper.classList.toggle('_coral-CoachMarkPopover-header', isCoachMark);\n\n    ['header', 'content', 'footer'].forEach((contentZone, i) => {\n      const el = this[contentZone];\n      const type = i === 0 ? 'title' : contentZone;\n\n      if (el) {\n        el.classList.toggle(`_coral-Dialog-${type}`, !isCoachMark);\n        el.classList.toggle(`_coral-CoachMarkPopover-${type}`, isCoachMark);\n      }\n    });\n  }\n\n  _toggleFlyout() {\n    // Flyout mode is when there's only content in default variant\n    const isFlyout = this._variant === variant._COACHMARK ||\n      this._variant === variant.DEFAULT && _isEmpty(this.header) && _isEmpty(this.footer);\n\n    this.classList.toggle(`${CLASSNAME}--dialog`, !isFlyout);\n    this._elements.tip.hidden = isFlyout;\n  }\n\n  /** @private */\n  _handleClick(event) {\n    if (this.interaction === this.constructor.interaction.OFF) {\n      // Since we use delegation, just ignore clicks if interaction is off\n      return;\n    }\n\n    const eventTarget = event.target;\n    const targetEl = this._getTarget();\n\n    const eventIsWithinTarget = targetEl ? targetEl.contains(eventTarget) : false;\n\n    if (eventIsWithinTarget) {\n      // When target is clicked\n\n      if (!this.open && !targetEl.disabled) {\n        // Open if we're not already open and target element is not disabled\n        this.show();\n\n        this._trackEvent('display', 'coral-popover', event);\n      } else {\n        this.hide();\n\n        this._trackEvent('close', 'coral-popover', event);\n      }\n    } else if (this.open && !this.contains(eventTarget)) {\n      const target = eventTarget.closest('._coral-Overlay');\n      // Also check if the click element is inside an overlay which target could be inside of this popover\n      if (target && this.contains(target._getTarget())) {\n        return;\n      }\n\n      // Close if we're open and the click was outside of the target and outside of the popover\n      this.hide();\n\n      this._trackEvent('close', 'coral-popover', event);\n    }\n  }\n\n  get _contentZones() {\n    return {\n      'coral-popover-header': 'header',\n      'coral-popover-content': 'content',\n      'coral-popover-footer': 'footer'\n    };\n  }\n\n  /**\n   Returns {@link Popover} variants.\n\n   @return {PopoverVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link Popover} close options.\n\n   @return {PopoverClosableEnum}\n   */\n  static get closable() {\n    return closable;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'closable',\n      'variant'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // ARIA\n    if (!this.hasAttribute('role')) {\n      this.setAttribute('role', 'dialog');\n    }\n\n    if (!this.hasAttribute('aria-live')) {\n      // This helped announcements in certain screen readers\n      this.setAttribute('aria-live', 'assertive');\n    }\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n    if (!this._closable) {\n      this.closable = closable.OFF;\n    }\n\n    // // Fetch the content zones\n    const header = this._elements.header;\n    const content = this._elements.content;\n    const footer = this._elements.footer;\n\n    // Verify if a content zone is provided\n    const contentZoneProvided = this.contains(content) && content || this.contains(footer) && footer || this.contains(header) && header;\n\n    // Remove content zones so we can process children\n    if (header.parentNode) {\n      header.remove();\n    }\n    if (content.parentNode) {\n      content.remove();\n    }\n    if (footer.parentNode) {\n      footer.remove();\n    }\n\n    // Remove tab captures\n    Array.prototype.filter.call(this.children, (child) => child.hasAttribute('coral-tabcapture')).forEach((tabCapture) => {\n      this.removeChild(tabCapture);\n    });\n\n    // Support cloneNode\n    const template = this.querySelectorAll('._coral-Dialog-header, ._coral-Dialog-closeButton, ._coral-Popover-tip');\n    for (let i = 0 ; i < template.length ; i++) {\n      template[i].remove();\n    }\n\n    // Move everything in the content\n    if (!contentZoneProvided) {\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Insert template\n    const frag = document.createDocumentFragment();\n    frag.appendChild(this._elements.headerWrapper);\n    frag.appendChild(this._elements.closeButton);\n    frag.appendChild(this._elements.tip);\n    this.appendChild(frag);\n\n    // Assign content zones\n    this.header = header;\n    this.content = content;\n    this.footer = footer;\n  }\n});\n\nexport default Popover;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1389,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1390,
    "kind": "variable",
    "name": "OFFSET",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~OFFSET",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 23,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1391,
    "kind": "function",
    "name": "capitalize",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~capitalize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 26,
    "undocument": true,
    "params": [
      {
        "name": "s",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1392,
    "kind": "function",
    "name": "_isEmpty",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~_isEmpty",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1393,
    "kind": "typedef",
    "name": "PopoverClosableEnum",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~PopoverClosableEnum",
    "access": "public",
    "description": "Enumeration for {@link Popover} closable state.",
    "lineNumber": 42,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Show a close button on the popover and close the popover when clicked."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Do not show a close button. Elements with the <code>coral-close</code> attributes will still close the\npopover."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "PopoverClosableEnum"
    }
  },
  {
    "__docId__": 1394,
    "kind": "typedef",
    "name": "PopoverVariantEnum",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~PopoverVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Popover} variants.",
    "lineNumber": 65,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default popover without header icon."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A popover with an error header and icon, indicating that an error has occurred."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "A popover with a warning header and icon, notifying the user of something important."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "A popover with a success header and icon, indicates to the user that an operation was successful."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HELP",
        "description": "A popover with a question header and icon, provides the user with help."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "A popover with an info header and icon, informs the user of non-critical information."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "PopoverVariantEnum"
    }
  },
  {
    "__docId__": 1395,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 76,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1396,
    "kind": "variable",
    "name": "placement",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~placement",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 84,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1397,
    "kind": "variable",
    "name": "ALL_PLACEMENT_CLASSES",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~ALL_PLACEMENT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 85,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1398,
    "kind": "variable",
    "name": "Popover",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/Popover.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/Popover.js~Popover",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Popover}",
    "description": "A Popover component for small overlay content.",
    "lineNumber": 96,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Popover"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Popover component for small overlay content."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-popover"
      },
      {
        "tagName": "@extends",
        "tagValue": "{Overlay}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-popover></coral-popover>",
      "<caption>JS constructor</caption>\nnew Coral.Popover();"
    ],
    "see": [
      "../examples/#popover"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1399,
    "kind": "file",
    "name": "coral-spectrum/coral-component-popover/src/scripts/PopoverContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Popover.Content\n @classdesc The Popover default content\n @htmltag coral-popover-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-popover-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-popover/src/scripts/PopoverContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1400,
    "kind": "function",
    "name": "PopoverContent",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/PopoverContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/PopoverContent.js~PopoverContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Popover}",
    "description": "The Popover default content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Popover.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Popover default content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-popover-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-popover-content></coral-popover-content>",
      "<caption>JS constructor</caption>\nnew Coral.Popover.Content();"
    ],
    "see": [
      "../examples/#popover"
    ],
    "params": []
  },
  {
    "__docId__": 1401,
    "kind": "file",
    "name": "coral-spectrum/coral-component-popover/src/scripts/PopoverFooter.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Popover.Footer\n @classdesc The Popover footer content\n @htmltag coral-popover-footer\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-popover-footer');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-popover/src/scripts/PopoverFooter.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1402,
    "kind": "function",
    "name": "PopoverFooter",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/PopoverFooter.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/PopoverFooter.js~PopoverFooter",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Popover}",
    "description": "The Popover footer content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Popover.Footer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Popover footer content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-popover-footer"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-popover-footer></coral-popover-footer>",
      "<caption>JS constructor</caption>\nnew Coral.Popover.Footer();"
    ],
    "see": [
      "../examples/#popover"
    ],
    "params": []
  },
  {
    "__docId__": 1403,
    "kind": "file",
    "name": "coral-spectrum/coral-component-popover/src/scripts/PopoverHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Popover.Header\n @classdesc The Popover header content\n @htmltag coral-popover-header\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-popover-header');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-popover/src/scripts/PopoverHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1404,
    "kind": "function",
    "name": "PopoverHeader",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/PopoverHeader.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/PopoverHeader.js~PopoverHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Popover}",
    "description": "The Popover header content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Popover.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Popover header content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-popover-header"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-popover-header></coral-popover-header>",
      "<caption>JS constructor</caption>\nnew Coral.Popover.Header();"
    ],
    "see": [
      "../examples/#popover"
    ],
    "params": []
  },
  {
    "__docId__": 1405,
    "kind": "file",
    "name": "coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAMES = ['coral-Rule', 'coral-Rule--subsection2'];\n\n/**\n @class Coral.Popover.Separator\n @classdesc The Popover separator\n @htmltag coral-popover-separator\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst PopoverSeparator = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n    this.classList.add(...CLASSNAMES);\n  }\n});\n\nexport default PopoverSeparator;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1406,
    "kind": "variable",
    "name": "CLASSNAMES",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js~CLASSNAMES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1407,
    "kind": "variable",
    "name": "PopoverSeparator",
    "memberof": "coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-popover/src/scripts/PopoverSeparator.js~PopoverSeparator",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Popover}",
    "description": "The Popover separator",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Popover.Separator"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Popover separator"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-popover-separator"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-popover-separator></coral-popover-separator>",
      "<caption>JS constructor</caption>\nnew Coral.Popover.Separator();"
    ],
    "see": [
      "../examples/#popover"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1408,
    "kind": "file",
    "name": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport base from '../templates/base';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Progress} sizes.\n\n @typedef {Object} ProgressSizeEnum\n\n @property {String} SMALL\n A small progress bar.\n @property {String} MEDIUM\n A default medium progress bar.\n @property {String} LARGE\n Not supported. Falls back to MEDIUM.\n */\nconst size = {\n  SMALL: 'S',\n  MEDIUM: 'M',\n  LARGE: 'L'\n};\n\n/**\n Enumeration for {@link Progress} label positions.\n\n @typedef {Object} ProgressLabelPositionEnum\n\n @property {String} LEFT\n Show the label to the left of the bar.\n @property {String} SIDE\n Show the label to the side of the bar.\n @property {String} RIGHT\n Not supported. Falls back to LEFT.\n @property {String} BOTTOM\n Not supported. Falls back to LEFT.\n */\nconst labelPosition = {\n  LEFT: 'left',\n  RIGHT: 'right',\n  SIDE: 'side',\n  BOTTOM: 'bottom'\n};\n\n// Base classname\nconst CLASSNAME = '_coral-BarLoader';\n\n/**\n @class Coral.Progress\n @classdesc A Progress component to indicate progress of processes.\n @htmltag coral-progress\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Progress = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content content zone element\n      label: this.querySelector('coral-progress-label') || document.createElement('coral-progress-label')\n    };\n    base.call(this._elements);\n\n    // Watch for label changes\n    this._observer = new MutationObserver(this._toggleLabelVisibility.bind(this));\n    this._observer.observe(this._elements.label, {\n      characterData: true,\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The current progress in percent.\n\n   @type {Number}\n   @default 0\n   @emits {coral-progress:change}\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return this.indeterminate ? 0 : this._value || 0;\n  }\n\n  set value(value) {\n    value = transform.number(value) || 0;\n\n    // Stay within bounds\n    if (value > 100) {\n      value = 100;\n    } else if (value < 0) {\n      value = 0;\n    }\n\n    this._value = value;\n    this._reflectAttribute('value', this._value);\n\n    if (!this.indeterminate) {\n      this._elements.status.style.width = `${this.value}%`;\n\n      // ARIA: Reflect value for screenreaders\n      this.setAttribute('aria-valuenow', this._value);\n\n      if (this.showPercent) {\n        // Only update label text in percent mode\n        this._setPercentage(`${this._value}%`);\n      }\n    } else {\n      this._elements.status.style.width = '';\n    }\n\n    this.trigger('coral-progress:change');\n  }\n\n  /**\n   Whether to hide the current value and show an animation. Set to true for operations whose progress cannot be\n   determined.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute indeterminate\n   @htmlattributereflected\n   */\n  get indeterminate() {\n    return this._indeterminate || false;\n  }\n\n  set indeterminate(value) {\n    this._indeterminate = transform.booleanAttr(value);\n    this._reflectAttribute('indeterminate', this._indeterminate);\n\n    if (this._indeterminate) {\n      this.classList.add(`${CLASSNAME}--indeterminate`);\n\n      // ARIA: Remove attributes\n      this.removeAttribute('aria-valuenow');\n      this.removeAttribute('aria-valuemin');\n      this.removeAttribute('aria-valuemax');\n\n      this.value = 0;\n    } else {\n      this.classList.remove(`${CLASSNAME}--indeterminate`);\n\n      // ARIA: Add attributes\n      this.setAttribute('aria-valuemin', '0');\n      this.setAttribute('aria-valuemax', '100');\n\n      this.value = this._oldValue;\n    }\n  }\n\n  /**\n   The vertical and text size of this progress bar. To adjust the width, simply set the CSS width property.\n   See {@link ProgressSizeEnum}.\n\n   @type {String}\n   @default ProgressSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected size\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    this._reflectAttribute('size', this._size);\n\n    this.classList.toggle(`${CLASSNAME}--small`, this._size === size.SMALL);\n  }\n\n  /**\n   Boolean attribute to toggle showing progress percent as the label content.\n   Default is true.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute showpercent\n   */\n  get showPercent() {\n    return this._showPercent || false;\n  }\n\n  set showPercent(value) {\n    this._showPercent = transform.booleanAttr(value);\n    this._reflectAttribute('showpercent', this._showPercent);\n\n    if (this._showPercent) {\n      const content = this.indeterminate ? '' : `${this.value}%`;\n      this._setPercentage(content);\n    }\n\n    this._toggleLabelVisibility();\n  }\n\n  /**\n   Used to access to the {@link Coral.Progress.Label} element. Keep in mind that the width of a custom label is\n   limited for {@link Coral.Progress.labelPosition.LEFT} and {@link Coral.Progress.labelPosition.RIGHT}.\n\n   @type {ProgressLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-progress-label',\n      insert: function (label) {\n        label.classList.add(`${CLASSNAME}-label`);\n        this.appendChild(label);\n      }\n    });\n  }\n\n  /**\n   Label position. See {@link ProgressLabelPositionEnum}.\n\n   @type {String}\n   @default ProgressLabelPositionEnum.LEFT\n   @htmlattribute labelposition\n   @htmlattributereflected\n   */\n  get labelPosition() {\n    return this._labelPosition || labelPosition.LEFT;\n  }\n\n  set labelPosition(value) {\n    value = transform.string(value).toLowerCase();\n    this._labelPosition = validate.enumeration(labelPosition)(value) && value || labelPosition.LEFT;\n    this._reflectAttribute('labelposition', this._labelPosition);\n\n    this.classList.toggle('_coral-BarLoader--sideLabel', this._labelPosition === labelPosition.SIDE);\n\n    const elements = this.labelPosition === labelPosition.SIDE ? ['label', 'bar', 'percentage'] : ['label', 'percentage', 'bar'];\n    // @spectrum should be supported with classes\n    elements.forEach((el, i) => {\n      this._elements[el].style.order = i;\n    });\n\n    this._toggleLabelVisibility();\n  }\n\n  /** @ignore */\n  _toggleLabelVisibility() {\n    const percentage = this._elements.percentage;\n    const label = this._elements.label;\n    const isSidePositioned = this.labelPosition === labelPosition.SIDE;\n\n    // Handle percentage\n    if (this.showPercent) {\n      percentage.style.visibility = 'visible';\n      percentage.setAttribute('aria-hidden', 'false');\n\n      if (isSidePositioned) {\n        percentage.hidden = false;\n      }\n    } else {\n      percentage.style.visibility = 'hidden';\n      percentage.setAttribute('aria-hidden', 'true');\n\n      if (isSidePositioned) {\n        percentage.hidden = true;\n      }\n    }\n\n    // Handle label\n    if (label.textContent.length > 0) {\n      label.style.visibility = 'visible';\n      label.setAttribute('aria-hidden', 'false');\n\n      if (isSidePositioned) {\n        label.hidden = false;\n      }\n\n      if (!this.showPercent) {\n        // Update the value for accessibility as it was cleared when the label was hidden\n        this.setAttribute('aria-valuetext', label.textContent);\n      }\n    } else {\n      label.style.visibility = 'hidden';\n      label.setAttribute('aria-hidden', 'true');\n\n      if (isSidePositioned) {\n        label.hidden = true;\n      }\n\n      // Remove the value for accessibility so the screenreader knows we're unlabelled\n      this.removeAttribute('aria-valuetext');\n    }\n  }\n\n  /** @ignore */\n  _setPercentage(content) {\n    this._elements.percentage.textContent = content;\n\n    // ARIA\n    this[this.showPercent ? 'removeAttribute' : 'setAttribute']('aria-valuetext', content);\n  }\n\n  get _contentZones() {\n    return {'coral-progress-label': 'label'};\n  }\n\n  /**\n   Returns {@link Progress} label position options.\n\n   @return {ProgressLabelPositionEnum}\n   */\n  static get labelPosition() {\n    return labelPosition;\n  }\n\n  /**\n   Returns {@link Progress} sizes.\n\n   @return {ProgressSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      showpercent: 'showPercent',\n      labelposition: 'labelPosition'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'value',\n      'indeterminate',\n      'size',\n      'showpercent',\n      'labelposition'\n    ]);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === 'indeterminate' && transform.booleanAttr(value)) {\n      // Remember current value in case indeterminate is toggled\n      this._oldValue = this._value || 0;\n    }\n\n    super.attributeChangedCallback(name, oldValue, value);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._value) {\n      this.value = this.value;\n    }\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n    if (!this._labelPosition) {\n      this.labelPosition = labelPosition.LEFT;\n    }\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    const templateHandleNames = ['bar', 'percentage'];\n\n    // Render the template\n    fragment.appendChild(this._elements.percentage);\n    fragment.appendChild(this._elements.bar);\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      label.parentNode.removeChild(label);\n    }\n\n    // Move any remaining elements into the content sub-component\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        label.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Assign the content zone\n    this.label = label;\n\n    // Toggle label based on content\n    this._toggleLabelVisibility();\n\n    // ARIA\n    this.setAttribute('role', 'progressbar');\n    this.setAttribute('aria-valuenow', '0');\n    this.setAttribute('aria-valuemin', '0');\n    this.setAttribute('aria-valuemax', '100');\n  }\n\n  /**\n   Triggered when the {@link Progress} value is changed.\n\n   @typedef {CustomEvent} coral-progress:change\n   */\n});\n\nexport default Progress;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1409,
    "kind": "typedef",
    "name": "ProgressSizeEnum",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/Progress.js~ProgressSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Progress} sizes.",
    "lineNumber": 30,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small progress bar."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A default medium progress bar."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "Not supported. Falls back to MEDIUM."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ProgressSizeEnum"
    }
  },
  {
    "__docId__": 1410,
    "kind": "typedef",
    "name": "ProgressLabelPositionEnum",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/Progress.js~ProgressLabelPositionEnum",
    "access": "public",
    "description": "Enumeration for {@link Progress} label positions.",
    "lineNumber": 50,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT",
        "description": "Show the label to the left of the bar."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SIDE",
        "description": "Show the label to the side of the bar."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT",
        "description": "Not supported. Falls back to LEFT."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BOTTOM",
        "description": "Not supported. Falls back to LEFT."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ProgressLabelPositionEnum"
    }
  },
  {
    "__docId__": 1411,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/Progress.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 58,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1412,
    "kind": "variable",
    "name": "Progress",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/Progress.js~Progress",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Progress}",
    "description": "A Progress component to indicate progress of processes.",
    "lineNumber": 67,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Progress"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Progress component to indicate progress of processes."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-progress"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-progress></coral-progress>",
      "<caption>JS constructor</caption>\nnew Coral.Progress();"
    ],
    "see": [
      "../examples/#progress"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1413,
    "kind": "typedef",
    "name": "coral-progress:change",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/Progress.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/Progress.js~coral-progress:change",
    "access": "public",
    "description": "Triggered when the {@link Progress} value is changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-progress:change"
    }
  },
  {
    "__docId__": 1414,
    "kind": "file",
    "name": "coral-spectrum/coral-component-progress/src/scripts/ProgressLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Progress.Label\n @classdesc The Progress label content\n @htmltag coral-progress-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-progress-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-progress/src/scripts/ProgressLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1415,
    "kind": "function",
    "name": "ProgressLabel",
    "memberof": "coral-spectrum/coral-component-progress/src/scripts/ProgressLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-progress/src/scripts/ProgressLabel.js~ProgressLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Progress}",
    "description": "The Progress label content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Progress.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Progress label content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-progress-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-progress-label></coral-progress-label>",
      "<caption>JS constructor</caption>\nnew Coral.Progress.Label();"
    ],
    "see": [
      "../examples/#progress"
    ],
    "params": []
  },
  {
    "__docId__": 1416,
    "kind": "file",
    "name": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Icon} from '../../../coral-component-icon';\nimport {Button} from '../../../coral-component-button';\nimport {AnchorButton} from '../../../coral-component-anchorbutton';\nimport {ButtonList, AnchorList} from '../../../coral-component-list';\nimport {ExtensibleOverlay, Overlay} from '../../../coral-component-overlay';\nimport {Collection} from '../../../coral-collection';\nimport QuickActionsItem from './QuickActionsItem';\nimport '../../../coral-component-popover';\nimport base from '../templates/base';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst BUTTON_FOCUSABLE_SELECTOR = '._coral-QuickActions-item:not([disabled]):not([hidden])';\n\n/**\n Enumeration for {@link QuickActions} interaction options.\n\n @typedef {Object} QuickActionsInteractionEnum\n\n @property {String} ON\n Show when the target is hovered or focused and hide when the mouse is moved out or focus is lost.\n @property {String} OFF\n Do not show or hide automatically.\n */\nconst interaction = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link QuickActions} anchored overlay target options.\n\n @typedef {Object} QuickActionsTargetEnum\n\n @property {String} PARENT\n Use the parent element in the DOM.\n @property {String} PREVIOUS\n Use the previous sibling element in the DOM.\n @property {String} NEXT\n Use the next sibling element in the DOM.\n */\nconst target = {\n  PARENT: '_parent',\n  PREVIOUS: '_prev',\n  NEXT: '_next'\n};\n\n/**\n Enumeration for {@link QuickActions} placement options.\n\n @typedef {Object} QuickActionsPlacementEnum\n\n @property {String} TOP\n QuickActions inset to the top of the target.\n @property {String} CENTER\n QuickActions inset to the center of the target.\n @property {String} BOTTOM\n QuickActions inset to the bottom the target.\n */\nconst placement = {\n  TOP: 'top',\n  CENTER: 'center',\n  BOTTOM: 'bottom'\n};\n\nconst OFFSET = 10;\n\nconst CLASSNAME = '_coral-QuickActions';\n\n/**\n @class Coral.QuickActions\n @classdesc A QuickActions component is an overlay component that reveals actions when interacting with a container.\n Hovering the target will display the QuickActions. They can also be launched by pressing the shift + F10 key combination\n when the target is focused.\n @htmltag coral-quickactions\n @extends {Overlay}\n */\nconst QuickActions = Decorator(class extends ExtensibleOverlay {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Override defaults\n    this._overlayAnimationTime = Overlay.FADETIME;\n    this._alignMy = Overlay.align.CENTER_TOP;\n    this._alignAt = Overlay.align.CENTER_TOP;\n    this._lengthOffset = OFFSET;\n    this._inner = true;\n    this._target = target.PREVIOUS;\n    this._placement = placement.TOP;\n    this._focusOnShow = Overlay.focusOnShow.OFF;\n    this._scrollOnFocus = Overlay.scrollOnFocus.OFF;\n\n    if (!this.id) {\n      this.id = commons.getUID();\n    }\n\n    // Flag\n    this._openedBefore = false;\n\n    // Debounce timer\n    this._timeout = null;\n\n    // Template\n    base.call(this._elements, {commons, i18n});\n\n    const events = {\n      'global:resize': '_onWindowResize',\n      'mouseout': '_onMouseOut',\n\n      // Keyboard interaction\n      'key:home': '_onHomeKeypress',\n      'key:end': '_onEndKeypress',\n      'key:pagedown': '_onButtonKeypressNext',\n      'key:right': '_onButtonKeypressNext',\n      'key:down': '_onButtonKeypressNext',\n      'key:pageup': '_onButtonKeypressPrevious',\n      'key:left': '_onButtonKeypressPrevious',\n      'key:up': '_onButtonKeypressPrevious',\n\n      'capture:focus': '_onFocus',\n      'capture:blur': '_onBlur',\n\n      // Buttons\n      'click > ._coral-QuickActions-item:not([handle=\"moreButton\"])': '_onButtonClick',\n      'click > ._coral-QuickActions-item[handle=\"moreButton\"]': '_onMoreButtonClick',\n\n      //Messenger\n      'coral-quickactions-item:_messengerconnected': '_onMessengerConnected'\n    };\n\n    const overlayId = this._elements.overlay.id;\n\n    // Overlay\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_onOverlayBeforeOpen';\n    events[`global:capture:coral-overlay:beforeclose #${overlayId}`] = '_onOverlayBeforeClose';\n    events[`global:capture:coral-overlay:open #${overlayId}`] = '_onOverlayOpen';\n    events['global:capture:coral-overlay:close'] = '_onOverlayClose';\n    events[`global:capture:coral-overlay:positioned #${overlayId}`] = '_onOverlayPositioned';\n    events[`global:capture:coral-overlay:_animate #${overlayId}`] = '_onAnimate';\n    events[`global:capture:mouseout #${overlayId}`] = '_onMouseOut';\n    events[`global:capture:click #${overlayId} [coral-list-item]`] = '_onButtonListItemClick';\n\n    // Cache bound event handler functions\n    this._onTargetMouseEnter = this._onTargetMouseEnter.bind(this);\n    this._onTargetKeyUp = this._onTargetKeyUp.bind(this);\n    this._onTargetMouseLeave = this._onTargetMouseLeave.bind(this);\n\n    // Events\n    this._delegateEvents(events);\n\n    // delegates the item handling to the collection\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The Item collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // we do lazy initialization of the collection\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-quickactions-item',\n        onItemRemoved: this._onItemRemoved,\n        onCollectionChange: this._onCollectionChange\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   The number of items that are visible in QuickActions (excluding the show more actions button) before a collapse\n   is enforced. A value <= 0 disables this feature and shows as many items as possible. Regardless of this\n   property, the QuickActions will still fit within their target's width.\n\n   @type {Number}\n   @default 4\n   @htmlattribute threshold\n   @htmlattributereflected\n   */\n  get threshold() {\n    return typeof this._threshold === 'number' ? this._threshold : 4;\n  }\n\n  set threshold(value) {\n    this._threshold = transform.number(value);\n    this._reflectAttribute('threshold', this._threshold);\n  }\n\n  /**\n   The placement of the QuickActions. The value may be one of 'top', 'center' and 'bottom' and indicates the vertical\n   alignment of the QuickActions relative to their container.\n   See {@link OverlayPlacementEnum}.\n\n   @type {String}\n   @default OverlayPlacementEnum.TOP\n   @htmlattribute placement\n   */\n  get placement() {\n    return super.placement;\n  }\n\n  set placement(value) {\n    value = transform.string(value).toLowerCase();\n    this._placement = validate.enumeration(placement)(value) && value || placement.TOP;\n\n    this.reposition();\n  }\n\n  /**\n   Whether the QuickActions should show when the target is interacted with. See {@link QuickActionsInteractionEnum}.\n\n   @type {String}\n   @default QuickActionsInteractionEnum.ON\n   @name interaction\n   @htmlattribute interaction\n   */\n  get interaction() {\n    return super.interaction;\n  }\n\n  set interaction(value) {\n    super.interaction = value;\n\n    if (this.interaction === interaction.ON) {\n      this._addTargetEventListeners();\n    } else {\n      this._removeTargetEventListeners();\n    }\n  }\n\n  /**\n   Inherited from {@link Overlay#target}.\n   */\n  get target() {\n    return super.target;\n  }\n\n  set target(value) {\n    // avoid popper initialization while connecting for first time and not opened.\n    this._avoidPopperInit = this.open || this._popper ? false : true;\n\n    super.target = value;\n\n    const targetElement = this._getTarget(value);\n    const prevTargetElement = this._previousTarget;\n    const targetHasChanged = targetElement !== prevTargetElement;\n\n    if (targetElement && targetHasChanged) {\n      // Remove listeners from the previous target\n      if (prevTargetElement) {\n        const previousTarget = this._getTarget(prevTargetElement);\n        if (previousTarget) {\n          this._removeTargetEventListeners(previousTarget);\n          targetElement.removeAttribute('aria-haspopup');\n          targetElement.removeAttribute('aria-owns');\n        }\n      }\n\n      // Set up listeners for the new target\n      this._addTargetEventListeners();\n\n      let ariaOwns = targetElement.getAttribute('aria-owns');\n      ariaOwns = ariaOwns && ariaOwns.length ? `${ariaOwns.trim()}  ${this.id}` : this.id;\n\n      targetElement.setAttribute('aria-owns', ariaOwns);\n      // Mark the target as owning a popup\n      targetElement.setAttribute('aria-haspopup', 'true');\n\n      // Cache for use as previous target\n      this._previousTarget = targetElement;\n    }\n    delete this._avoidPopperInit;\n  }\n\n  get observedMessages() {\n    return {\n      'coral-quickactions-item:_contentchanged': '_onItemChange',\n      'coral-quickactions-item:_iconchanged': '_onItemChange',\n      'coral-quickactions-item:_hrefchanged': '_onItemChange',\n      'coral-quickactions-item:_typechanged': '_onItemTypeChange'\n    };\n  }\n  /**\n   Inherited from {@link Overlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    // If opening and stealing focus, on close, focus should be returned\n    // to the element that had focus before QuickActions were opened.\n    if (value &&\n      this._focusOnShow !== this.constructor.focusOnShow.OFF) {\n      this.returnFocusTo(document.activeElement);\n    }\n\n    super.open = value;\n\n    this._openedOnce = true;\n\n    // Position once we can read items layout in the next frame\n    window.requestAnimationFrame(() => {\n      if (this.open && !this._openedBefore) {\n        // we iterate over all the items initializing them in the correct order\n        const items = this.items.getAll();\n        for (let i = 0, itemCount = items.length ; i < itemCount ; i++) {\n          this._attachItem(items[i], i);\n        }\n\n        this._openedBefore = true;\n      }\n\n      if (this.open) {\n        this._layout();\n      }\n\n      // we toggle \"is-selected\" on the target to indicate that the over is open\n      const targetElement = this._getTarget();\n      if (targetElement) {\n        targetElement.classList.toggle('is-selected', this.open);\n      }\n    });\n  }\n\n  _getButtonWidth() {\n    if (this.closest('.coral--large')) {\n      // 40px button width + 10px left margin\n      return 50;\n    } else {\n      // 32px button width + 8px left margin\n      return 40;\n    }\n  }\n\n  /** @ignore */\n  _getTarget(targetValue) {\n    // Use passed target\n    targetValue = targetValue || this.target;\n\n    if (targetValue instanceof Node) {\n      // Just return the provided Node\n      return targetValue;\n    }\n\n    // Dynamically get the target node based on target\n    let newTarget = null;\n    if (typeof targetValue === 'string') {\n      if (targetValue === target.PARENT) {\n        newTarget = this.parentNode;\n      } else {\n        // Delegate to Coral.Overlay for _prev, _next and general selector\n        newTarget = super._getTarget(targetValue);\n      }\n    }\n\n    return newTarget;\n  }\n\n  /** @ignore */\n  _addTargetEventListeners(targetElement) {\n    targetElement = targetElement || this._getTarget();\n\n    if (!targetElement) {\n      return;\n    }\n\n    // Interaction-sensitive listeners\n    if (this.interaction === interaction.ON) {\n      // We do not have to worry about the EventListener being called twice as duplicates are discarded\n      targetElement.addEventListener('mouseenter', this._onTargetMouseEnter);\n      targetElement.addEventListener('keyup', this._onTargetKeyUp);\n      targetElement.addEventListener('keydown', this._onTargetKeyDown);\n      targetElement.addEventListener('mouseleave', this._onTargetMouseLeave);\n    }\n  }\n\n  /** @ignore */\n  _removeTargetEventListeners(targetElement) {\n    targetElement = targetElement || this._getTarget();\n\n    if (!targetElement) {\n      return;\n    }\n\n    targetElement.removeEventListener('mouseenter', this._onTargetMouseEnter);\n    targetElement.removeEventListener('keyup', this._onTargetKeyUp);\n    targetElement.removeEventListener('keydown', this._onTargetKeyDown);\n    targetElement.removeEventListener('mouseleave', this._onTargetMouseLeave);\n  }\n\n  /**\n   Toggles whether or not an item is tabbable.\n\n   @param {HTMLElement} item\n   The item to process.\n\n   @param {Boolean} tabbable\n   Whether the item should be marked tabbable.\n   @ignore\n   */\n  _toggleTabbable(item, tabbable) {\n    if (item) {\n      if (tabbable) {\n        if (item.hasAttribute('tabIndex')) {\n          item.removeAttribute('tabIndex');\n        }\n      } else {\n        item.setAttribute('tabIndex', '-1');\n      }\n    }\n  }\n\n  /**\n   Gets the subsequent or previous focusable neighbour relative to an Item button.\n\n   @param {HTMLElement} current\n   The current button element from which to find the next selectable neighbour.\n   @param {Boolean} [previous]\n   Whether to look for a previous neighbour rather than a subsequent one.\n\n   @returns {HTMLElement|undefined} The focusable neighbour. Undefined if no suitable neighbour found.\n\n   @private\n   */\n  _getFocusableNeighbour(current, previous) {\n    // we need to convert the result to an array in order to use .indexOf()\n    const focusableButtons = Array.prototype.slice.call(this._getFocusableButtons());\n    const index = focusableButtons.indexOf(current);\n\n    if (index >= 0) {\n      if (!previous) {\n        // Pick the next focusable button\n        if (index < focusableButtons.length - 1) {\n          return focusableButtons[index + 1];\n        }\n      }\n      // Pick the previous focusable button\n      else if (index !== 0) {\n        return focusableButtons[index - 1];\n      }\n    }\n  }\n\n  /**\n   Gets the buttons, optionally excluding the more button.\n\n   @param {Boolean} excludeMore\n   Whether to exclude the more button.\n\n   @returns {NodeList} The NodeList containing all the buttons.\n\n   @private\n   */\n  _getButtons(excludeMore) {\n    let buttonSelector = '._coral-QuickActions-item';\n    buttonSelector = excludeMore ? `${buttonSelector}:not([handle=\"moreButton\"])` : buttonSelector;\n\n    return this.querySelectorAll(buttonSelector);\n  }\n\n  /**\n   An element is focusable if it is visible and not disabled.\n\n   @returns {NodeList} A NodeList containing the focusable buttons.\n\n   @private\n   */\n  _getFocusableButtons() {\n    // since we use the hidden attribute to hide the items, we can rely on this attribute to determine if the button\n    // is hidden, instead of using a more expensive :focusable selector\n    return this.querySelectorAll(BUTTON_FOCUSABLE_SELECTOR);\n  }\n\n  /**\n   Gets the first focusable button.\n\n   @returns {HTMLElement|undefined}\n   The first focusable button, undefined if none found.\n   @ignore\n   */\n  _getFirstFocusableButton() {\n    return this.querySelector(BUTTON_FOCUSABLE_SELECTOR);\n  }\n\n  /**\n   Gets the last focusable button.\n\n   @returns {HTMLElement|undefined}\n   The last focusable button, undefined if none found.\n   @ignore\n   */\n  _getLastFocusableButton() {\n    const focusableButtons = this._getFocusableButtons();\n    return focusableButtons[focusableButtons.length - 1];\n  }\n\n  /** @ignore */\n  _proxyClick(item) {\n    const event = item.trigger('click');\n\n    if (!event.defaultPrevented && this.interaction === interaction.ON) {\n      this._hideAll();\n    }\n  }\n\n  /**\n   Gets data from an Item.\n\n   @param {HTMLElement} item\n   The Item to get the data from.\n   @returns {Object}\n   The Item data.\n   @ignore\n   */\n  _getItemData(item) {\n    return {\n      htmlContent: item.innerHTML,\n      textContent: item.textContent,\n      // fallback to empty string in case it has no icon\n      icon: item.getAttribute('icon') || ''\n    };\n  }\n\n  /** @ignore */\n  _attachItem(item, index) {\n    // since the button has already been initialized we make sure it is up to date\n    if (item._elements && item._elements.button) {\n      this._updateItem(item);\n      return;\n    }\n\n    // if the index was not provided, we need to calculate it\n    if (typeof index === 'undefined') {\n      index = Array.prototype.indexOf.call(this.items.getAll(), item);\n    }\n\n    const itemData = this._getItemData(item);\n    const type = QuickActionsItem.type;\n\n    let button;\n    if (item.type === type.BUTTON) {\n      button = new Button().set({\n        icon: itemData.icon,\n        iconsize: Icon.size.SMALL,\n        type: 'button',\n        tracking: 'off'\n      }, true);\n    } else if (item.type === type.ANCHOR) {\n      button = new AnchorButton().set({\n        icon: itemData.icon,\n        iconsize: Icon.size.SMALL,\n        href: item.href,\n        tracking: 'off'\n      }, true);\n    }\n\n    button.variant = Button.variant.QUIET_ACTION;\n    button.classList.add('_coral-QuickActions-item');\n    button.setAttribute('tabindex', '-1');\n    button.setAttribute('title', itemData.textContent.trim());\n    button.setAttribute('aria-label', itemData.textContent.trim());\n    button.setAttribute('role', 'menuitem');\n\n    this.insertBefore(button, this.children[index]);\n\n    // ButtonList Item\n    let buttonListItem;\n    if (item.type === type.BUTTON) {\n      buttonListItem = new ButtonList.Item();\n    } else if (item.type === type.ANCHOR) {\n      buttonListItem = new AnchorList.Item();\n      buttonListItem.href = item.href;\n    }\n\n    const buttonListItemParent = this._elements.buttonList;\n\n    buttonListItem.tabIndex = -1;\n    buttonListItem.content.innerHTML = itemData.htmlContent;\n    buttonListItem.icon = itemData.icon;\n    buttonListItem.setAttribute('role', 'menuitem');\n    buttonListItemParent.insertBefore(buttonListItem, buttonListItemParent.children[index]);\n\n    item._elements.button = button;\n    item._elements.buttonListItem = buttonListItem;\n    buttonListItem._elements.quickActionsItem = item;\n    button._elements.quickActionsItem = item;\n  }\n\n  /**\n   Layout calculation; collapses QuickActions as necessary.\n   */\n  _layout() {\n    // Set the width of the QuickActions to match that of the target\n    this._setWidth();\n\n    const buttons = this._getButtons(true);\n\n    if (!buttons.length) {\n      return;\n    }\n\n    const buttonListItems = this._elements.buttonList.items.getAll();\n\n    // Temporarily display the QuickActions so we can do the calculation\n    const display = this.style.display;\n    let temporarilyShown = false;\n\n    if (!this.open) {\n      this.style.left -= 10000;\n      this.style.top -= 10000;\n      this.style.display = 'block';\n      temporarilyShown = true;\n    }\n\n    const totalAvailableWidth = this.offsetWidth;\n\n    let totalFittingButtons = 0;\n    let widthUsed = 0;\n    const buttonWidth = this._getButtonWidth();\n    while (totalAvailableWidth > widthUsed) {\n      widthUsed += buttonWidth;\n\n      if (totalAvailableWidth > widthUsed) {\n        totalFittingButtons++;\n      }\n    }\n\n    // Remove one to avoid taking full width space\n    totalFittingButtons--;\n\n    const threshold = this.threshold;\n    const handleThreshold = threshold > 0;\n    const moreButtonsThanThreshold = handleThreshold && buttons.length > threshold;\n    const collapse = buttons.length > totalFittingButtons || moreButtonsThanThreshold;\n\n    // +1 to account for the more button\n    const collapseToThreshold = collapse && handleThreshold && threshold + 1 < totalFittingButtons;\n\n    let totalButtons;\n    if (collapse) {\n      if (collapseToThreshold) {\n        totalButtons = threshold + 1;\n      } else {\n        totalButtons = totalFittingButtons;\n      }\n    } else {\n      totalButtons = buttons.length;\n    }\n\n    // Show all Buttons and ButtonList Items\n    for (let i = 0 ; i < buttons.length ; i++) {\n      this._toggleTabbable(buttons[i], false);\n      buttons[i].hidden = false;\n      if (buttonListItems[i]) {\n        buttonListItems[i].hidden = false;\n      }\n    }\n\n    this._toggleTabbable(this._elements.moreButton, false);\n\n    if (collapse) {\n      if (totalButtons > 0) {\n        // Hide the buttons we're collapsing\n        for (let j = totalButtons - 1 ; j < buttons.length ; j++) {\n          buttons[j].hide();\n        }\n\n        // Hide the ButtonList items\n        for (let k = 0 ; k < totalButtons - 1 ; k++) {\n          buttonListItems[k].hide();\n        }\n\n        // Mark the first button as tabbable\n        this._toggleTabbable(buttons[0], true);\n      } else {\n        this._toggleTabbable(this._elements.moreButton, true);\n      }\n\n      this._elements.moreButton.show();\n    } else {\n      // Mark the first button as tabbable\n      this._toggleTabbable(buttons[0], true);\n      this._elements.moreButton.hide();\n    }\n\n    this._setWidth(true);\n\n    // Reset the QuickActions display\n    if (temporarilyShown) {\n      this.style.left += 10000;\n      this.style.top += 10000;\n      this.style.display = display;\n    }\n\n    // Do a reposition of the overlay\n    this.reposition();\n  }\n\n  /**\n   Sets the width of QuickActions from the target.\n\n   @ignore\n   */\n  _setWidth(buttonWidthBased) {\n    let width = 0;\n    const targetElement = this._getTarget();\n\n    if (targetElement) {\n      const maxWidth = targetElement.offsetWidth;\n\n      if (buttonWidthBased) {\n        const visibleButtons = this.querySelectorAll('._coral-QuickActions-item:not([hidden])');\n        const buttonWidth = this._getButtonWidth();\n\n        if (visibleButtons.length) {\n          for (let i = 0 ; i < visibleButtons.length && width <= maxWidth ; i++) {\n            width += buttonWidth;\n          }\n\n          this.style.width = `${width}px`;\n        }\n      } else {\n        this.style.width = `${maxWidth}px`;\n      }\n    }\n  }\n\n  /** @ignore */\n  _setButtonListHeight() {\n    // Set height of ButtonList\n    this._elements.buttonList.style.height = '';\n\n    // Measure actual height\n    const style = window.getComputedStyle(this._elements.buttonList);\n    const height = parseInt(style.height, 10);\n    const maxHeight = parseInt(style.maxHeight, 10);\n\n    if (height < maxHeight) {\n      // Make it scrollable\n      this._elements.buttonList.style.height = `${height - 1}px`;\n    }\n  }\n\n  /** @ignore */\n  _isInternalToComponent(element) {\n    const targetElement = this._getTarget();\n\n    return element && (this.contains(element) || this._elements.overlay.contains(element) || targetElement && targetElement.contains(element));\n  }\n\n  /** @ignore */\n  _onWindowResize() {\n    this._layout();\n  }\n\n  _handleEscape(event) {\n    if (typeof this._isTop === 'undefined') {\n      this._isTop = this._isTopOverlay();\n    }\n\n    // Debounce\n    if (this._timeout !== null) {\n      window.clearTimeout(this._timeout);\n    }\n\n    this._timeout = window.setTimeout(() => {\n      if (this._isTop) {\n        super._handleEscape(event);\n      }\n\n      this._isTop = undefined;\n    });\n  }\n\n  /** @ignore */\n  _onMouseOut(event) {\n    const toElement = event.toElement || event.relatedTarget;\n\n    // Hide if we mouse leave to any element external to the component and its target\n    if (!this._isInternalToComponent(toElement) && this.interaction === interaction.ON) {\n      this._hideAll();\n    }\n  }\n\n  _hideAll() {\n    this.hide();\n    this._elements.overlay.hide();\n  }\n\n  /** @ignore */\n  _onTargetMouseEnter(event) {\n    const fromElement = event.fromElement || event.relatedTarget;\n\n    // Open if we aren't already\n    if (!this.open && !this._isInternalToComponent(fromElement)) {\n      this.show();\n\n      this._trackEvent('display', 'coral-quickactions', event);\n    }\n  }\n\n  /** @ignore */\n  _onTargetKeyUp(event) {\n    const keyCode = event.keyCode;\n\n    // shift + F10 or ctrl + space (http://www.w3.org/WAI/PF/aria-practices/#popupmenu)\n    if (event.shiftKey && keyCode === 121 || event.ctrlKey && keyCode === 32) {\n      if (!this.open) {\n        if (this.interaction === interaction.ON) {\n          // Launched via keyboard and interaction enabled implies a focus trap and return focus.\n          // Remember the relevant properties and return their values on hide.\n          this._previousTrapFocus = this.trapFocus;\n          this._previousReturnFocus = this.returnFocus;\n          this._previousFocusOnShow = this.focusOnShow;\n          this.trapFocus = this.constructor.trapFocus.ON;\n          this.returnFocus = this.constructor.returnFocus.ON;\n          this.focusOnShow = this.constructor.focusOnShow.ON;\n        }\n\n        this.show();\n      }\n    }\n  }\n\n  _onTargetKeyDown(event) {\n    const keyCode = event.keyCode;\n\n    // shift + F10 or ctrl + space (http://www.w3.org/WAI/PF/aria-practices/#popupmenu)\n    if (event.shiftKey && keyCode === 121 || event.ctrlKey && keyCode === 32) {\n      // Prevent default context menu show or page scroll behaviour\n      event.preventDefault();\n    }\n  }\n\n  /** @ignore */\n  _onTargetMouseLeave(event) {\n    const toElement = event.toElement || event.relatedTarget;\n\n    // Do not hide if we entered the quick actions\n    if (!this._isInternalToComponent(toElement)) {\n      this._hideAll();\n    }\n  }\n\n  /** @ignore */\n  _onHomeKeypress(event) {\n    // prevents the page from scrolling\n    event.preventDefault();\n\n    const firstFocusableButton = this._getFirstFocusableButton();\n\n    // Jump focus to the first focusable button\n    if (firstFocusableButton) {\n      firstFocusableButton.focus();\n    }\n  }\n\n  /** @ignore */\n  _onEndKeypress(event) {\n    // prevents the page from scrolling\n    event.preventDefault();\n\n    const lastFocusableButton = this._getLastFocusableButton();\n\n    // Jump focus to the last focusable button\n    if (lastFocusableButton) {\n      lastFocusableButton.focus();\n    }\n  }\n\n  /** @ignore */\n  _onButtonKeypressNext(event) {\n    event.preventDefault();\n\n    if (document.activeElement === this) {\n      const firstFocusableButton = this._getFirstFocusableButton();\n\n      if (firstFocusableButton) {\n        firstFocusableButton.focus();\n      }\n    } else {\n      // Handle key presses that imply focus of the next focusable button\n      const nextButton = this._getFocusableNeighbour(event.matchedTarget);\n      if (nextButton) {\n        nextButton.focus();\n      } else if (event.key === 'ArrowDown' && document.activeElement === this._elements.moreButton) {\n        this._elements.moreButton.click();\n      }\n    }\n  }\n\n  /** @ignore */\n  _onButtonKeypressPrevious(event) {\n    event.preventDefault();\n\n    if (document.activeElement === this) {\n      const lastFocusableButton = this._getLastFocusableButton();\n\n      if (lastFocusableButton) {\n        lastFocusableButton.focus();\n      }\n    } else {\n      // Handle key presses that imply focus of the previous focusable button\n      const previousButton = this._getFocusableNeighbour(event.matchedTarget, true);\n      if (previousButton) {\n        previousButton.focus();\n      }\n    }\n  }\n\n  /** @ignore */\n  _onButtonClick(event) {\n    event.stopPropagation();\n\n    if (this._preventClick) {\n      return;\n    }\n\n    const button = event.matchedTarget;\n    const item = button._elements.quickActionsItem;\n    this._proxyClick(item);\n\n    // Prevent double click or alternate selection during animation\n    window.setTimeout(() => {\n      this._preventClick = false;\n    }, this._overlayAnimationTime);\n\n    this._preventClick = true;\n\n    this._trackEvent('click', 'coral-quickactions-item', event, item);\n  }\n\n  _onMoreButtonClick(event) {\n    const button = event.matchedTarget;\n    const item = button._elements.quickActionsItem;\n\n    this._trackEvent('click', 'coral-quickactions-more', event, item);\n  }\n\n  _onFocus() {\n    if (this._focusOnShow === this.constructor.focusOnShow.OFF && this._returnFocus !== this.constructor.returnFocus.ON) {\n      const targetElement = this._getTarget();\n      if (targetElement) {\n        if (!this._previousReturnFocus) {\n          this._previousReturnFocus = this._returnFocus;\n          this.returnFocus = this.constructor.returnFocus.ON;\n        }\n\n        if (!this._previousElementToFocusWhenHidden) {\n          this._previousElementToFocusWhenHidden = this._elementToFocusWhenHidden;\n          this._elementToFocusWhenHidden = targetElement;\n        }\n      }\n    }\n  }\n\n  _onBlur() {\n    if (this._focusOnShow === this.constructor.focusOnShow.OFF) {\n      if (this._previousReturnFocus) {\n        this.returnFocus = this._previousReturnFocus;\n        this._previousReturnFocus = undefined;\n      }\n\n      if (this._previousElementToFocusWhenHidden) {\n        this._elementToFocusWhenHidden = this._previousElementToFocusWhenHidden;\n        this._previousElementToFocusWhenHidden = undefined;\n      }\n    }\n  }\n\n  /** @ignore */\n  _onOverlayBeforeOpen(event) {\n    if (event.target === this) {\n      // Reset double-click prevention flag\n      this._preventClick = false;\n      this._layout();\n    } else if (event.target === this._elements.overlay) {\n      // do not allow internal Overlay events to escape QuickActions\n      event.stopImmediatePropagation();\n      this._setButtonListHeight();\n    }\n  }\n\n  /** @ignore */\n  _onOverlayBeforeClose(event) {\n    if (event.target === this._elements.overlay) {\n      // do not allow internal Overlay events to escape QuickActions\n      event.stopImmediatePropagation();\n    }\n  }\n\n  /** @ignore */\n  _onOverlayOpen(event) {\n    if (event.target === this._elements.overlay) {\n      // do not allow internal Overlay events to escape QuickActions\n      event.stopImmediatePropagation();\n\n      this._elements.moreButton.setAttribute('aria-expanded', 'true');\n    }\n  }\n\n  /** @ignore */\n  _onOverlayClose(event) {\n    if (event.target === this) {\n      this._elements.overlay.open = false;\n\n      // Return the trapFocus and returnFocus properties to their state before open.\n      // Handles the keyboard launch and interaction enabled case, which implies focus trap and focus return.\n      // Wait a frame as this is called before the 'open' property sync. Otherwise, returnFocus is set prematurely.\n      window.requestAnimationFrame(() => {\n        if (this._previousTrapFocus) {\n          this.trapFocus = this._previousTrapFocus;\n          if (this.trapFocus !== this.constructor.trapFocus.ON) {\n            this.removeAttribute('tabindex');\n          }\n          this._previousTrapFocus = undefined;\n        }\n\n        if (this._previousReturnFocus) {\n          this.returnFocus = this._previousReturnFocus;\n          this._previousReturnFocus = undefined;\n        }\n\n        if (this._previousFocusOnShow) {\n          this.focusOnShow = this._previousFocusOnShow;\n          this._previousFocusOnShow = undefined;\n        }\n      });\n    } else if (event.target === this._elements.overlay) {\n      // do not allow internal Overlay events to escape QuickActions\n      event.stopImmediatePropagation();\n      this._elements.moreButton.setAttribute('aria-expanded', 'false');\n    }\n  }\n\n  /** @ignore */\n  _onOverlayPositioned(event) {\n    if (event.target === this._elements.overlay) {\n      // do not allow internal Overlay events to escape QuickActions\n      event.stopImmediatePropagation();\n    }\n  }\n\n  _onAnimate(event) {\n    if (event.target === this) {\n      if (this.placement === placement.BOTTOM) {\n        this.style.marginTop = `${-parseFloat(this.lengthOffset) + 8}px`;\n      } else {\n        this.style.marginTop = `${parseFloat(this.lengthOffset) - 8}px`;\n      }\n    }\n  }\n\n  /** @ignore */\n  _onButtonListItemClick(event) {\n    // stops propagation so that this event remains internal to the component\n    event.stopImmediatePropagation();\n\n    const buttonListItem = event.matchedTarget;\n\n    if (!buttonListItem) {\n      return;\n    }\n\n    const item = buttonListItem._elements.quickActionsItem;\n    this._proxyClick(item);\n\n    this._trackEvent('click', 'coral-quickactions-item', event, item);\n  }\n\n  /** @ignore */\n  _onItemRemoved(item) {\n    this._removeItemElements(item);\n  }\n\n  /** @ignore */\n  _onCollectionChange(addedNodes) {\n    // Delay the item initialization if the component has not been opened before\n    if (!this._openedBefore) {\n      return;\n    }\n\n    // we use the items to be able to find out the index of the added item in reference to the whole collection\n    const items = this.items.getAll();\n    let index;\n    for (let i = 0, addedNodesCount = addedNodes.length ; i < addedNodesCount ; i++) {\n      // we need to know the item's position in relation to the others\n      index = Array.prototype.indexOf.call(items, addedNodes[i]);\n      this._attachItem(addedNodes[i], index);\n    }\n\n    this._layout();\n  }\n\n  /** @ignore */\n  _onItemChange(event) {\n    // stops propagation so that this event remains internal to the component\n    event.stopImmediatePropagation();\n\n    this._updateItem(event.target);\n  }\n\n  /** @ignore */\n  _onItemTypeChange(event) {\n    // stops propagation so that this event remains internal to the component\n    event.stopImmediatePropagation();\n\n    // delay this execution while opening quickaction to avoid performance delay\n    if(this._openedBefore || this.open) {\n      const item = event.target;\n      this._removeItemElements(item);\n      this._attachItem(item);\n      this._layout();\n    }\n  }\n\n  /** @ignore */\n  _removeItemElements(item) {\n    // Remove the associated Button and ButtonList elements\n    if (item._elements.button) {\n      item._elements.button.remove();\n      item._elements.button._elements.quickActionsItem = undefined;\n      item._elements.button = undefined;\n    }\n\n    if (item._elements.buttonListItem) {\n      item._elements.buttonListItem.remove();\n      item._elements.buttonListItem._elements.quickActionsItem = null;\n      item._elements.buttonListItem = undefined;\n    }\n  }\n\n  /** @ignore */\n  _updateItem(item) {\n    const itemData = this._getItemData(item);\n    const type = QuickActionsItem.type;\n\n    const button = item._elements.button;\n    if (button) {\n      button.icon = itemData.icon;\n      button.setAttribute('title', itemData.textContent.trim());\n      button.setAttribute('aria-label', itemData.textContent.trim());\n      button[item.type === type.ANCHOR ? 'setAttribute' : 'removeAttribute']('href', item.href);\n    }\n\n    const buttonListItem = item._elements.buttonListItem;\n    if (buttonListItem) {\n      buttonListItem.content.innerHTML = itemData.htmlContent;\n      buttonListItem[item.type === type.ANCHOR ? 'setAttribute' : 'removeAttribute']('href', item.href);\n      buttonListItem.icon = itemData.icon;\n    }\n  }\n\n  // Maps placement CENTER with RIGHT\n  _toggleCenterPlacement(toggle) {\n    if (toggle) {\n      if (this.placement === placement.CENTER) {\n        this._placement = Overlay.placement.RIGHT;\n\n        this._oldInner = this._inner;\n        this._inner = false;\n        this._oldLengthOffset = this._lengthOffset;\n        this._lengthOffset = '-50%r - 50%p';\n      }\n    } else if (this._placement === Overlay.placement.RIGHT) {\n      this._placement = placement.CENTER;\n\n      // Restore\n      this._inner = this._oldInner;\n      this._lengthOffset = this._oldLengthOffset;\n    }\n  }\n\n  /** @ignore */\n  reposition(forceReposition) {\n    // Override to support placement.CENTER\n    this._toggleCenterPlacement(true);\n    super.reposition(forceReposition);\n    this._toggleCenterPlacement(false);\n\n    if (this._openedOnce) {\n      // PopperJS inner property issue https://github.com/FezVrasta/popper.js/issues/400\n      if (this.placement === placement.BOTTOM) {\n        this.style.marginTop = `-${parseFloat(this.lengthOffset)}px`;\n      } else if (this.placement === placement.TOP) {\n        this.style.marginTop = `${parseFloat(this.lengthOffset)}px`;\n      } else if (this.placement === placement.CENTER) {\n        this.style.marginTop = `${parseFloat(this.lengthOffset) - 4}px`;\n      }\n    }\n  }\n\n  // Override placement and target\n  /**\n   Returns {@link QuickActions} placement options.\n\n   @return {QuickActionsPlacementEnum}\n   */\n  static get placement() {\n    return placement;\n  }\n\n  /**\n   Returns {@link QuickActions} target options.\n\n   @return {QuickActionsTargetEnum}\n   */\n  static get target() {\n    return target;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['threshold']);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Define QuickActions as a menu\n    this.setAttribute('role', 'menu');\n\n    // Add accessible name to QuickActions\n    this.setAttribute('aria-label', i18n.get('Actions'));\n\n    // Support cloneNode\n    ['moreButton', 'overlay'].forEach((handleName) => {\n      const handle = this.querySelector(`[handle=\"${handleName}\"]`);\n      if (handle) {\n        handle.remove();\n      }\n    });\n\n    // Render template\n    const frag = document.createDocumentFragment();\n    frag.appendChild(this._elements.moreButton);\n    frag.appendChild(this._elements.overlay);\n\n    // avoid popper initialisation if popper neither exist nor overlay opened.\n    this._elements.overlay._avoidPopperInit = this._elements.overlay.open || this._elements.overlay._popper ? false : true;\n\n    // Link target\n    this._elements.overlay.target = this._elements.moreButton;\n\n    this.appendChild(frag);\n\n    // set this to false after overlay has been connected to avoid connected callback target setting\n    delete this._elements.overlay._avoidPopperInit;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n});\n\nexport default QuickActions;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1417,
    "kind": "variable",
    "name": "BUTTON_FOCUSABLE_SELECTOR",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~BUTTON_FOCUSABLE_SELECTOR",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1418,
    "kind": "typedef",
    "name": "QuickActionsInteractionEnum",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~QuickActionsInteractionEnum",
    "access": "public",
    "description": "Enumeration for {@link QuickActions} interaction options.",
    "lineNumber": 37,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Show when the target is hovered or focused and hide when the mouse is moved out or focus is lost."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Do not show or hide automatically."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "QuickActionsInteractionEnum"
    }
  },
  {
    "__docId__": 1419,
    "kind": "typedef",
    "name": "QuickActionsTargetEnum",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~QuickActionsTargetEnum",
    "access": "public",
    "description": "Enumeration for {@link QuickActions} anchored overlay target options.",
    "lineNumber": 54,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PARENT",
        "description": "Use the parent element in the DOM."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PREVIOUS",
        "description": "Use the previous sibling element in the DOM."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NEXT",
        "description": "Use the next sibling element in the DOM."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "QuickActionsTargetEnum"
    }
  },
  {
    "__docId__": 1420,
    "kind": "typedef",
    "name": "QuickActionsPlacementEnum",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~QuickActionsPlacementEnum",
    "access": "public",
    "description": "Enumeration for {@link QuickActions} placement options.",
    "lineNumber": 72,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TOP",
        "description": "QuickActions inset to the top of the target."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER",
        "description": "QuickActions inset to the center of the target."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BOTTOM",
        "description": "QuickActions inset to the bottom the target."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "QuickActionsPlacementEnum"
    }
  },
  {
    "__docId__": 1421,
    "kind": "variable",
    "name": "OFFSET",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~OFFSET",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 78,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1422,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 80,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1423,
    "kind": "variable",
    "name": "QuickActions",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActions.js~QuickActions",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{QuickActions}",
    "description": "A QuickActions component is an overlay component that reveals actions when interacting with a container.\nHovering the target will display the QuickActions. They can also be launched by pressing the shift + F10 key combination\nwhen the target is focused.",
    "lineNumber": 90,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.QuickActions"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A QuickActions component is an overlay component that reveals actions when interacting with a container.\nHovering the target will display the QuickActions. They can also be launched by pressing the shift + F10 key combination\nwhen the target is focused."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-quickactions"
      },
      {
        "tagName": "@extends",
        "tagValue": "{Overlay}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-quickactions></coral-quickactions>",
      "<caption>JS constructor</caption>\nnew Coral.QuickActions();"
    ],
    "see": [
      "../examples/#quickactions"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1424,
    "kind": "file",
    "name": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate} from '../../../coral-utils';\nimport {Messenger} from '../../../coral-messenger';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link QuickActionsItem} type values.\n\n @typedef {Object} QuickActionsItemTypeEnum\n\n @property {String} BUTTON\n Default button type\n @property {String} ANCHOR\n Anchor button type\n */\nconst type = {\n  BUTTON: 'button',\n  ANCHOR: 'anchor'\n};\n\n/**\n @class Coral.QuickActions.Item\n @classdesc A QuickActions item component\n @htmltag coral-quickactions-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst QuickActionsItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // QuickActions will add button/anchorbutton references to it\n    this._elements = {};\n    // messenger\n    this._messenger = new Messenger(this);\n\n    this._observer = new MutationObserver(this._onMutation.bind(this));\n    this._observer.observe(this, {\n      characterData: true,\n      childList: true,\n      subtree: true\n    });\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   When <code>type</code> is {@link Coral.QuickActions.Item.type.ANCHOR}, the href will be used for the anchor.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute href\n   @htmlattributereflected\n   @emits {coral-quickactions-item:_hrefchanged}\n   */\n  get href() {\n    return this._href || '';\n  }\n\n  set href(value) {\n    value = transform.string(value);\n\n    if(validate.valueMustChange(this._href, value)) {\n      this._href = value;\n      this._reflectAttribute('href', value);\n      this._messenger.postMessage('coral-quickactions-item:_hrefchanged');\n    }\n  }\n\n  /**\n   Specifies the name of the icon to be shown in the QuickActions Item. See {@link Icon} for valid icon\n   names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   @htmlattributereflected\n   @emits {coral-quickactions-item:_iconchanged}\n   */\n  get icon() {\n    return this._icon || '';\n  }\n\n  set icon(value) {\n    value = transform.string(value);\n\n    if(validate.valueMustChange(this._icon, value)) {\n      this._icon = value;\n      this._reflectAttribute('icon', value);\n\n      this._messenger.postMessage('coral-quickactions-item:_iconchanged');\n    }\n  }\n\n  /**\n   The type of item that will be used. Setting {@link QuickActionsItemTypeEnum}.ANCHOR will allow users to\n   navigate using the quickactions proving the correct hypermedia to the users.\n\n   @type {String}\n   @default QuickActionsItemTypeEnum.BUTTON\n   @htmlattribute type\n   @htmlattributereflected\n   */\n  get type() {\n    return this._type || type.BUTTON;\n  }\n\n  set type(value) {\n    value = transform.string(value).toLowerCase();\n    value = validate.enumeration(type)(value) && value || type.BUTTON;\n\n    if(validate.valueMustChange(this._type, value)) {\n      this._type = value;\n      this._reflectAttribute('type', value);\n\n      this._messenger.postMessage('coral-quickactions-item:_typechanged');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.textContent && this.textContent.replace(/\\s{2,}/g, ' ').trim() || this.icon) :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /**\n   Handles mutations on the Item.\n\n   @emits {coral-quickactions-item:_contentchanged}\n\n   @private\n   */\n  _onMutation() {\n    this._messenger.postMessage('coral-quickactions-item:_contentchanged');\n  }\n\n  /**\n   Returns {@link QuickActionsItem} type options.\n\n   @return {QuickActionsItemTypeEnum}\n   */\n  static get type() {\n    return type;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['href', 'icon', 'type']);\n  }\n\n  /** @ignore */\n  _suspendCallback() {\n    super._suspendCallback();\n    this._messenger.disconnect();\n  }\n\n  /** @ignore */\n  _resumeCallback() {\n    this._messenger.connect();\n    super._resumeCallback();\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    this._messenger.connect();\n    super.connectedCallback();\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._messenger.disconnect();\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // Default reflected attributes\n    if (!this._type) {\n      this.type = type.BUTTON;\n    }\n  }\n\n  /**\n   Triggered when an icon of a {@link QuickActionsItem} was changed.\n\n   @typedef {CustomEvent} coral-quickactions-item:_iconchanged\n\n   @private\n   */\n\n  /**\n   Triggered when the content of a {@link QuickActionsItem} was changed.\n\n   @typedef {CustomEvent} coral-quickactions-item:_contentchanged\n\n   @private\n   */\n\n  /**\n   Triggered when the href of a {@link QuickActionsItem} was changed.\n\n   @typedef {CustomEvent} coral-quickactions-item:_hrefchanged\n\n   @private\n   */\n\n  /**\n   Triggered when the type of a {@link QuickActionsItem} was changed.\n\n   @typedef {CustomEvent} coral-quickactions-item:_typechanged\n\n   @private\n   */\n});\n\nexport default QuickActionsItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1425,
    "kind": "typedef",
    "name": "QuickActionsItemTypeEnum",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~QuickActionsItemTypeEnum",
    "access": "public",
    "description": "Enumeration for {@link QuickActionsItem} type values.",
    "lineNumber": 28,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BUTTON",
        "description": "Default button type"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ANCHOR",
        "description": "Anchor button type"
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "QuickActionsItemTypeEnum"
    }
  },
  {
    "__docId__": 1426,
    "kind": "variable",
    "name": "QuickActionsItem",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~QuickActionsItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{QuickActions}",
    "description": "A QuickActions item component",
    "lineNumber": 40,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.QuickActions.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A QuickActions item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-quickactions-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-quickactions-item></coral-quickactions-item>",
      "<caption>JS constructor</caption>\nnew Coral.QuickActions.Item();"
    ],
    "see": [
      "../examples/#quickactions"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1427,
    "kind": "typedef",
    "name": "coral-quickactions-item:_iconchanged",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~coral-quickactions-item:_iconchanged",
    "access": "private",
    "description": "Triggered when an icon of a {@link QuickActionsItem} was changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-quickactions-item:_iconchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1428,
    "kind": "typedef",
    "name": "coral-quickactions-item:_contentchanged",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~coral-quickactions-item:_contentchanged",
    "access": "private",
    "description": "Triggered when the content of a {@link QuickActionsItem} was changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-quickactions-item:_contentchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1429,
    "kind": "typedef",
    "name": "coral-quickactions-item:_hrefchanged",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~coral-quickactions-item:_hrefchanged",
    "access": "private",
    "description": "Triggered when the href of a {@link QuickActionsItem} was changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-quickactions-item:_hrefchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1430,
    "kind": "typedef",
    "name": "coral-quickactions-item:_typechanged",
    "memberof": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-quickactions/src/scripts/QuickActionsItem.js~coral-quickactions-item:_typechanged",
    "access": "private",
    "description": "Triggered when the type of a {@link QuickActionsItem} was changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-quickactions-item:_typechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1431,
    "kind": "file",
    "name": "coral-spectrum/coral-component-radio/src/scripts/Radio.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport base from '../templates/base';\nimport {transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Radio';\n\n/**\n @class Coral.Radio\n @classdesc A Radio component to be used as a form field.\n @htmltag coral-radio\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Radio = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      click: '_onClick',\n      mousedown: '_onMouseDown'\n    }));\n\n    // Prepare templates\n    this._elements = {\n      // Try to find the label content zone\n      label: this.querySelector('coral-radio-label') || document.createElement('coral-radio-label')\n    };\n    base.call(this._elements, {commons, i18n});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Check if the label is empty whenever we get a mutation\n    this._observer = new MutationObserver(this._hideLabelIfEmpty.bind(this));\n\n    // Watch for changes to the label element's children\n    this._observer.observe(this._elements.labelWrapper, {\n      // Catch changes to childList\n      childList: true,\n      // Catch changes to textContent\n      characterData: true,\n      // Monitor any child node\n      subtree: true\n    });\n  }\n\n  /**\n   Checked state for the radio, <code>true</code> is checked and <code>false</code> is unchecked.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute checked\n   @htmlattributereflected\n   @emits {change}\n   */\n  get checked() {\n    return this._checked || false;\n  }\n\n  set checked(value) {\n    this._checked = transform.booleanAttr(value);\n    this._reflectAttribute('checked', this._checked);\n\n    this._elements.input.checked = this._checked;\n\n    // handles related radios\n    this._syncRelatedRadios();\n  }\n\n  /**\n   The radios's label element.\n\n   @type {RadioLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-radio-label',\n      insert: function (label) {\n        this._elements.labelWrapper.appendChild(label);\n      }\n    });\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   The value this radio should submit when checked. Changing this value will not trigger an event.\n\n   @type {String}\n   @default \"on\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.input.value || 'on';\n  }\n\n  set value(value) {\n    this._elements.input.value = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input.disabled = this._disabled;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this.classList.toggle('is-readOnly', this._readOnly);\n    this._elements.input.tabIndex = this._readOnly ? -1 : 0;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    this._hideLabelIfEmpty();\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    // it uses the name as the first fallback since it is not localized, otherwise it uses the label\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.name ? `${this.name}=${this.value}` : '') || (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property needs to be set in this component.\n\n   @protected\n   */\n  get _componentTargetProperty() {\n    return 'checked';\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property has to be extracted from the event.\n\n   @protected\n   */\n  get _eventTargetProperty() {\n    return 'checked';\n  }\n\n  /**\n   Takes care of keeping the checked property up to date, by unchecking every radio that has the same name. This is\n   only done if the radio is already in the DOM, it has a name and it is checked, otherwise this is not needed.\n\n   @ignore\n   */\n  _syncRelatedRadios() {\n    // if the radio has a name defined and it is checked, we need to ensure that other radios that share the name\n    // are not checked.\n    if (this.parentNode !== null && this.name && this.checked) {\n      // queries the document for all the coral-radios with the same name\n      const items = document.querySelectorAll(`${this.tagName}[name=${JSON.stringify(this.name)}]`);\n      const itemCount = items.length;\n\n      for (let i = 0 ; i < itemCount ; i++) {\n        if (items[i] !== this) {\n          // we uncheck all other radios with the same name\n          items[i].removeAttribute('checked');\n        }\n      }\n    }\n  }\n\n  /**\n   Hide the label if it's empty.\n\n   @ignore\n   */\n  _hideLabelIfEmpty() {\n    const label = this._elements.label;\n\n    // If it's empty and has no non-textnode children, hide the label\n    const hiddenValue = !(label.children.length === 0 && label.textContent.replace(/\\s*/g, '') === '');\n\n    // Toggle the screen reader text\n    this._elements.labelWrapper.style.margin = !hiddenValue ? '0' : '';\n    this._elements.screenReaderOnly.hidden = hiddenValue || this.labelled;\n  }\n\n  /**\n   @private\n   */\n  _onClick(event) {\n    // Handle the click() just like the native radio\n    if (!this.checked) {\n      if (event.target === this) {\n        this.checked = true;\n        this.trigger('change');\n      }\n\n      this._trackEvent('checked', 'coral-radio', event);\n    }\n  }\n\n  /**\n   Forces radio to receive focus on mousedown\n   @ignore\n   */\n  _onMouseDown() {\n    const target = this._elements.input;\n    requestAnimationFrame(() => {\n      if (target !== document.activeElement) {\n        target.focus();\n      }\n    });\n  }\n\n  /**\n   Inherited from {@link BaseFormField#clear}.\n   */\n  clear() {\n    this.checked = false;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    this.checked = this._initialCheckedState;\n  }\n\n  get _contentZones() {\n    return {'coral-radio-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['checked']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    const templateHandleNames = ['input', 'checkmark', 'labelWrapper'];\n\n    // Render the main template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.checkmark);\n    frag.appendChild(this._elements.labelWrapper);\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label && label.parentNode) {\n      label.parentNode.removeChild(label);\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        label.appendChild(child);\n      } else {\n        // Remove anything else (e.g labelWrapper)\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(frag);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n\n    // Cache the initial checked state of the radio button (in order to implement reset)\n    this._initialCheckedState = this.checked;\n\n    // handles the case where the attached component was checked\n    this._syncRelatedRadios();\n\n    // Check if we need to hide the label\n    // We must do this because IE does not catch mutations when nodes are not in the DOM\n    this._hideLabelIfEmpty();\n  }\n});\n\nexport default Radio;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-radio/src/scripts/Radio.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1432,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-radio/src/scripts/Radio.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-radio/src/scripts/Radio.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1433,
    "kind": "variable",
    "name": "Radio",
    "memberof": "coral-spectrum/coral-component-radio/src/scripts/Radio.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-radio/src/scripts/Radio.js~Radio",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Radio}",
    "description": "A Radio component to be used as a form field.",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Radio"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Radio component to be used as a form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-radio"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-radio></coral-radio>",
      "<caption>JS constructor</caption>\nnew Coral.Radio();"
    ],
    "see": [
      "../examples/#radio"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1434,
    "kind": "file",
    "name": "coral-spectrum/coral-component-radio/src/scripts/RadioLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Radio.Label\n @classdesc The Radio label\n @htmltag coral-radio-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-radio-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-radio/src/scripts/RadioLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1435,
    "kind": "function",
    "name": "RadioLabel",
    "memberof": "coral-spectrum/coral-component-radio/src/scripts/RadioLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-radio/src/scripts/RadioLabel.js~RadioLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Radio}",
    "description": "The Radio label",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Radio.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Radio label"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-radio-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-radio-label></coral-radio-label>",
      "<caption>JS constructor</caption>\nnew Coral.Radio.Label();"
    ],
    "see": [
      "../examples/#radio"
    ],
    "params": []
  },
  {
    "__docId__": 1436,
    "kind": "file",
    "name": "coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js",
    "content": "/**\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFieldGroup} from '../../../coral-base-fieldgroup';\nimport '../../../coral-component-radio';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link RadioGroup} orientations.\n\n @typedef {Object} RadioGroupOrientationEnum\n\n @property {String} HORIZONTAL\n Horizontal default orientation.\n @property {String} VERTICAL\n Vertical orientation.\n @property {String} LABELS_BELOW\n Renders labels below items.\n */\nconst orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical',\n  LABELS_BELOW: 'labelsbelow',\n};\n\n/**\n @class Coral.RadioGroup\n @classdesc A RadioGroup component to group radio fields\n @htmltag coral-radiogroup\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFieldGroup}\n */\nconst RadioGroup = Decorator(class extends BaseFieldGroup(BaseComponent(HTMLElement)) {\n  /**\n   Orientation of the radio group. See {@link RadioGroupOrientationEnum}.\n\n   @type {String}\n   @default RadioGroupOrientationEnum.HORIZONTAL\n   @htmlattribute orientation\n   @htmlattributereflected\n   */\n  get orientation() {\n    return super.orientation;\n  }\n\n  set orientation(value) {\n    super.orientation = value;\n\n    this.classList.toggle(`coral-RadioGroup--labelsBelow`, this._orientation === orientation.LABELS_BELOW);\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-radio';\n  }\n\n  /**\n   Returns {@link RadioGroup} orientation options.\n\n   @return {RadioGroupEnum}\n   */\n  static get orientation() {\n    return orientation;\n  }\n});\n\nexport default RadioGroup;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1437,
    "kind": "typedef",
    "name": "RadioGroupOrientationEnum",
    "memberof": "coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js~RadioGroupOrientationEnum",
    "access": "public",
    "description": "Enumeration for {@link RadioGroup} orientations.",
    "lineNumber": 30,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Horizontal default orientation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Vertical orientation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LABELS_BELOW",
        "description": "Renders labels below items."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "RadioGroupOrientationEnum"
    }
  },
  {
    "__docId__": 1438,
    "kind": "variable",
    "name": "RadioGroup",
    "memberof": "coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-radiogroup/src/scripts/RadioGroup.js~RadioGroup",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{RadioGroup}",
    "description": "A RadioGroup component to group radio fields",
    "lineNumber": 44,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.RadioGroup"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A RadioGroup component to group radio fields"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-radiogroup"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFieldGroup}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-radiogroup></coral-radiogroup>",
      "<caption>JS constructor</caption>\nnew Coral.RadioGroup();"
    ],
    "see": [
      "../examples/#radiogroup"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1439,
    "kind": "file",
    "name": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport '../../../coral-component-textfield';\nimport '../../../coral-component-button';\nimport {Icon} from '../../../coral-component-icon';\nimport base from '../templates/base';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Search';\n\n/**\n Enumeration for {@link Search} variants.\n\n @typedef {Object} SearchVariantEnum\n\n @property {String} DEFAULT\n A default, gray search input.\n @property {String} QUIET\n A search with no border, no background, no glow.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\n/**\n @class Coral.Search\n @classdesc A Search component is a search styled form field.\n @htmltag coral-search\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Search = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      // @todo use Coral.keys when key combos don't interfere with single key execution\n      'keydown [handle=input]': '_onEnterKey',\n      'keyup [handle=input]': '_onKeyUp',\n\n      // @todo use coralinternalinput from Autocomplete\n      'input [handle=input]': '_triggerInputEvent',\n\n      'key:escape [handle=input]': '_clearInput',\n      'click [handle=clearButton]:not(:disabled)': '_clearInput'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements, {i18n, Icon});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   The submitted input value. Changing this value will not trigger an event.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.input.value || '';\n  }\n\n  set value(value) {\n    this._elements.input.value = value;\n    this._updateClearButton();\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input.disabled = this._disabled;\n    this._elements.clearButton.disabled = this._disabled;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.input.readOnly = this._readOnly;\n    this._elements.clearButton.disabled = this._readOnly;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n    // in case the user focuses the buttons, he will still get a notion of the usage of the component\n    this[this.labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', this.labelledBy);\n  }\n\n  /**\n   Short hint that describes the expected value of the Search. It is displayed when the Search is empty.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  get placeholder() {\n    return this._elements.input.placeholder || '';\n  }\n\n  set placeholder(value) {\n    value = transform.string(value);\n    this._reflectAttribute('placeholder', value);\n\n    this._elements.input.placeholder = value;\n  }\n\n  /**\n   Max length for the Input field.\n   @type {Number}\n   @htmlattribute maxlength\n   @htmlattributereflected\n   */\n  get maxLength() {\n    return this._elements.input.maxLength;\n  }\n\n  set maxLength(value) {\n    this._elements.input.maxLength = value;\n    this._reflectAttribute('maxlength', this.maxLength);\n  }\n\n  /**\n   The search's variant. See {@link SearchVariantEnum}.\n\n   @type {String}\n   @default SearchVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this._elements.input.variant = value;\n  }\n\n  /**\n   @ignore\n\n   Not supported anymore.\n   */\n  get icon() {\n    return this._icon || 'search';\n  }\n\n  set icon(value) {\n    this._icon = transform.string(value);\n    this._reflectAttribute('icon', this._icon);\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n  }\n\n  /** @ignore */\n  _triggerInputEvent() {\n    this.trigger('coral-search:input');\n  }\n\n  /**\n   Handles the up action by steping up the Search. It prevents the default action.\n\n   @ignore\n   */\n  _onEnterKey(event) {\n    if (event.which === 13) {\n      event.preventDefault();\n\n      // stops interaction if the search is disabled\n      if (this.disabled) {\n        return;\n      }\n\n      this.trigger('coral-search:submit');\n    }\n  }\n\n  /**\n   Handles the keydown action.\n\n   @ignore\n   */\n  _onKeyUp() {\n    this._updateClearButton();\n  }\n\n  /**\n   Updates the clear button's display status.\n\n   @ignore\n   */\n  _updateClearButton() {\n    this._elements.clearButton.style.display = this._elements.input.value === '' ? 'none' : '';\n  }\n\n  /**\n   Clears the text in the input box.\n\n   @ignore\n   */\n  _clearInput() {\n    this._elements.input.value = '';\n    this._updateClearButton();\n    this._elements.input.focus();\n\n    // If we've been cleared, trigger the event\n    this.trigger('coral-search:clear');\n  }\n\n  // overrides the behavior from BaseFormField\n  reset() {\n    // since there is an internal value, this one handles the reset\n    this._elements.input.reset();\n    this._updateClearButton();\n  }\n\n  // overrides the behavior from BaseFormField\n  clear() {\n    // since there is an internal value, this one handles the clear\n    this._elements.input.clear();\n    this._updateClearButton();\n  }\n\n  /**\n   Returns {@link Search} variants.\n\n   @return {SearchVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      maxlength: 'maxLength'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['placeholder', 'icon', 'variant', 'maxlength']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._icon) {\n      this.icon = 'search';\n    }\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Support cloneNode\n    const templates = this.querySelectorAll('._coral-Search-input, ._coral-Search-icon, ._coral-Search-clear');\n    for (let i = 0 ; i < templates.length ; i++) {\n      templates[i].remove();\n    }\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    // Render the main template\n    fragment.appendChild(this._elements.input);\n    fragment.appendChild(this._elements.clearButton);\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Insert search icon\n    this._elements.input.insertAdjacentHTML('afterend', Icon._renderSVG('spectrum-css-icon-Magnifier', ['_coral-Search-icon', '_coral-UIIcon-Magnifier']));\n\n    this._updateClearButton();\n  }\n\n  /**\n   Triggered when {@link Search} input is given.\n\n   @typedef {CustomEvent} coral-search:input\n   */\n\n  /**\n   Triggered when the user presses {@link Search} enter.\n\n   @typedef {CustomEvent} coral-search:submit\n   */\n\n  /**\n   Triggered when the {@link Search} is cleared.\n\n   @typedef {CustomEvent} coral-search:clear\n   */\n});\n\nexport default Search;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-search/src/scripts/Search.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1440,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1441,
    "kind": "typedef",
    "name": "SearchVariantEnum",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~SearchVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Search} variants.",
    "lineNumber": 34,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default, gray search input."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A search with no border, no background, no glow."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "SearchVariantEnum"
    }
  },
  {
    "__docId__": 1442,
    "kind": "variable",
    "name": "Search",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~Search",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Search}",
    "description": "A Search component is a search styled form field.",
    "lineNumber": 47,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Search"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Search component is a search styled form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-search"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-search></coral-search>",
      "<caption>JS constructor</caption>\nnew Coral.Search();"
    ],
    "see": [
      "../examples/#search"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1443,
    "kind": "typedef",
    "name": "coral-search:input",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~coral-search:input",
    "access": "public",
    "description": "Triggered when {@link Search} input is given.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-search:input"
    }
  },
  {
    "__docId__": 1444,
    "kind": "typedef",
    "name": "coral-search:submit",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~coral-search:submit",
    "access": "public",
    "description": "Triggered when the user presses {@link Search} enter.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-search:submit"
    }
  },
  {
    "__docId__": 1445,
    "kind": "typedef",
    "name": "coral-search:clear",
    "memberof": "coral-spectrum/coral-component-search/src/scripts/Search.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-search/src/scripts/Search.js~coral-search:clear",
    "access": "public",
    "description": "Triggered when the {@link Search} is cleared.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-search:clear"
    }
  },
  {
    "__docId__": 1446,
    "kind": "file",
    "name": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {SelectableCollection} from '../../../coral-collection';\nimport '../../../coral-component-button';\nimport {Tag} from '../../../coral-component-taglist';\nimport {SelectList} from '../../../coral-component-list';\nimport {Icon} from '../../../coral-component-icon';\nimport '../../../coral-component-popover';\nimport base from '../templates/base';\nimport {transform, validate, commons, i18n, Keys} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Select} variants.\n\n @typedef {Object} SelectVariantEnum\n\n @property {String} DEFAULT\n A default, gray Select.\n @property {String} QUIET\n A Select with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\nconst CLASSNAME = '_coral-Dropdown';\n\n// used in 'auto' mode to determine if the client is on mobile.\nconst IS_MOBILE_DEVICE = navigator.userAgent.match(/iPhone|iPad|iPod|Android/i) !== null;\n\n/**\n Extracts the value from the item in case no explicit value was provided.\n\n @param {HTMLElement} item\n the item whose value will be extracted.\n\n @returns {String} the value that will be submitted for this item.\n\n @private\n */\nconst itemValueFromDOM = function (item) {\n  const attr = item.getAttribute('value');\n  // checking explicitely for null allows to differenciate between non set values and empty strings\n  return attr !== null ? attr : item.textContent.replace(/\\s{2,}/g, ' ').trim();\n};\n\n/**\n Calculates the difference between two given arrays. It returns the items that are in a that are not in b.\n\n @param {Array.<String>} a\n @param {Array.<String>} b\n\n @returns {Array.<String>}\n the difference between the arrays.\n */\nconst arrayDiff = function (a, b) {\n  return a.filter((item) => !b.some((item2) => item === item2));\n};\n\n/**\n @class Coral.Select\n @classdesc A Select component is a form field that allows users to select from a list of options. If this component is\n shown on a mobile device, it will show a native select list, instead of the select list styled via Coral Spectrum.\n @htmltag coral-select\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Select = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    base.call(this._elements, {commons, Icon, i18n});\n\n    const events = {\n      'global:click': '_onGlobalClick',\n      'global:touchstart': '_onGlobalClick',\n\n      'coral-collection:add coral-taglist': '_onInternalEvent',\n      'coral-collection:remove coral-taglist': '_onInternalEvent',\n\n      'change coral-taglist': '_onTagListChange',\n      'change select': '_onNativeSelectChange',\n      'click select': '_onNativeSelectClick',\n      'click > ._coral-Dropdown-trigger': '_onButtonClick',\n\n      'key:space > ._coral-Dropdown-trigger': '_onSpaceKey',\n      'key:enter > ._coral-Dropdown-trigger': '_onSpaceKey',\n      'key:return > ._coral-Dropdown-trigger': '_onSpaceKey',\n      'key:down > ._coral-Dropdown-trigger': '_onSpaceKey',\n\n      // Messenger\n      'coral-select-item:_messengerconnected': '_onMessengerConnected',\n    };\n\n    // Overlay\n    const overlayId = this._elements.overlay.id;\n    events[`global:capture:coral-collection:add #${overlayId} coral-selectlist`] = '_onSelectListItemAdd';\n    events[`global:capture:coral-collection:remove #${overlayId} coral-selectlist`] = '_onInternalEvent';\n    events[`global:capture:coral-selectlist:beforechange #${overlayId}`] = '_onSelectListBeforeChange';\n    events[`global:capture:coral-selectlist:change #${overlayId}`] = '_onSelectListChange';\n    events[`global:capture:coral-selectlist:scrollbottom #${overlayId}`] = '_onSelectListScrollBottom';\n    events[`global:capture:coral-overlay:close #${overlayId}`] = '_onOverlayToggle';\n    events[`global:capture:coral-overlay:open #${overlayId}`] = '_onOverlayToggle';\n    events[`global:capture:coral-overlay:positioned #${overlayId}`] = '_onOverlayPositioned';\n    events[`global:capture:coral-overlay:beforeopen #${overlayId}`] = '_onBeforeOpen';\n    events[`global:capture:coral-overlay:beforeclose #${overlayId}`] = '_onInternalEvent';\n    // Keyboard interaction\n    events[`global:keypress #${overlayId}`] = '_onOverlayKeyPress';\n    // TODO for some reason this disables tabbing into the select\n    // events[`global:key:tab #${overlayId} coral-selectlist-item`] = '_onTabKey';\n    // events[`global:key:tab+shift #${overlayId} coral-selectlist-item`] = '_onTabKey';\n\n    // Attach events\n    this._delegateEvents(commons.extend(this._events, events));\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.button;\n\n    // default value of inner flag to process events\n    this._bulkSelectionChange = false;\n\n    // we only have AUTO mode.\n    this._useNativeInput = IS_MOBILE_DEVICE;\n\n    this._elements.taglist.reset = () => {\n      // since reseting a form will call the reset on every component, we need to kill the behavior of the taglist\n      // otherwise the state will not be accurate\n    };\n\n    this._initialValues = [];\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems();\n  }\n\n  /**\n   Returns the inner overlay to allow customization.\n\n   @type {Popover}\n   @readonly\n   */\n  get overlay() {\n    return this._elements.overlay;\n  }\n\n  /**\n   The item collection.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // we do lazy initialization of the collection\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-select-item',\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved,\n        onCollectionChange: this._onCollectionChange\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Indicates whether the select accepts multiple selected values.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    // taglist should not be in DOM if multiple === false\n    if (!this._multiple) {\n      this.removeChild(this._elements.taglist);\n    } else {\n      this.appendChild(this._elements.taglist);\n    }\n\n    // we need to remove and re-add the native select to loose the selection\n    if (this._nativeInput) {\n      this.removeChild(this._elements.nativeSelect);\n    }\n    this._elements.nativeSelect.multiple = this._multiple;\n    this._elements.nativeSelect.selectedIndex = -1;\n\n    if (this._nativeInput) {\n      if (this._multiple) {\n        // We might not be rendered yet\n        if (this._elements.nativeSelect.parentNode) {\n          this.insertBefore(this._elements.nativeSelect, this._elements.taglist);\n        }\n      } else {\n        this.appendChild(this._elements.nativeSelect);\n      }\n    }\n\n    this._elements.list.multiple = this._multiple;\n\n    // sets the correct name for value submission\n    this._setName(this.getAttribute('name') || '');\n\n    // we need to make sure the selection is valid\n    this._setStateFromDOM();\n\n    // everytime multiple changes, the state of the selectlist and taglist need to be updated\n    this.items.getAll().forEach((item) => {\n      if (this._multiple && item.hasAttribute('selected')) {\n        this._addTagToTagList(item);\n      } else {\n        // taglist is never used for multiple = false\n        this._removeTagFromTagList(item);\n\n        // when multiple = false and the item is selected, the value needs to be updated in the input\n        if (item.hasAttribute('selected')) {\n          this._elements.input.value = itemValueFromDOM(item);\n        }\n      }\n    });\n  }\n\n  /**\n   Contains a hint to the user of what can be selected in the component. If no placeholder is provided, the first\n   option will be displayed in the component.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   @htmlattributereflected\n   */\n  // p = placeholder, m = multiple, se = selected\n  // case 1:  p +  m +  se = p\n  // case 2:  p +  m + !se = p\n  // case 3: !p + !m +  se = se\n  // case 4: !p + !m + !se = firstSelectable (native behavior)\n  // case 5:  p + !m +  se = se\n  // case 6:  p + !m + !se = p\n  // case 7: !p +  m +  se = 'Select'\n  // case 8: !p +  m + !se = 'Select'\n  get placeholder() {\n    return this._placeholder || '';\n  }\n\n  set placeholder(value) {\n    this._placeholder = transform.string(value);\n    this._reflectAttribute('placeholder', this._placeholder);\n\n    // case 1:  p +  m +  se = p\n    // case 2:  p +  m + !se = p\n    // case 6:  p + !m + !se = p\n    if (this._placeholder && (this.hasAttribute('multiple') || !this.selectedItem)) {\n      this._elements.label.classList.add('is-placeholder');\n      this._elements.label.textContent = this._placeholder;\n    }\n      // case 7: !p +  m +  se = 'Select'\n    // case 8: !p +  m + !se = 'Select'\n    else if (this.hasAttribute('multiple')) {\n      this._elements.label.classList.add('is-placeholder');\n      this._elements.label.textContent = i18n.get('Select');\n    }\n    // case 4: !p + !m + !se = firstSelectable (native behavior)\n    else if (!this.selectedItem) {\n      // we clean the value because there is no selected item\n      this._elements.input.value = '';\n\n      // gets the first candidate for selection\n      const placeholderItem = this.items._getFirstSelectable();\n      this._elements.label.classList.remove('is-placeholder');\n\n      if (placeholderItem) {\n        // selects using the attribute in case the item is not yet initialized\n        placeholderItem.setAttribute('selected', '');\n        this._elements.label.innerHTML = placeholderItem.innerHTML;\n      } else {\n        // label must be cleared when there is no placeholder and no item to select\n        this._elements.label.textContent = '';\n      }\n    }\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this.multiple ? this._elements.taglist.name : this._elements.input.name;\n  }\n\n  set name(value) {\n    this._setName(value);\n    this._reflectAttribute('name', this.name);\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    // we leverage the internal elements to know the value, this way we are always sure that the server submission\n    // will be correct\n    return this.multiple ? this._elements.taglist.value : this._elements.input.value;\n  }\n\n  set value(value) {\n    // we rely on the the values property to handle this correctly\n    this.values = [value];\n  }\n\n  /**\n   The current selected values, as submitted during form submission. When {@link Coral.Select#multiple} is\n   <code>false</code>, this will be an array of length 1.\n\n   @type {Array.<String>}\n   */\n  get values() {\n    if (this.multiple) {\n      return this._elements.taglist.values;\n    }\n\n    // if there is a selection, we return whatever value it has assigned\n    return this.selectedItem ? [this._elements.input.value] : [];\n  }\n\n  set values(values) {\n    if (Array.isArray(values)) {\n      // when multiple = false, we explicitely ignore the other values and just set the first one\n      if (!this.multiple && values.length > 1) {\n        values = [values[0]];\n      }\n\n      // gets all the items\n      const items = this.items.getAll();\n\n      let itemValue;\n      // if multiple, we need to explicitely set the selection state of every item\n      if (this.multiple) {\n        items.forEach((item) => {\n          // we use DOM API instead of properties in case the item is not yet initialized\n          itemValue = itemValueFromDOM(item);\n          // if the value is located inside the values array, then we set the item as selected\n          item[values.indexOf(itemValue) !== -1 ? 'setAttribute' : 'removeAttribute']('selected', '');\n        });\n      }\n        // if single selection, we find the first item that matches the value and deselect everything else. in case,\n      // no item matches the value, we may need to find a selection candidate\n      else {\n        let targetItem;\n        // since multiple = false, there is only 1 value value\n        const value = values[0] || '';\n\n        items.forEach((item) => {\n          // small optimization to avoid calculating the value from every item\n          if (!targetItem) {\n            itemValue = itemValueFromDOM(item);\n\n            if (itemValue === value) {\n              // selecting the item will cause the taglist or input to be updated\n              item.setAttribute('selected', '');\n              // we store the first ocurrence, afterwards we deselect all items\n              targetItem = item;\n\n              // since we found our target item, we continue to avoid removing the selected attribute\n              return;\n            }\n          }\n\n          // every-non targetItem must be deselected\n          item.removeAttribute('selected');\n        });\n\n        // if no targetItem was found, _setStateFromDOM will make sure that the state is valid\n        if (!targetItem) {\n          this._setStateFromDOM();\n        }\n      }\n    }\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n\n    this._elements.button.disabled = this._disabled;\n    this._elements.input.disabled = this._disabled;\n    this._elements.taglist.disabled = this._disabled;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#invalid}.\n   */\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this.classList.toggle('is-invalid', this.invalid);\n    this._elements.button.classList.toggle('is-invalid', this.invalid);\n    this._elements.invalidIcon.hidden = !this.invalid;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n    this._elements.taglist.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.input.readOnly = this._readOnly;\n    this._elements.taglist.readOnly = this._readOnly;\n    this._elements.taglist.disabled = this._readOnly;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    if (this.labelled) {\n      if (!this.labelledBy) {\n        this._elements.button.setAttribute('aria-labelledby', `${this._elements.button.id} ${this._elements.label.id} ${this.invalid ? this._elements.invalidIcon.id : ''}`);\n      }\n      this._elements.nativeSelect.setAttribute('aria-label', value);\n    } else {\n      this._elements.button.removeAttribute('aria-label');\n      this._elements.nativeSelect.removeAttribute('aria-label');\n      if (!this.labelledBy) {\n        this._elements.button.removeAttribute('aria-labelledby');\n      }\n    }\n\n    this._elements.taglist.labelled = value;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return this._labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n    this._labelledBy = super.labelledBy;\n\n    if (this._labelledBy) {\n      this._elements.button.setAttribute('aria-labelledby', `${this._labelledBy} ${this._elements.label.id} ${this.invalid ? this._elements.invalidIcon.id : ''}`);\n      this._elements.nativeSelect.setAttribute('aria-labelledby', this._labelledBy);\n    } else {\n      this._elements.nativeSelect.removeAttribute('aria-labelledby');\n\n      // if the select is also labelled, make sure that aria-labelledby gets restored\n      if (this.labelled) {\n        this.labelled = this.labelled;\n      }\n    }\n\n    this._elements.taglist.labelledBy = this._labelledBy;\n  }\n\n  /**\n   Returns the first selected item in the Select. The value <code>null</code> is returned if no element is\n   selected.\n\n   @type {?HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.hasAttribute('multiple') ? this.items._getFirstSelected() : this.items._getLastSelected();\n  }\n\n  /**\n   Returns an Array containing the set selected items.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    if (this.hasAttribute('multiple')) {\n      return this.items._getAllSelected();\n    }\n\n    const item = this.selectedItem;\n    return item ? [item] : [];\n  }\n\n  /**\n   Indicates that the Select is currently loading remote data. This will set the wait indicator inside the list.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute loading\n   */\n  get loading() {\n    return this._elements.list.loading;\n  }\n\n  set loading(value) {\n    this._elements.list.loading = value;\n  }\n\n  /**\n   The Select's variant. See {@link SelectVariantEnum}.\n\n   @type {SelectVariantEnum}\n   @default SelectVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this._elements.button.classList.toggle('_coral-FieldButton--quiet', this._variant === variant.QUIET);\n  }\n\n  /** @ignore */\n  _setName(value) {\n    if (this.multiple) {\n      this._elements.input.name = '';\n      this._elements.taglist.setAttribute('name', value);\n    } else {\n      this._elements.taglist.setAttribute('name', '');\n      this._elements.input.name = value;\n    }\n  }\n\n  /**\n   @param {Boolean} [checkAvailableSpace=false]\n   If <code>true</code>, the event is triggered based on the available space.\n\n   @private\n   */\n  _showOptions(checkAvailableSpace) {\n    if (checkAvailableSpace) {\n      // threshold in pixels\n      const ITEM_SIZE_THRESHOLD = 30;\n\n      let scrollHeight = this._elements.list.scrollHeight;\n      const viewportHeight = this._elements.list.clientHeight;\n      const scrollTop = this._elements.list.scrollTop;\n      // we should not do this, but it increases performance since we do not need to find the item\n      const loadIndicator = this._elements.list._elements.loadIndicator;\n\n      // we remove the size of the load indicator\n      if (loadIndicator && loadIndicator.parentNode) {\n        const outerHeight = function (el) {\n          let height = el.offsetHeight;\n          const style = getComputedStyle(el);\n\n          height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10);\n          return height;\n        };\n\n        scrollHeight -= outerHeight(loadIndicator);\n      }\n\n      // if we are not close to the bottom scroll, we cancel triggering the event\n      if (scrollTop + viewportHeight < scrollHeight - ITEM_SIZE_THRESHOLD) {\n        return;\n      }\n    }\n\n    // we do not show the list with native\n    if (!this._useNativeInput) {\n      if (!this._elements.overlay.open) {\n        // Show the overlay\n        this._elements.overlay.open = true;\n      }\n\n      // Force overlay repositioning (remote loading)\n      requestAnimationFrame(() => {\n        this._elements.overlay._onAnimate();\n        this._elements.overlay.reposition();\n      });\n    }\n\n    // Trigger an event\n    // @todo: maybe we should only trigger this event when the button is toggled and we have space for more items\n    const event = this.trigger('coral-select:showitems', {\n      // amount of items in the select\n      start: this.items.length\n    });\n\n    // while using native there is no need to show the loading\n    if (!this._useNativeInput) {\n      // if the default is prevented, we should the loading indicator\n      this._elements.list.loading = event.defaultPrevented;\n    }\n\n    // communicate expanded state to assistive technology\n    this._elements.button.setAttribute('aria-expanded', true);\n  }\n\n  /** @private */\n  _hideOptions() {\n    // Don't close the overlay if selection = multiple\n    if (!this.multiple) {\n      this._elements.overlay.open = false;\n\n      this.trigger('coral-select:hideitems');\n    }\n\n    // communicate collapsed state to assistive technology\n    this._elements.button.setAttribute('aria-expanded', false);\n  }\n\n  /** @ignore */\n  _onGlobalClick(event) {\n    if (!this._elements.overlay.open) {\n      return;\n    }\n\n    const eventTargetWithinOverlayTarget = this._elements.button.contains(event.target);\n    const eventTargetWithinItself = this._elements.overlay.contains(event.target);\n    if (!eventTargetWithinOverlayTarget && !eventTargetWithinItself) {\n      this._hideOptions();\n    }\n  }\n\n  /** @private */\n  _onSelectListItemAdd(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    // When items have been added, we are no longer loading\n    this.loading = false;\n\n    // Reset height\n    this._elements.list.style.height = '';\n\n    // Measure actual height\n    const style = window.getComputedStyle(this._elements.list);\n    const height = parseInt(style.height, 10);\n    const maxHeight = parseInt(style.maxHeight, 10);\n\n    if (height < maxHeight) {\n      // Make it scrollable\n      this._elements.list.style.height = `${height - 1}px`;\n    }\n  }\n\n  _onBeforeOpen(event) {\n    event.stopImmediatePropagation();\n\n    // Prevent opening the overlay if select is readonly\n    if (this.readOnly) {\n      event.preventDefault();\n    }\n\n    // focus first selected or tabbable item when the list expands\n    this._elements.list._resetTabTarget(true);\n  }\n\n  /** @private */\n  _onInternalEvent(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n  }\n\n  /** @ignore */\n  _onItemAdded(item) {\n    const selectListItemParent = this._elements.list;\n\n    const selectListItem = item._selectListItem || new SelectList.Item();\n\n    // @todo: Make sure it is added at the right index.\n    selectListItemParent.appendChild(selectListItem);\n\n    selectListItem.set({\n      value: item.value,\n      content: {\n        innerHTML: item.innerHTML\n      },\n      disabled: item.disabled,\n      selected: item.selected,\n      trackingElement: item.trackingElement\n    }, true);\n\n    const nativeOption = item._nativeOption || new Option();\n\n    // @todo: make sure it is added at the right index.\n    this._elements.nativeSelect.appendChild(nativeOption);\n\n    // Need to store the initially selected values in the native select so that it can be reset\n    if (this._initialValues.indexOf(item.value) !== -1) {\n      nativeOption.setAttribute('selected', 'selected');\n    }\n\n    nativeOption.selected = item.selected;\n    nativeOption.value = item.value;\n    nativeOption.disabled = item.disabled;\n    nativeOption.innerHTML = item.innerHTML;\n\n    if (this.multiple) {\n      // in case it was selected before it was added\n      if (item.selected) {\n        this._addTagToTagList(item);\n      }\n    }\n    // Make sure the input value is set to the selected item\n    else if (item.selected) {\n      this._elements.input.value = item.value;\n    }\n\n    item._selectListItem = selectListItem;\n    item._nativeOption = nativeOption;\n\n    selectListItem._selectItem = item;\n    nativeOption._selectItem = item;\n\n    const messenger = item._messenger;\n\n    if (messenger && messenger.isConnected && messenger.listeners.length === 0) {\n      // sometimes child get connected before parent, and listeners are not set yet, so we need to reconnect\n      messenger._connected = false;\n      messenger.connect();\n    }\n  }\n\n  /** @private */\n  _onItemRemoved(item) {\n    if (item._selectListItem) {\n      item._selectListItem.remove();\n      item._selectListItem._selectItem = undefined;\n      item._selectListItem = undefined;\n    }\n\n    if (item._nativeOption) {\n      this._elements.nativeSelect.removeChild(item._nativeOption);\n      item._nativeOption._selectItem = undefined;\n      item._nativeOption = undefined;\n    }\n\n    this._removeTagFromTagList(item, true);\n  }\n\n  /** @private */\n  _onItemSelected(item) {\n    // in case the component is not in the DOM or the internals have not been created we force it\n    if (!item._selectListItem || !item._selectListItem.parentNode) {\n      this._onItemAdded(item);\n    }\n\n    item._selectListItem.selected = true;\n    item._nativeOption.selected = true;\n\n    if (this.multiple) {\n      this._addTagToTagList(item);\n      // @todo: what happens when ALL items have been selected\n      //  1. a message is disabled (i18n?)\n      //  2. we don't try to open the selectlist (native behavior).\n    } else {\n      this._elements.input.value = item.value;\n    }\n  }\n\n  /** @private */\n  _onItemDeselected(item) {\n    // in case the component is not in the DOM or the internals have not been created we force it\n    if (!item._selectListItem || !item._selectListItem.parentNode) {\n      this._onItemAdded(item);\n    }\n\n    item._selectListItem.selected = false;\n    item._nativeOption.selected = false;\n\n    if (this.multiple) {\n      // we use the internal reference to remove the related tag from the taglist\n      this._removeTagFromTagList(item);\n    }\n  }\n\n  /**\n   Detects when something is about to change inside the select.\n\n   @private\n   */\n  _onSelectListBeforeChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    // We prevent the selection to change if we're in single selection and the clicked item is already selected\n    if (!this.multiple && event.detail.item.selected) {\n      event.preventDefault();\n      this._elements.overlay.open = false;\n    }\n  }\n\n  /**\n   Detects when something inside the select list changes.\n\n   @private\n   */\n  _onSelectListChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    // avoids triggering unnecessary changes in the selectist because selecting items programatically will trigger\n    // a change event\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    let oldSelection = event.detail.oldSelection || [];\n    oldSelection = !Array.isArray(oldSelection) ? [oldSelection] : oldSelection;\n\n    let selection = event.detail.selection || [];\n    selection = !Array.isArray(selection) ? [selection] : selection;\n\n    // if the arrays are the same, there is no point in calculating the selection changes\n    if (event.detail.oldSelection !== event.detail.selection) {\n      this._bulkSelectionChange = true;\n\n      // we deselect first the ones that have to go\n      const removedSelection = arrayDiff(oldSelection, selection);\n      removedSelection.forEach((listItem) => {\n        // selectlist will report on removed items\n        if (listItem._selectItem) {\n          listItem._selectItem.removeAttribute('selected');\n        }\n      });\n\n      // we only sync the items that changed\n      const newSelection = arrayDiff(selection, oldSelection);\n      newSelection.forEach((listItem) => {\n        if (listItem._selectItem) {\n          listItem._selectItem.setAttribute('selected', '');\n        }\n      });\n\n      this._bulkSelectionChange = false;\n\n      // hides the list since something was selected. if the overlay was open, it means there was user interaction so\n      // the necessary events need to be triggered\n      if (this._elements.overlay.open) {\n        // closes and triggers the hideitems event\n        this._hideOptions();\n\n        // if there is a change in the added or removed selection, we trigger a change event\n        if (newSelection.length || removedSelection.length) {\n          this.trigger('change');\n        }\n      }\n    }\n      // in case they are the same, we just need to trigger the hideitems event when appropiate, and that is when the\n    // overlay was previously open\n    else if (this._elements.overlay.open) {\n      // closes and triggers the hideitems event\n      this._hideOptions();\n    }\n\n    if (!this.multiple) {\n      this._trackEvent('change', 'coral-select-item', event, this.selectedItem);\n    }\n  }\n\n  /** @private */\n  _onTagListChange(event) {\n    // cancels the change event from the taglist\n    event.stopImmediatePropagation();\n\n    // avoids triggering unnecessary changes in the selectist because selecting items programatically will trigger\n    // a change event\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    this._bulkSelectionChange = true;\n\n    const values = event.target.values;\n    // we use the selected items, because they are the only possible items that may change\n    let itemValue;\n    this.items._getAllSelected().forEach((item) => {\n      // we use DOM API instead of properties in case the item is not yet initialized\n      itemValue = itemValueFromDOM(item);\n      // if the item is inside the values array, then it has to be selected\n      item[values.indexOf(itemValue) !== -1 ? 'setAttribute' : 'removeAttribute']('selected', '');\n    });\n\n    this._bulkSelectionChange = false;\n\n    // if the taglist is empty, we should return the focus to the button\n    if (!values.length) {\n      this._elements.button.focus();\n    }\n\n    // reparents the change event with the select as the target\n    this.trigger('change');\n  }\n\n  /** @private */\n  _addTagToTagList(item) {\n    // we prepare the tag\n    item._tag = item._tag || new Tag();\n    item._tag.set({\n      value: item.value,\n      label: {\n        innerHTML: item.innerHTML\n      }\n    }, true);\n\n    // we add the new tag at the end\n    this._elements.taglist.items.add(item._tag);\n  }\n\n  /** @private */\n  _removeTagFromTagList(item, destroy) {\n    if (item._tag) {\n      item._tag.remove();\n      // we only remove the reference if destroy is passed, this allow us to recycle the tags when possible\n      item._tag = destroy ? undefined : item._tag;\n    }\n  }\n\n  /** @private */\n  _onSelectListScrollBottom(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    if (this._elements.overlay.open) {\n      // Checking if the overlay is open guards against debounced scroll events being handled after an overlay has\n      // already been closed (e.g. clicking the last element in a selectlist always reopened the overlay emediately\n      // after closing)\n\n      // triggers the corresponding event\n      // since we got the the event from select list we need to trigger the event\n      this._showOptions();\n    }\n  }\n\n  /** @private */\n  _onButtonClick(event) {\n    event.preventDefault();\n\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    // if native is required, we do not need to do anything\n    if (!this._useNativeInput) {\n      // @todo: this was removed cause otherwise the coral-select:showitems event is never triggered.\n      // if this is a multiselect and all items are selected, there should be nothing in the list to focus so do\n      // nothing.\n      // if (this.multiple && this.selectedItems.length === this.items.length) {\n      //   return;\n      // }\n\n      // Toggle openness\n      if (this._elements.overlay.classList.contains('is-open')) {\n        this._hideOptions();\n      } else {\n        // event should be triggered based on the contents\n        this._showOptions(true);\n      }\n    }\n  }\n\n  /** @private */\n  _onNativeSelectClick() {\n    this._showOptions(false);\n  }\n\n  _onOverlayKeyPress(event) {\n    // Focus on item which text starts with pressed keys\n    this._elements.list._onKeyPress(event);\n  }\n\n  /** @private */\n  _onSpaceKey(event) {\n    if (this.disabled || this.readOnly) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this._useNativeInput) {\n      // we try to open the native select\n      this._elements.nativeSelect.dispatchEvent(new MouseEvent('mousedown'));\n    } else if (!this._elements.overlay.open || event.keyCode === Keys.keyToCode('space')) {\n      this._elements.button.click();\n    }\n  }\n\n  /**\n   Prevents tab key default handling on selectList Items.\n\n   @private\n   */\n  // _onTabKey(event) {\n  // event.preventDefault();\n  // }\n\n  /** @private */\n  _onOverlayToggle(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    // Trigger private event instead\n    const type = event.type.split(':').pop();\n    this.trigger(`coral-select:_overlay${type}`);\n\n    this._elements.button.classList.toggle('is-selected', event.target.open);\n\n    // communicate expanded state to assistive technology\n    this._elements.button.setAttribute('aria-expanded', event.target.open);\n\n    if (!event.target.open) {\n      this.classList.remove('is-openAbove', 'is-openBelow');\n    }\n  }\n\n  /** @private */\n  _onOverlayPositioned(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    if (this._elements.overlay.open) {\n      this._elements.overlay.style.width = `${this.offsetWidth}px`;\n    }\n  }\n\n  // @todo: while the select is multiple, if everything is deselected no change event will be triggered.\n  _onNativeSelectChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    // avoids triggering unnecessary changes in the selectist because selecting items programatically will trigger\n    // a change event\n    if (this._bulkSelectionChange) {\n      return;\n    }\n\n    this._bulkSelectionChange = true;\n    // extracts the native options for the selected items. We use the selected options, instead of the complete\n    // options to make the diff since it will normally be a smaller set\n    const oldSelectedOptions = this.selectedItems.map((element) => element._nativeOption);\n\n    // we convert the HTMLCollection to an array\n    const selectedOptions = Array.prototype.slice.call(event.target.querySelectorAll(':checked'));\n\n    const diff = arrayDiff(oldSelectedOptions, selectedOptions);\n    diff.forEach((item) => {\n      item._selectItem.selected = false;\n    });\n\n    // we only sync the items that changed\n    const newSelection = arrayDiff(selectedOptions, oldSelectedOptions);\n    newSelection.forEach((item) => {\n      item._selectItem.selected = true;\n    });\n\n    this._bulkSelectionChange = false;\n\n    // since multiple keeps the select open, we cannot return the focus to the button otherwise the user cannot\n    // continue selecting values\n    if (!this.multiple) {\n      // returns the focus to the button, otherwise the select will keep it\n      this._elements.button.focus();\n      // since selecting an item closes the native select, we need to trigger an event\n      this.trigger('coral-select:hideitems');\n    }\n\n    // if the native change event was triggered, then it means there is some new value\n    this.trigger('change');\n  }\n\n  /**\n   This handles content change of coral-select-item and updates its associatives.\n\n   @private\n   */\n  _onItemContentChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    if (item._selectListItem) {\n      const content = new SelectList.Item.Content();\n      content.innerHTML = item.innerHTML;\n      item._selectListItem.content = content;\n    }\n\n    if (item._nativeOption) {\n      item._nativeOption.innerHTML = item.innerHTML;\n    }\n\n    if (item._tag && item._tag.label) {\n      item._tag.label.innerHTML = item.innerHTML;\n    }\n\n    // since the content changed, we need to sync the placeholder in case it was the selected item\n    this._syncSelectedItemPlaceholder();\n  }\n\n  /** @private */\n  _syncSelectedItemPlaceholder() {\n    this.placeholder = this.getAttribute('placeholder');\n\n    // case 3: !p + !m +  se = se\n    // case 5:  p + !m +  se = se\n    if (this.selectedItem && !this.multiple) {\n      this._elements.label.classList.remove('is-placeholder');\n      this._elements.label.innerHTML = this.selectedItem.innerHTML;\n    }\n  }\n\n  /**\n   This handles value change of coral-select-item and updates its associatives.\n\n   @private\n   */\n  _onItemValueChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    if (item._selectListItem) {\n      item._selectListItem.value = item.value;\n    }\n\n    if (item._nativeOption) {\n      item._nativeOption.value = item.value;\n    }\n\n    if (item._tag) {\n      item._tag.value = item.value;\n    }\n  }\n\n  /**\n   This handles disabled change of coral-select-item and updates its associatives.\n\n   @private\n   */\n  _onItemDisabledChange(event) {\n    // stops propagation cause the event is internal to the component\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    if (item._selectListItem) {\n      item._selectListItem.disabled = item.disabled;\n    }\n\n    if (item._nativeOption) {\n      item._nativeOption.disabled = item.disabled;\n    }\n  }\n\n  /**\n   In case an item from the initial selection is removed, we need to remove it from the initial values.\n\n   @private\n   */\n  _validateInitialState(nodes) {\n    let item;\n    let index;\n\n    // we iterate over all the nodes, checking if they matched the initial value\n    for (let i = 0, nodeCount = nodes.length ; i < nodeCount ; i++) {\n      // since we are not sure if the item has been upgraded, we try first the attribute, otherwise we extract the\n      // value from the textContent\n      item = nodes[i];\n\n      index = this._initialValues.indexOf(item.value);\n\n      if (index !== -1) {\n        this._initialValues.splice(index, 1);\n      }\n    }\n  }\n\n  /** @private */\n  // eslint-disable-next-line no-unused-vars\n  _onCollectionChange(addedNodes, removedNodes) {\n    // we make sure that items that were part of the initial selection are removed from the internal representation\n    this._validateInitialState(removedNodes);\n    // makes sure that the selection state matches the multiple variable\n    this._setStateFromDOM();\n  }\n\n  /**\n   Updates the label to reflect the current state. The label needs to be updated when the placeholder changes and\n   when the selection changes.\n\n   @private\n   */\n  _updateLabel() {\n    this._syncSelectedItemPlaceholder();\n  }\n\n  /**\n   Handles the selection state.\n\n   @ignore\n   */\n  _setStateFromDOM() {\n    // if it is not multiple, we need to be sure only one item is selected\n    if (!this.hasAttribute('multiple')) {\n      // makes sure that only one is selected\n      this.items._deselectAllExceptLast();\n\n      // we execute _getFirstSelected instead of _getSelected because it is faster\n      const selectedItem = this.items._getFirstSelected();\n\n      // case 1. there is a selected item, so no further change is required\n      // case 2. no selected item and no placeholder. an item will be automatically selected\n      // case 3. no selected item and a placehoder. we just make sure the value is really empty\n      if (!selectedItem) {\n        // we clean the value because there is no selected item\n        this._elements.input.value = '';\n\n        // when there is no placeholder, we need to force a selection to behave like the native select\n        if (transform.string(this.getAttribute('placeholder')) === '') {\n          // gets the first candidate for selection\n          const selectable = this.items._getFirstSelectable();\n\n          if (selectable) {\n            // selects using the attribute in case the item is not yet initialized\n            selectable.setAttribute('selected', '');\n            // we set the value explicitely, so we do not need to wait for the MO\n            this._elements.input.value = itemValueFromDOM(selectable);\n          }\n        }\n      } else {\n        // we set the value explicitely, so we do not need to wait for the MO\n        this._elements.input.value = itemValueFromDOM(selectedItem);\n      }\n    }\n\n    // handles the initial item in the select\n    this._updateLabel();\n  }\n\n  /**\n   Handles selecting multiple items. Selection could result a single or multiple selected items.\n\n   @private\n   */\n  _onItemSelectedChange(event) {\n    // we stop propagation since it is a private event\n    event.stopImmediatePropagation();\n\n    // the item that was selected\n    const item = event.target;\n\n    // setting this to true will ignore any changes from the selectlist al\n    this._bulkSelectionChange = true;\n\n    // when the item is selected, we need to enforce the selection mode\n    if (item.selected) {\n      this._onItemSelected(item);\n\n      if (this.multiple) {\n        this._trackEvent('select', 'coral-select-item', event, item);\n      }\n\n      // enforces the selection mode\n      if (!this.hasAttribute('multiple')) {\n        this.items._deselectAllExcept(item);\n      }\n    } else {\n      this._onItemDeselected(item);\n\n      if (this.multiple) {\n        this._trackEvent('deselect', 'coral-select-item', event, item);\n      }\n    }\n\n    this._bulkSelectionChange = false;\n\n    // since there is a change in selection, we need to update the placeholder\n    this._updateLabel();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#clear}.\n   */\n  clear() {\n    this.value = '';\n  }\n\n  /**\n   Focuses the component.\n\n   @ignore\n   */\n  focus() {\n    if (!this.contains(document.activeElement)) {\n      this._elements.button.focus();\n    }\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // reset the values to the initial values\n    this.values = this._initialValues;\n  }\n\n  /**\n   Returns {@link Select} variants.\n\n   @return {SelectVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'multiple', 'placeholder', 'loading']);\n  }\n\n  get observedMessages() {\n    return {\n      'coral-select-item:_valuechanged': '_onItemValueChange',\n      'coral-select-item:_contentchanged': '_onItemContentChange',\n      'coral-select-item:_disabledchanged': '_onItemDisabledChange',\n      'coral-select-item:_selectedchanged': '_onItemSelectedChange',\n    };\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    this.classList.toggle(`${CLASSNAME}--native`, this._useNativeInput);\n\n    if (!this._useNativeInput && this.contains(this._elements.nativeSelect)) {\n      this.removeChild(this._elements.nativeSelect);\n    }\n\n    // handles the initial selection\n    this._setStateFromDOM();\n\n    // we need to keep a state of the initial items to be able to reset the component. values is not reliable during\n    // initialization since items are not yet initialized\n    this.selectedItems.forEach((item) => {\n      // we use DOM API instead of properties in case the item is not yet initialized\n      this._initialValues.push(itemValueFromDOM(item));\n    });\n\n    // Cleanup template elements (supporting cloneNode)\n    const templateElements = this.querySelectorAll('[handle]');\n    for (let i = 0 ; i < templateElements.length ; ++i) {\n      const currentElement = templateElements[i];\n      if (currentElement.parentNode === this) {\n        this.removeChild(currentElement);\n      }\n    }\n\n    // Render the main template\n    const frag = document.createDocumentFragment();\n\n    frag.appendChild(this._elements.button);\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.nativeSelect);\n    frag.appendChild(this._elements.taglist);\n    frag.appendChild(this._elements.overlay);\n\n    // avoid popper initialisation if popper neither exist nor overlay opened.\n    this._elements.overlay._avoidPopperInit = this._elements.overlay.open || this._elements.overlay._popper ? false : true;\n\n    // Assign the button as the target for the overlay\n    this._elements.overlay.target = this._elements.button;\n    // handles the focus allocation every time the overlay closes\n    this._elements.overlay.returnFocusTo(this._elements.button);\n\n    this.appendChild(frag);\n\n    // set this to false after overlay has been connected to avoid connected callback target setting\n    delete this._elements.overlay._avoidPopperInit;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n\n  /**\n   Triggered when the {@link Select} could accept external data to be loaded by the user. If <code>preventDefault()</code> is\n   called, then a loading indicator will be shown. {@link Select#loading} should be set to false to indicate\n   that the data has been successfully loaded.\n\n   @typedef {CustomEvent} coral-select:showitems\n\n   @property {Number} detail.start\n   The count of existing items, which is the index where new items should start.\n   */\n\n  /**\n   Triggered when the {@link Select} hides the UI used to select items. This is typically used to cancel a load request\n   because the items will not be shown anymore.\n\n   @typedef {CustomEvent} coral-select:hideitems\n   */\n});\n\nexport default Select;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-select/src/scripts/Select.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1447,
    "kind": "typedef",
    "name": "SelectVariantEnum",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~SelectVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Select} variants.",
    "lineNumber": 35,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default, gray Select."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A Select with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "SelectVariantEnum"
    }
  },
  {
    "__docId__": 1448,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 40,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1449,
    "kind": "variable",
    "name": "IS_MOBILE_DEVICE",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~IS_MOBILE_DEVICE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1450,
    "kind": "function",
    "name": "itemValueFromDOM",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~itemValueFromDOM",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Extracts the value from the item in case no explicit value was provided.",
    "lineNumber": 55,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} the value that will be submitted for this item."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "the item whose value will be extracted."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "the value that will be submitted for this item."
    },
    "ignore": true
  },
  {
    "__docId__": 1451,
    "kind": "function",
    "name": "arrayDiff",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~arrayDiff",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Calculates the difference between two given arrays. It returns the items that are in a that are not in b.",
    "lineNumber": 70,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array.<String>}\nthe difference between the arrays."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Array.<String>"
        ],
        "spread": false,
        "optional": false,
        "name": "a",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "Array.<String>"
        ],
        "spread": false,
        "optional": false,
        "name": "b",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array.<String>"
      ],
      "spread": false,
      "description": "the difference between the arrays."
    },
    "ignore": true
  },
  {
    "__docId__": 1452,
    "kind": "variable",
    "name": "Select",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~Select",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Select}",
    "description": "A Select component is a form field that allows users to select from a list of options. If this component is\nshown on a mobile device, it will show a native select list, instead of the select list styled via Coral Spectrum.",
    "lineNumber": 83,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Select"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Select component is a form field that allows users to select from a list of options. If this component is\nshown on a mobile device, it will show a native select list, instead of the select list styled via Coral Spectrum."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-select"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-select></coral-select>",
      "<caption>JS constructor</caption>\nnew Coral.Select();"
    ],
    "see": [
      "../examples/#select"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1453,
    "kind": "typedef",
    "name": "coral-select:showitems",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~coral-select:showitems",
    "access": "public",
    "description": "Triggered when the {@link Select} could accept external data to be loaded by the user. If <code>preventDefault()</code> is\ncalled, then a loading indicator will be shown. {@link Select#loading} should be set to false to indicate\nthat the data has been successfully loaded.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.start",
        "description": "The count of existing items, which is the index where new items should start."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-select:showitems"
    }
  },
  {
    "__docId__": 1454,
    "kind": "typedef",
    "name": "coral-select:hideitems",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/Select.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/Select.js~coral-select:hideitems",
    "access": "public",
    "description": "Triggered when the {@link Select} hides the UI used to select items. This is typically used to cancel a load request\nbecause the items will not be shown anymore.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-select:hideitems"
    }
  },
  {
    "__docId__": 1455,
    "kind": "file",
    "name": "coral-spectrum/coral-component-select/src/scripts/SelectItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\nimport {Messenger} from '../../../coral-messenger';\n\n/**\n @class Coral.Select.Item\n @classdesc A Select item component\n @htmltag coral-select-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SelectItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // messenger\n    this._messenger = new Messenger(this);\n    this._observer = new MutationObserver(this._handleMutation.bind(this));\n    this._observer.observe(this, {\n      characterData: true,\n      childList: true,\n      subtree: true\n    });\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Whether this item is disabled. When set to <code>true</code>, this will prevent every user interaction with the\n   item. If disabled is set to <code>true</code> for a selected item it will be deselected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    value = transform.booleanAttr(value);\n\n    if(validate.valueMustChange(this._disabled, value)) {\n      this._disabled = value;\n      this._reflectAttribute('disabled', value);\n      this._messenger.postMessage('coral-select-item:_disabledchanged');\n    }\n  }\n\n  /**\n   Whether the item is selected. Selected cannot be set to <code>true</code> if the item is disabled.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n\n    if(validate.valueMustChange(this._selected, value)) {\n      this._selected = value;\n      this._reflectAttribute('selected', value);\n      this._messenger.postMessage('coral-select-item:_selectedchanged');\n    }\n  }\n\n  /**\n   Value of the item. If not explicitly set, the value of <code>Node.textContent</code> is returned.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    let val = this._value;\n    if (typeof this._value === 'undefined') {\n      if (this.getAttribute('value') === null) {\n        // keep spaces to only 1 max and trim to mimic native select option behavior\n        val = this.textContent.replace(/\\s{2,}/g, ' ').trim();\n      } else {\n        val = this.getAttribute('value');\n      }\n    }\n\n    return val;\n  }\n\n  set value(value) {\n    value = transform.string(value);\n\n    if(validate.valueMustChange(this._value, value)) {\n      this._value = value;\n      this._reflectAttribute('value', value);\n      this._messenger.postMessage('coral-select-item:_valuechanged');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      this.value || this.textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @private */\n  _handleMutation() {\n    this._messenger.postMessage('coral-select-item:_contentchanged', {\n      content: this.textContent\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'value']);\n  }\n\n  /** @ignore */\n  _suspendCallback() {\n    super._suspendCallback();\n    this._messenger.disconnect();\n  }\n\n  /** @ignore */\n  _resumeCallback() {\n    this._messenger.connect();\n    super._resumeCallback();\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    this._messenger.connect();\n    super.connectedCallback();\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._messenger.disconnect();\n  }\n});\n\nexport default SelectItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-select/src/scripts/SelectItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1456,
    "kind": "variable",
    "name": "SelectItem",
    "memberof": "coral-spectrum/coral-component-select/src/scripts/SelectItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-select/src/scripts/SelectItem.js~SelectItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Select}",
    "description": "A Select item component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Select.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Select item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-select-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-select-item></coral-select-item>",
      "<caption>JS constructor</caption>\nnew Coral.Select.Item();"
    ],
    "see": [
      "../examples/#select"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1457,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/Shell.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\n\nconst CLASSNAME = '_coral-Shell';\n\n/**\n @class Coral.Shell\n @classdesc The Shell base component to be used with its family for console like applications. See examples for how to\n integrate all Shell sub components.\n @htmltag coral-shell\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass Shell extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      header: this.querySelector('coral-shell-header') || document.createElement('coral-shell-header'),\n      content: this.querySelector('coral-shell-content') || document.createElement('coral-shell-content')\n    };\n  }\n\n  /**\n   The menu collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get menus() {\n    // Construct the collection on first request:\n    if (!this._menus) {\n      this._menus = new Collection({\n        host: this,\n        itemTagName: 'coral-shell-menu'\n      });\n    }\n\n    return this._menus;\n  }\n\n  /**\n   The shell header zone.\n\n   @type {ShellHeader}\n   @contentzone\n   */\n  get header() {\n    return this._getContentZone(this._elements.header);\n  }\n\n  set header(value) {\n    this._setContentZone('header', value, {\n      handle: 'header',\n      tagName: 'coral-shell-header',\n      insert: function (header) {\n        this.insertBefore(header, this.firstChild);\n      }\n    });\n  }\n\n  /**\n   The shell content zone.\n\n   @type {ShellContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-shell-content',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {\n      'coral-shell-header': 'header',\n      'coral-shell-content': 'content'\n    };\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const header = this._elements.header;\n    const menus = this.menus.getAll();\n    const content = this._elements.content;\n\n    // If the the content zone is not provided, we need to make sure that it holds all children\n    if (!content.parentNode) {\n      // Remove header\n      if (header.parentNode) {\n        header.parentNode.removeChild(header);\n      }\n\n      // Remove menus\n      this.menus.clear();\n\n      // Move the rest into content\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Call the content zone insert\n    this.header = header;\n    menus.forEach((menu) => this.menus.add(menu));\n    this.content = content;\n  }\n}\n\nexport default Shell;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/Shell.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1458,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1459,
    "kind": "class",
    "name": "Shell",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "The Shell base component to be used with its family for console like applications. See examples for how to\nintegrate all Shell sub components.",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Shell base component to be used with its family for console like applications. See examples for how to\nintegrate all Shell sub components."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell></coral-shell>",
      "<caption>JS constructor</caption>\nnew Coral.Shell();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1460,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 1461,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"header\": *, \"content\": *}"
      ]
    }
  },
  {
    "__docId__": 1462,
    "kind": "member",
    "name": "menus",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#menus",
    "access": "public",
    "description": "The menu collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1463,
    "kind": "member",
    "name": "_menus",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#_menus",
    "access": "private",
    "description": null,
    "lineNumber": 48,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1464,
    "kind": "member",
    "name": "header",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#header",
    "access": "public",
    "description": "The shell header zone.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 63,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellHeader"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1466,
    "kind": "member",
    "name": "content",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#content",
    "access": "public",
    "description": "The shell content zone.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 83,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellContent"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1468,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 97,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1469,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/Shell.js~Shell#render",
    "access": "public",
    "description": null,
    "lineNumber": 105,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1472,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.Content\n @classdesc Shell's content component\n @htmltag coral-shell-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1473,
    "kind": "function",
    "name": "ShellContent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellContent.js~ShellContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-content></coral-shell-content>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Content();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1474,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Overlay} from '../../../coral-component-overlay';\n\nconst CLASSNAME = '_coral-Shell-header';\n\n/**\n @class Coral.Shell.Header\n @classdesc A Shell Header component\n @htmltag coral-shell-header\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellHeader extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      home: this.querySelector('coral-shell-header-home') || document.createElement('coral-shell-header-home'),\n      actions: this.querySelector('coral-shell-header-actions') || document.createElement('coral-shell-header-actions'),\n      content: this.querySelector('coral-shell-header-content') || document.createElement('coral-shell-header-content')\n    };\n\n    Overlay._OverlayManager.push(this);\n  }\n\n  /**\n   The label of the panel.\n\n   @type {HTMLElement}\n   @contentzone\n   */\n  get home() {\n    return this._getContentZone(this._elements.home);\n  }\n\n  set home(value) {\n    this._setContentZone('home', value, {\n      handle: 'home',\n      tagName: 'coral-shell-header-home',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The main content zone of the panel.\n\n   @type {HTMLElement}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-shell-header-content',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The content zone where the actions are placed.\n\n   @type {HTMLElement}\n   @contentzone\n   */\n  get actions() {\n    return this._getContentZone(this._elements.actions);\n  }\n\n  set actions(value) {\n    this._setContentZone('actions', value, {\n      handle: 'actions',\n      tagName: 'coral-shell-header-actions',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {\n      'coral-shell-header-home': 'home',\n      'coral-shell-header-content': 'content',\n      'coral-shell-header-actions': 'actions'\n    };\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n    // appheader only exists on darkest theme\n    this.classList.add('coral--darkest', 'u-coral-clearFix');\n\n    const home = this._elements.home;\n    const actions = this._elements.actions;\n    const content = this._elements.content;\n\n    // Remove them so we can process children\n    if (home.parentNode) {\n      home.remove();\n    }\n    if (actions.parentNode) {\n      actions.remove();\n    }\n    if (content.parentNode) {\n      content.remove();\n    }\n\n    // moves everything to the main content zone\n    while (this.firstChild) {\n      content.appendChild(this.firstChild);\n    }\n\n    // // Call the content zone insert\n    this.home = home;\n    this.actions = actions;\n    this.content = content;\n  }\n}\n\nexport default ShellHeader;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1475,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1476,
    "kind": "class",
    "name": "ShellHeader",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Header component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Header component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-header"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-header></coral-shell-header>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Header();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1477,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 27,
    "ignore": true
  },
  {
    "__docId__": 1478,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 31,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"home\": *, \"actions\": *, \"content\": *}"
      ]
    }
  },
  {
    "__docId__": 1479,
    "kind": "member",
    "name": "home",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#home",
    "access": "public",
    "description": "The label of the panel.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 47,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1481,
    "kind": "member",
    "name": "content",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#content",
    "access": "public",
    "description": "The main content zone of the panel.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 67,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1483,
    "kind": "member",
    "name": "actions",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#actions",
    "access": "public",
    "description": "The content zone where the actions are placed.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 87,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1485,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 101,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1486,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHeader.js~ShellHeader#render",
    "access": "public",
    "description": null,
    "lineNumber": 110,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1490,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\nimport '../../../coral-component-search';\nimport {AnchorList} from '../../../coral-component-list';\nimport '../../../coral-component-wait';\nimport {commons, i18n} from '../../../coral-utils';\nimport help from '../templates/help';\nimport helpResult from '../templates/helpResult';\nimport helpSearchError from '../templates/helpSearchError';\nimport noHelpResults from '../templates/noHelpResults';\n\nconst CLASSNAMES = ['_coral-Menu', '_coral-AnchorList', '_coral-Shell-help'];\n\n/**\n @class Coral.Shell.Help\n @classdesc A Shell Help component\n @htmltag coral-shell-help\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellHelp extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {};\n    help.call(this._elements, {commons, i18n});\n\n    // Events\n    this._delegateEvents({\n      'coral-search:clear': '_showItems',\n      'coral-search:submit': '_performSearch'\n    });\n\n    // Item handling\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The item collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-shell-help-item',\n        itemBaseTagName: 'a',\n        container: this._elements.items\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   The search field placeholder.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute placeholder\n   */\n  get placeholder() {\n    return this._elements.search.placeholder;\n  }\n\n  set placeholder(value) {\n    this._elements.search.placeholder = value;\n  }\n\n  /** @private */\n  _moveItems() {\n    this.setAttribute('id', this.id || commons.getUID());\n\n    const selector = `#${this.id} > a[is=\"coral-shell-help-item\"], coral-shell-help-separator`;\n    Array.prototype.forEach.call(this.querySelectorAll(selector), (item) => {\n      this._elements.items.appendChild(item);\n    });\n  }\n\n  /** @private */\n  _performSearch(event) {\n    event.stopPropagation();\n\n    // Show loading\n    this._elements.items.hidden = true;\n    this._showLoading();\n    this._elements.resultMessage.hidden = true;\n    this._elements.results.hidden = true;\n\n    // Trigger event\n    const searchTerm = this._elements.search.value;\n    this.trigger('coral-shell-help:search', {\n      value: searchTerm\n    });\n  }\n\n  /** @private */\n  _showItems(event) {\n    event.stopPropagation();\n\n    // Hide search results\n    this._elements.results.hidden = true;\n\n    // Hide loading\n    this._hideLoading();\n\n    // Hide no-results\n    this._elements.resultMessage.hidden = true;\n\n    // Show items\n    this._elements.items.hidden = false;\n  }\n\n  /** @private */\n  _clearTimeout(timeoutName) {\n    if (this[timeoutName]) {\n      window.clearTimeout(this[timeoutName]);\n      this[timeoutName] = undefined;\n    }\n  }\n\n  /** @private */\n  _showMessage(elementName, message) {\n    const el = this._elements[elementName];\n    const timeoutName = `_${elementName}Timeout`;\n\n    // Show message element\n    el.hidden = false;\n\n    // Add message text after 150ms delay to give screen readers enough\n    // time to recognize the live region and respond to the text update\n    this._clearTimeout(timeoutName);\n    this[timeoutName] = window.setTimeout(() => el.appendChild(message), 150);\n  }\n\n  /** @private */\n  _showLoading() {\n    if (!this._elements.loading.hidden) {\n      return;\n    }\n\n    if (this._elements.loading.contains(this._elements.loadingMessage)) {\n      this._elements.loadingMessage = this._elements.loading.removeChild(this._elements.loadingMessage);\n    }\n\n    this._showMessage('loading', this._elements.loadingMessage);\n  }\n\n  /** @private */\n  _hideLoading() {\n    if (this._elements.loading.hidden) {\n      return;\n    }\n\n    this._elements.loading.hidden = true;\n\n    // clear the timeout\n    this._clearTimeout('_loadingTimeout');\n    if (this._elements.loading.contains(this._elements.loadingMessage)) {\n      this._elements.loadingMessage = this._elements.loading.removeChild(this._elements.loadingMessage);\n    }\n  }\n\n  /**\n   Indicate to the user that an error has occurred\n   */\n  showError() {\n    // Hide loading\n    this._hideLoading();\n\n    this._elements.resultMessage.innerHTML = '';\n\n    // Show the error message\n    this._showMessage('resultMessage', helpSearchError.call(this._elements, {i18n}));\n  }\n\n  /**\n   Show a set of search results.\n\n   @param {Array.<ShellHelpResult>} results\n   A set of search result objects.\n   @param {Number} total\n   The total number of results.\n   @param {String} allResultsURL\n   The URL at which all results will be displayed.\n   */\n  showResults(results, total, allResultsURL) {\n    // Hide loading\n    this._hideLoading();\n\n    // clear setTimeout\n    if (this._showResultsTimeout) {\n      window.clearTimeout(this._showResultsTimeout);\n      this._showResultsTimeout = undefined;\n    }\n\n    if (!results || total === 0) {\n      // Clear existing result message\n      this._elements.resultMessage.innerHTML = '';\n      // Indicate to the user that no results were found\n      this._showMessage('resultMessage', noHelpResults.call(this._elements, {i18n}));\n    } else {\n      // Clear existing results\n      this._elements.results.innerHTML = '';\n      // Populate results\n      results.forEach((result) => {\n        // Tweak: make the space between bullets larger with a non-breaking space\n        const separator = ' & ';\n        const description = result.tags.join(separator);\n\n        const item = new AnchorList.Item().set({\n          href: result.href,\n          target: result.target\n        });\n\n        item.classList.add('_coral-Shell-help-result-item');\n\n        item.content = helpResult.call(this._elements, {\n          title: result.title,\n          description: description\n        }).firstElementChild;\n\n        this._elements.results.appendChild(item);\n      });\n\n      // Show results\n      this._elements.results.hidden = false;\n\n      // Show total\n      if (total > 1) {\n        const seeAllItem = new AnchorList.Item().set({\n          href: allResultsURL,\n          content: {\n            innerHTML: i18n.get('See all {0} results', total)\n          },\n          target: '_blank'\n        });\n\n        // Look like a link\n        seeAllItem.content.classList.add('coral-Link');\n\n        this._elements.results.appendChild(seeAllItem);\n      }\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['placeholder']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(...CLASSNAMES);\n\n    // Move the items into the right place\n    this._moveItems();\n\n    const contentWrapper = this.querySelector('[handle=\"contentWrapper\"]');\n\n    // Support cloneNode\n    if (contentWrapper) {\n      this._elements.contentWrapper = contentWrapper;\n\n      ['search', 'result', 'items', 'results', 'resultMessage', 'loading'].forEach((handle) => {\n        this._elements[handle] = this.querySelector(`[handle=\"${handle}\"]`);\n      });\n      this._items._container = this._elements.items;\n    } else {\n      this.appendChild(this._elements.contentWrapper);\n    }\n  }\n\n  /**\n   A search result object.\n\n   @typedef {Object} ShellHelpResult\n\n   @property {String} title\n   The title of the search result.\n   @property {String} href\n   The URL of the search result.\n   @property {String} target\n   This property specifies where to display the search result. Use this property only if the href property is present.\n   @property {Array.<String>} tags\n   A set of tags associated with the search result.\n   */\n\n  /**\n   Triggered when the user submits a search term\n\n   @event Coral.Shell.Help#coral-shell-help:search\n\n   @param {Object} event\n   Event object.\n   @param {HTMLElement} event.detail.value\n   The user-provided input value aka the search-term\n   */\n}\n\nexport default ShellHelp;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1491,
    "kind": "variable",
    "name": "CLASSNAMES",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~CLASSNAMES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1492,
    "kind": "class",
    "name": "ShellHelp",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Help component",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Help"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Help component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-help"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-help></coral-shell-help>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Help();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1493,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 35,
    "ignore": true
  },
  {
    "__docId__": 1494,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 1495,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 58,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1496,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_items",
    "access": "private",
    "description": null,
    "lineNumber": 61,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1497,
    "kind": "member",
    "name": "placeholder",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#placeholder",
    "access": "public",
    "description": "The search field placeholder.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 79,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "placeholder"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1499,
    "kind": "method",
    "name": "_moveItems",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_moveItems",
    "access": "private",
    "description": null,
    "lineNumber": 88,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1500,
    "kind": "method",
    "name": "_performSearch",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_performSearch",
    "access": "private",
    "description": null,
    "lineNumber": 98,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1501,
    "kind": "method",
    "name": "_showItems",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_showItems",
    "access": "private",
    "description": null,
    "lineNumber": 115,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1502,
    "kind": "method",
    "name": "_clearTimeout",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_clearTimeout",
    "access": "private",
    "description": null,
    "lineNumber": 132,
    "ignore": true,
    "params": [
      {
        "name": "timeoutName",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1503,
    "kind": "member",
    "name": "[timeoutName]",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#[timeoutName]",
    "access": "public",
    "description": null,
    "lineNumber": 135,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1504,
    "kind": "method",
    "name": "_showMessage",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_showMessage",
    "access": "private",
    "description": null,
    "lineNumber": 140,
    "ignore": true,
    "params": [
      {
        "name": "elementName",
        "types": [
          "*"
        ]
      },
      {
        "name": "message",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1506,
    "kind": "method",
    "name": "_showLoading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_showLoading",
    "access": "private",
    "description": null,
    "lineNumber": 154,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1507,
    "kind": "method",
    "name": "_hideLoading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_hideLoading",
    "access": "private",
    "description": null,
    "lineNumber": 167,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1508,
    "kind": "method",
    "name": "showError",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#showError",
    "access": "public",
    "description": "Indicate to the user that an error has occurred",
    "lineNumber": 184,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1509,
    "kind": "method",
    "name": "showResults",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#showResults",
    "access": "public",
    "description": "Show a set of search results.",
    "lineNumber": 204,
    "params": [
      {
        "nullable": null,
        "types": [
          "Array.<ShellHelpResult>"
        ],
        "spread": false,
        "optional": false,
        "name": "results",
        "description": "A set of search result objects."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "total",
        "description": "The total number of results."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "allResultsURL",
        "description": "The URL at which all results will be displayed."
      }
    ],
    "return": null
  },
  {
    "__docId__": 1510,
    "kind": "member",
    "name": "_showResultsTimeout",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#_showResultsTimeout",
    "access": "private",
    "description": null,
    "lineNumber": 211,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1511,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 265,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1512,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp#render",
    "access": "public",
    "description": null,
    "lineNumber": 270,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1513,
    "kind": "typedef",
    "name": "ShellHelpResult",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelp.js~ShellHelp.ShellHelpResult",
    "access": "public",
    "description": "A search result object.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "title",
        "description": "The title of the search result."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "href",
        "description": "The URL of the search result."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "target",
        "description": "This property specifies where to display the search result. Use this property only if the href property is present."
      },
      {
        "nullable": null,
        "types": [
          "Array.<String>"
        ],
        "spread": false,
        "optional": false,
        "name": "tags",
        "description": "A set of tags associated with the search result."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ShellHelpResult"
    }
  },
  {
    "__docId__": 1514,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {AnchorList} from '../../../coral-component-list';\n\nconst CLASSNAME = '_coral-Shell-help-item';\n\n/**\n @class Coral.Shell.Help.Item\n @classdesc A Shell Help item component\n @htmltag coral-shell-help-item\n @extends {AnchorListItem}\n */\nclass ShellHelpItem extends AnchorList.Item {\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n    this.setAttribute(\"role\", \"listitem\");\n  }\n}\n\nexport default ShellHelpItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1515,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1516,
    "kind": "class",
    "name": "ShellHelpItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js~ShellHelpItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Help item component",
    "lineNumber": 23,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Help.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Help item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-help-item"
      }
    ],
    "interface": false,
    "extends": [
      "AnchorListItem"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-help-item></coral-shell-help-item>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Help.Item();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1517,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js~ShellHelpItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpItem.js~ShellHelpItem#render",
    "access": "public",
    "description": null,
    "lineNumber": 25,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1518,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpSeparator.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.Help.Separator\n @classdesc Shell's help separator\n @htmltag coral-shell-help-separator\n @return {HTMLElement}\n\n @deprecated\n */\nexport default () => document.createElement('coral-shell-help-separator');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHelpSeparator.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1519,
    "kind": "function",
    "name": "ShellHelpSeparator",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpSeparator.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHelpSeparator.js~ShellHelpSeparator",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's help separator",
    "lineNumber": 21,
    "deprecated": true,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Help.Separator"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's help separator"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-help-separator"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-help-separator></coral-shell-help-separator>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Help.Separator();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1520,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-icon';\nimport homeAnchorIcon from '../templates/homeAnchorIcon';\n\nconst CLASSNAME = '_coral-Shell-homeAnchor';\n\n/**\n @class Coral.Shell.HomeAnchor\n @classdesc A Shell Home Anchor component\n @htmltag coral-shell-homeanchor\n @htmlbasetag a\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n */\nclass ShellHomeAnchor extends BaseComponent(HTMLAnchorElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      label: this.querySelector('coral-shell-homeanchor-label') || document.createElement('coral-shell-homeanchor-label')\n    };\n\n    // Create icon by default\n    homeAnchorIcon.call(this._elements);\n  }\n\n  /**\n   The label of the anchor.\n\n   @type {ShellHomeAnchorLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-shell-homeanchor-label',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Specifies the icon name used in the anchor. See {@link Coral.Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.icon.icon;\n  }\n\n  set icon(value) {\n    this._elements.icon.icon = value;\n\n    // removes the icon element from the DOM.\n    if (this.icon === '') {\n      this._elements.icon.remove();\n    }\n    // adds the icon back since it was blown away by textContent\n    else if (!this.contains(this._elements.icon)) {\n      this.insertBefore(this._elements.icon, this.firstChild);\n    }\n  }\n\n  get _contentZones() {\n    return {'coral-shell-homeanchor-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['icon']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Create doc fragment\n    const fragment = document.createDocumentFragment();\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      this.removeChild(label);\n    }\n\n    // Move any remaining elements into the label\n    while (this.firstChild) {\n      const child = this.firstChild;\n\n      if (child.nodeType === Node.TEXT_NODE) {\n        // Move text elements to the label\n        label.appendChild(child);\n      } else if (child.nodeName === 'CORAL-ICON') {\n        if (!fragment.childNodes.length) {\n          // Conserve existing icon element to content\n          this._elements.icon = child;\n          fragment.appendChild(child);\n        } else {\n          // Remove cloned icon\n          this.removeChild(child);\n        }\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Add fragment back\n    this.appendChild(fragment);\n\n    // Insert icon and label insert\n    this.icon = this.icon;\n    this.label = label;\n  }\n}\n\nexport default ShellHomeAnchor;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1521,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1522,
    "kind": "class",
    "name": "ShellHomeAnchor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Home Anchor component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.HomeAnchor"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Home Anchor component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-homeanchor"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "a"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLAnchorElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLAnchorElement)",
    "examples": [
      "<caption>Markup</caption>\n<a is=\"coral-shell-homeanchor\"></a>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.HomeAnchor();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1523,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 29,
    "ignore": true
  },
  {
    "__docId__": 1524,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 33,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"label\": *}"
      ]
    }
  },
  {
    "__docId__": 1525,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#label",
    "access": "public",
    "description": "The label of the anchor.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 48,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellHomeAnchorLabel"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1527,
    "kind": "member",
    "name": "icon",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#icon",
    "access": "public",
    "description": "Specifies the icon name used in the anchor. See {@link Coral.Icon} for valid icon names.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 69,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "icon"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1529,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 86,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1530,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 91,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1531,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchor.js~ShellHomeAnchor#render",
    "access": "public",
    "description": null,
    "lineNumber": 96,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1534,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchorLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.HomeAnchor.Label\n @classdesc Shell HomeAnchor's label component\n @htmltag coral-shell-homeanchor-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-homeanchor-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchorLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1535,
    "kind": "function",
    "name": "ShellHomeAnchorLabel",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchorLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellHomeAnchorLabel.js~ShellHomeAnchorLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell HomeAnchor's label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.HomeAnchor.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell HomeAnchor's label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-homeanchor-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-homeanchor-label></coral-shell-homeanchor-label>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.HomeAnchor.Label();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1536,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Popover} from '../../../coral-component-popover';\nimport {transform} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-menu';\n\n/**\n @class Coral.Shell.Menu\n @classdesc A Shell Menu component\n @htmltag coral-shell-menu\n @extends {Popover}\n */\nclass ShellMenu extends Popover {\n  /**\n   Inherited from {@link Popover#within}.\n   */\n  get within() {\n    // Force 'coral-shell'\n    return document.querySelector('coral-shell') || 'coral-shell';\n  }\n\n  set within(value) {\n    super.within = value;\n  }\n\n  /**\n   Inherited from {@link Popover#placement}.\n   */\n  get placement() {\n    // Force bottom placement\n    return this.constructor.placement.BOTTOM;\n  }\n\n  set placement(value) {\n    super.placement = value;\n  }\n\n  /**\n   Whether the overlay should use all available space.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute full\n   @htmlattributereflected\n   */\n  get full() {\n    return this._full || false;\n  }\n\n  set full(value) {\n    this._full = transform.booleanAttr(value);\n    this._reflectAttribute('full', this._full);\n\n    this.classList.toggle(`${CLASSNAME}--full`, this._full);\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['full']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.trigger('coral-shell-menu:_connected');\n  }\n}\n\nexport default ShellMenu;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1537,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1538,
    "kind": "class",
    "name": "ShellMenu",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Menu component",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Menu"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Menu component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-menu"
      }
    ],
    "interface": false,
    "extends": [
      "Popover"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-menu></coral-shell-menu>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Menu();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1539,
    "kind": "member",
    "name": "within",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu#within",
    "access": "public",
    "description": "Inherited from {@link Popover#within}.",
    "lineNumber": 28,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1541,
    "kind": "member",
    "name": "placement",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu#placement",
    "access": "public",
    "description": "Inherited from {@link Popover#placement}.",
    "lineNumber": 40,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1543,
    "kind": "member",
    "name": "full",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu#full",
    "access": "public",
    "description": "Whether the overlay should use all available space.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 57,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "full"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1545,
    "kind": "member",
    "name": "_full",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu#_full",
    "access": "private",
    "description": null,
    "lineNumber": 62,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1546,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 69,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1547,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenu.js~ShellMenu#render",
    "access": "public",
    "description": null,
    "lineNumber": 74,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1548,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\n\nconst CLASSNAME = '_coral-Shell-menubar';\n\n/**\n @class Coral.Shell.MenuBar\n @classdesc A Shell MenuBar component\n @htmltag coral-shell-menubar\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellMenuBar extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this.setAttribute('role', 'list');\n\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The item collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-shell-menubar-item'\n      });\n    }\n\n    return this._items;\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n}\n\nexport default ShellMenuBar;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1549,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1550,
    "kind": "class",
    "name": "ShellMenuBar",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell MenuBar component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.MenuBar"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell MenuBar component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-menubar"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-menubar></coral-shell-menubar>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.MenuBar();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1551,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 27,
    "ignore": true
  },
  {
    "__docId__": 1552,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 41,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1553,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar#_items",
    "access": "private",
    "description": null,
    "lineNumber": 44,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1554,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBar.js~ShellMenuBar#render",
    "access": "public",
    "description": null,
    "lineNumber": 54,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1555,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport '../../../coral-component-icon';\nimport '../../../coral-component-button';\nimport '../../../coral-component-anchorbutton';\nimport menuBarItem from '../templates/menuBarItem';\n\n/**\n Enumeration for {@link ShellMenuBarItem} icon variants.\n\n @typedef {Object} ShellMenuBarItemIconVariantEnum\n\n @property {String} DEFAULT\n A default menubar item.\n @property {String} CIRCLE\n A round image as menubar item.\n */\nconst iconVariant = {\n  DEFAULT: 'default',\n  CIRCLE: 'circle'\n};\n\n/**\n Enumeration for valid aria-haspopup values.\n\n @typedef {Object} ShellMenuBarItemHasPopupRoleEnum\n @property {String} MENU\n ShellMenuBarItem opens a menu.\n @property {String} LISTBOX\n ShellMenuBarItem opens a list box.\n @property {String} TREE\n ShellMenuBarItem opens a tree.\n @property {String} GRID\n ShellMenuBarItem opens a grid.\n @property {String} DIALOG\n ShellMenuBarItem opens a dialog.\n @property {Null} DEFAULT\n Defaults to null.\n\n */\nconst hasPopupRole = {\n  MENU: 'menu',\n  LISTBOX: 'listbox',\n  TREE: 'tree',\n  GRID: 'grid',\n  DIALOG: 'dialog',\n  DEFAULT: null\n};\n\n// the Menubar Item's base classname\nconst CLASSNAME = '_coral-Shell-menubar-item';\n\n// Builds a string containing all possible iconVariant classnames. This will be used to remove classnames when the variant\n// changes\nconst ALL_ICON_VARIANT_CLASSES = [];\nfor (const variantValue in iconVariant) {\n  ALL_ICON_VARIANT_CLASSES.push(`${CLASSNAME}--${iconVariant[variantValue]}`);\n}\n\n/**\n @class Coral.Shell.MenuBar.Item\n @classdesc A Shell MenuBar Item component\n @htmltag coral-shell-menubar-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellMenuBarItem extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    menuBarItem.call(this._elements);\n\n    // Events\n    this._delegateEvents({\n      'click [handle=\"shellMenuButton\"]': '_handleButtonClick',\n\n      // it has to be global because the menus are not direct children\n      'global:coral-overlay:close': '_handleOverlayEvent',\n      'global:coral-overlay:beforeclose': '_handleOverlayBeforeEvent',\n      'global:coral-overlay:open': '_handleOverlayEvent',\n      'global:coral-overlay:beforeopen': '_handleOverlayBeforeEvent'\n    });\n  }\n\n  /**\n   Specifies the icon name used inside the menu item.\n   See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.shellMenuButton.icon;\n  }\n\n  set icon(value) {\n    this._elements.shellMenuButton.icon = value;\n  }\n\n  /**\n   Size of the icon. It accepts both lower and upper case sizes. See {@link ButtonIconSizeEnum}.\n\n   @type {String}\n   @default ButtonIconSizeEnum.SMALL\n   @htmlattribute iconsize\n   @htmlattributereflected\n   */\n  get iconSize() {\n    return this._elements.shellMenuButton.iconSize;\n  }\n\n  set iconSize(value) {\n    this._elements.shellMenuButton.iconSize = value;\n    // Required for styling\n    this._reflectAttribute('iconsize', this.iconSize);\n  }\n\n  /**\n   The menubar item's iconVariant. See {@link ShellMenuBarItemIconVariantEnum}.\n\n   @type {String}\n   @default ShellMenuBarItemIconVariantEnum.DEFAULT\n   @htmlattribute iconvariant\n   */\n  get iconVariant() {\n    return this._iconVariant || iconVariant.DEFAULT;\n  }\n\n  set iconVariant(value) {\n    value = transform.string(value).toLowerCase();\n    this._iconVariant = validate.enumeration(iconVariant)(value) && value || iconVariant.DEFAULT;\n\n    // removes all the existing variants\n    this.classList.remove(...ALL_ICON_VARIANT_CLASSES);\n    // adds the new variant\n    if (this.variant !== iconVariant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._iconVariant}`);\n    }\n  }\n\n  /**\n   The notification badge content.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute badge\n   */\n  get badge() {\n    return this._elements.shellMenuButton.getAttribute('badge') || '';\n  }\n\n  set badge(value) {\n    // Non-truthy values shouldn't show\n    // null, empty string, 0, etc\n    this._elements.shellMenuButton[!value || value === '0' ? 'removeAttribute' : 'setAttribute']('badge', value);\n  }\n\n  /**\n   Whether the menu is open or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute open\n   @htmlattributereflected\n\n   @emits {coral-shell-menubar-item:open}\n   @emits {coral-shell-menubar-item:close}\n   */\n  get open() {\n    return this._open || false;\n  }\n\n  set open(value) {\n    const menu = this._getMenu();\n\n    // if we want to open the dialog we need to make sure there is a valid menu or hasPopup\n    if (menu === null && this.hasPopup === hasPopupRole.DEFAULT) {\n      return;\n    }\n\n    this._open = transform.booleanAttr(value);\n    this._reflectAttribute('open', this._open);\n\n    // if the menu is valid, toggle the menu and trigger the appropriate event\n    if (menu !== null) {\n      // Toggle the target menu\n      if (menu.open !== this._open) {\n        menu.open = this._open;\n      }\n\n      this.trigger(`coral-shell-menubar-item:${this._open ? 'open' : 'close'}`);\n    }\n\n    this._elements.shellMenuButton.setAttribute('aria-expanded', this._open);\n  }\n\n  /**\n   The menubar item's label content zone.\n\n   @type {ButtonLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.shellMenuButtonLabel);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'shellMenuButtonLabel',\n      tagName: 'coral-button-label',\n      insert: function (label) {\n        this._elements.shellMenuButton.label = label;\n      }\n    });\n  }\n\n  /**\n   The menu that this menu item should show. If a CSS selector is provided, the first matching element will be\n   used.\n\n   @type {?HTMLElement|String}\n   @default null\n   @htmlattribute menu\n   */\n  get menu() {\n    return this._menu || null;\n  }\n\n  set menu(value) {\n    let menu;\n    if (value instanceof HTMLElement) {\n      this._menu = value;\n      menu = this._menu;\n    } else {\n      this._menu = String(value);\n      menu = document.querySelector(this._menu);\n    }\n\n    // Link menu with item\n    if (menu !== null) {\n      this.id = this.id || commons.getUID();\n      menu.setAttribute('target', `#${this.id}`);\n      if (this.hasPopup === hasPopupRole.DEFAULT) {\n        this.hasPopup = menu.getAttribute('role') || hasPopupRole.DIALOG;\n      }\n    } else if (this._menu && this.hasPopup !== hasPopupRole.DEFAULT) {\n      this.hasPopup = hasPopupRole.DEFAULT;\n    }\n  }\n\n  /**\n   Whether the item opens a popup dialog or menu. Accepts either \"menu\", \"listbox\", \"tree\", \"grid\", or \"dialog\".\n   @type {?String}\n   @default ShellMenuBarItemHasPopupRoleEnum.DEFAULT\n   @htmlattribute haspopup\n   */\n  get hasPopup() {\n    return this._hasPopup || null;\n  }\n\n  set hasPopup(value) {\n    value = transform.string(value).toLowerCase();\n    this._hasPopup = validate.enumeration(hasPopupRole)(value) && value || hasPopupRole.DEFAULT;\n\n    const shellMenuButton = this._elements.shellMenuButton;\n    let ariaHaspopup = this._hasPopup;\n\n    if (ariaHaspopup) {\n      shellMenuButton.setAttribute('aria-haspopup', ariaHaspopup);\n      shellMenuButton.setAttribute('aria-expanded', this.open);\n    } else {\n      shellMenuButton.removeAttribute('aria-haspopup');\n      shellMenuButton.removeAttribute('aria-expanded');\n    }\n  }\n\n  _handleOverlayBeforeEvent(event) {\n    const target = event.target;\n\n    if (target === this._getMenu()) {\n      // Mark button as selected\n      this._elements.shellMenuButton.classList.toggle('is-selected', !target.open);\n    }\n  }\n\n  /** @private */\n  _handleOverlayEvent(event) {\n    const target = event.target;\n\n    // matches the open state of the target in case it was open separately\n    if (target === this._getMenu()) {\n      const shellMenuButton = this._elements.shellMenuButton;\n      if (this.open !== target.open) {\n        this.open = target.open;\n      } else if (shellMenuButton.getAttribute('aria-expanded') !== target.open) {\n        shellMenuButton.setAttribute('aria-expanded', target.open);\n      }\n    }\n  }\n\n  /** @ignore */\n  _handleButtonClick() {\n    this.open = !this.open;\n  }\n\n  /** @ignore */\n  _getMenu(targetValue) {\n    // Use passed target\n    targetValue = targetValue || this.menu;\n\n    if (targetValue instanceof Node) {\n      // Just return the provided Node\n      return targetValue;\n    }\n\n    // Dynamically get the target node based on target\n    let newTarget = null;\n    if (typeof targetValue === 'string') {\n      newTarget = document.querySelector(targetValue);\n    }\n\n    return newTarget;\n  }\n\n  get _contentZones() {\n    return {'coral-button-label': 'label'};\n  }\n\n  /** @ignore */\n  focus() {\n    this._elements.shellMenuButton.focus();\n  }\n\n  /**\n   Returns {@link ShellMenuBarItem} icon variants.\n\n   @return {ShellMenuBarItemIconVariantEnum}\n   */\n  static get iconVariant() {\n    return iconVariant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      haspopup: 'hasPopup',\n      iconsize: 'iconSize',\n      iconvariant: 'iconVariant'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'haspopup',\n      'icon',\n      'iconsize',\n      'iconvariant',\n      'badge',\n      'open',\n      'menu',\n      'aria-label'\n    ]);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    // a11y When user doesn't supply a button label (for an icon-only button),\n    // providing aria-label will correctly pass it on to the shell menu button child element.\n    if (name === 'aria-label') {\n      if (value && this._elements.shellMenuButton.textContent.trim() === '') {\n        this._elements.shellMenuButton.setAttribute('aria-label', value);\n      }\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.setAttribute('role', 'listitem');\n\n    this.classList.add(CLASSNAME);\n\n    const button = this.querySelector('._coral-Shell-menu-button');\n\n    if (button) {\n      this._elements.shellMenuButton = button;\n      this._elements.shellMenuButtonLabel = this.querySelector('coral-button-label');\n    } else {\n      while (this.firstChild) {\n        this._elements.shellMenuButtonLabel.appendChild(this.firstChild);\n      }\n\n      this.appendChild(this._elements.shellMenuButton);\n    }\n\n    this.label = this._elements.shellMenuButtonLabel;\n\n    // Sync menu\n    if (this.menu !== null) {\n      this.menu = this.menu;\n    }\n  }\n\n  /**\n   Triggered after the {@link ShellMenuBarItem} is opened with <code>show()</code> or <code>instance.open = true</code>\n\n   @typedef {CustomEvent} coral-shell-menubar-item:open\n   */\n\n  /**\n   Triggered after the {@link ShellMenuBarItem} is closed with <code>hide()</code> or <code>instance.open = false</code>\n\n   @typedef {CustomEvent} coral-shell-menubar-item:close\n   */\n}\n\nexport default ShellMenuBarItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1556,
    "kind": "typedef",
    "name": "ShellMenuBarItemIconVariantEnum",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItemIconVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link ShellMenuBarItem} icon variants.",
    "lineNumber": 30,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default menubar item."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CIRCLE",
        "description": "A round image as menubar item."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ShellMenuBarItemIconVariantEnum"
    }
  },
  {
    "__docId__": 1557,
    "kind": "typedef",
    "name": "ShellMenuBarItemHasPopupRoleEnum",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItemHasPopupRoleEnum",
    "access": "public",
    "description": "Enumeration for valid aria-haspopup values.",
    "lineNumber": 53,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MENU",
        "description": "ShellMenuBarItem opens a menu."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LISTBOX",
        "description": "ShellMenuBarItem opens a list box."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TREE",
        "description": "ShellMenuBarItem opens a tree."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "GRID",
        "description": "ShellMenuBarItem opens a grid."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DIALOG",
        "description": "ShellMenuBarItem opens a dialog."
      },
      {
        "nullable": null,
        "types": [
          "Null"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Defaults to null."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ShellMenuBarItemHasPopupRoleEnum"
    }
  },
  {
    "__docId__": 1558,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1559,
    "kind": "variable",
    "name": "ALL_ICON_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ALL_ICON_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 67,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1560,
    "kind": "class",
    "name": "ShellMenuBarItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell MenuBar Item component",
    "lineNumber": 79,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.MenuBar.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell MenuBar Item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-menubar-item"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-menubar-item></coral-shell-menubar-item>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.MenuBar.Item();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1561,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 81,
    "ignore": true
  },
  {
    "__docId__": 1562,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 85,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 1563,
    "kind": "member",
    "name": "icon",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#icon",
    "access": "public",
    "description": "Specifies the icon name used inside the menu item.\nSee {@link Icon} for valid icon names.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 108,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "icon"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1565,
    "kind": "member",
    "name": "iconSize",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#iconSize",
    "access": "public",
    "description": "Size of the icon. It accepts both lower and upper case sizes. See {@link ButtonIconSizeEnum}.\n<ul><li><code>ButtonIconSizeEnum.SMALL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 124,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ButtonIconSizeEnum.SMALL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "iconsize"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1567,
    "kind": "member",
    "name": "iconVariant",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#iconVariant",
    "access": "public",
    "description": "The menubar item's iconVariant. See {@link ShellMenuBarItemIconVariantEnum}.\n<ul><li><code>ShellMenuBarItemIconVariantEnum.DEFAULT</code> by default.</li></ul>",
    "lineNumber": 141,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ShellMenuBarItemIconVariantEnum.DEFAULT"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "iconvariant"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1569,
    "kind": "member",
    "name": "_iconVariant",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_iconVariant",
    "access": "private",
    "description": null,
    "lineNumber": 147,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1570,
    "kind": "member",
    "name": "badge",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#badge",
    "access": "public",
    "description": "The notification badge content.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 164,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "badge"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1572,
    "kind": "member",
    "name": "open",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#open",
    "access": "public",
    "description": "Whether the menu is open or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 185,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "open"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "emits": [
      {
        "types": [
          "coral-shell-menubar-item:open"
        ],
        "description": ""
      },
      {
        "types": [
          "coral-shell-menubar-item:close"
        ],
        "description": ""
      }
    ],
    "modality": "both"
  },
  {
    "__docId__": 1574,
    "kind": "member",
    "name": "_open",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_open",
    "access": "private",
    "description": null,
    "lineNumber": 197,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1575,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#label",
    "access": "public",
    "description": "The menubar item's label content zone.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 219,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ButtonLabel"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1577,
    "kind": "member",
    "name": "menu",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#menu",
    "access": "public",
    "description": "The menu that this menu item should show. If a CSS selector is provided, the first matching element will be\nused.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 241,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "menu"
      }
    ],
    "type": {
      "nullable": true,
      "types": [
        "HTMLElement",
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1579,
    "kind": "member",
    "name": "_menu",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_menu",
    "access": "private",
    "description": null,
    "lineNumber": 248,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1581,
    "kind": "member",
    "name": "id",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#id",
    "access": "public",
    "description": null,
    "lineNumber": 257,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1584,
    "kind": "member",
    "name": "hasPopup",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#hasPopup",
    "access": "public",
    "description": "Whether the item opens a popup dialog or menu. Accepts either \"menu\", \"listbox\", \"tree\", \"grid\", or \"dialog\".\n<ul><li><code>ShellMenuBarItemHasPopupRoleEnum.DEFAULT</code> by default.</li></ul>",
    "lineNumber": 273,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ShellMenuBarItemHasPopupRoleEnum.DEFAULT"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "haspopup"
      }
    ],
    "type": {
      "nullable": true,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1586,
    "kind": "member",
    "name": "_hasPopup",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_hasPopup",
    "access": "private",
    "description": null,
    "lineNumber": 279,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1587,
    "kind": "method",
    "name": "_handleOverlayBeforeEvent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_handleOverlayBeforeEvent",
    "access": "private",
    "description": null,
    "lineNumber": 293,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1588,
    "kind": "method",
    "name": "_handleOverlayEvent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_handleOverlayEvent",
    "access": "private",
    "description": null,
    "lineNumber": 303,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1590,
    "kind": "method",
    "name": "_handleButtonClick",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_handleButtonClick",
    "access": "private",
    "description": null,
    "lineNumber": 318,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1592,
    "kind": "method",
    "name": "_getMenu",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_getMenu",
    "access": "private",
    "description": null,
    "lineNumber": 323,
    "ignore": true,
    "params": [
      {
        "name": "targetValue",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1593,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 341,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1594,
    "kind": "method",
    "name": "focus",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#focus",
    "access": "public",
    "description": null,
    "lineNumber": 346,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1595,
    "kind": "member",
    "name": "iconVariant",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem.iconVariant",
    "access": "public",
    "description": "Returns {@link ShellMenuBarItem} icon variants.",
    "lineNumber": 355,
    "return": {
      "nullable": null,
      "types": [
        "ShellMenuBarItemIconVariantEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1596,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 359,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1597,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 368,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1598,
    "kind": "method",
    "name": "attributeChangedCallback",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#attributeChangedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 382,
    "ignore": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      },
      {
        "name": "oldValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1599,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem#render",
    "access": "public",
    "description": null,
    "lineNumber": 395,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1600,
    "kind": "typedef",
    "name": "coral-shell-menubar-item:open",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem.coral-shell-menubar-item:open",
    "access": "public",
    "description": "Triggered after the {@link ShellMenuBarItem} is opened with <code>show()</code> or <code>instance.open = true</code>",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-shell-menubar-item:open"
    }
  },
  {
    "__docId__": 1601,
    "kind": "typedef",
    "name": "coral-shell-menubar-item:close",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellMenuBarItem.js~ShellMenuBarItem.coral-shell-menubar-item:close",
    "access": "public",
    "description": "Triggered after the {@link ShellMenuBarItem} is closed with <code>hide()</code> or <code>instance.open = false</code>",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-shell-menubar-item:close"
    }
  },
  {
    "__docId__": 1604,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {List} from '../../../coral-component-list';\nimport {SelectableCollection} from '../../../coral-collection';\nimport orgSwitcher from '../templates/orgSwitcher';\nimport {commons, i18n} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-orgSwitcher';\n\n/**\n Minimum number of entries required to show search control.\n\n @type {Number}\n @ignore\n */\nconst SEARCH_VISIBILITY_THRESHOLD = 6;\n\n/**\n @class Coral.Shell.OrgSwitcher\n @classdesc A Shell OrgSwitcher component\n @htmltag coral-shell-orgswitcher\n @extends {List}\n */\nclass ShellOrgSwitcher extends List {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      'coral-search:clear': '_showAll',\n      'coral-search:input': '_performSearch',\n      'coral-search:submit': '_selectFirst',\n      'coral-shell-organization:change': '_onOrganizationChange',\n      // private\n      'coral-shell-organization:_selectedchanged': '_onItemSelectedChanged',\n      'coral-shell-suborganization:_selectedchanged': '_onSubItemSelectedChanged'\n    });\n\n    // Templates\n    this._elements = {\n      footer: this.querySelector('coral-shell-orgswitcher-footer') || document.createElement('coral-shell-orgswitcher-footer')\n    };\n    orgSwitcher.call(this._elements, {commons, i18n});\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Item handling\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The item collection.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-shell-organization',\n        itemSelector: 'coral-shell-organization, coral-shell-suborganization',\n        container: this._elements.items,\n        onItemAdded: this._onCollectionChange,\n        onItemRemoved: this._onCollectionChange\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   The search field placeholder.\n\n   @default ''\n   @type {String}\n   @htmlattribute placeholder\n   */\n  get placeholder() {\n    return this._elements.search.placeholder;\n  }\n\n  set placeholder(value) {\n    this._elements.search.placeholder = value;\n  }\n\n  /**\n   Content zone where the buttons are located.\n\n   @type {ShellOrgSwitcherFooter}\n   @contentzone\n   */\n  get footer() {\n    return this._getContentZone(this._elements.footer);\n  }\n\n  set footer(value) {\n    this._setContentZone('content', value, {\n      handle: 'footer',\n      tagName: 'coral-shell-orgswitcher-footer',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /** @private */\n  get _itemTagName() {\n    // Used for Collection\n    return 'coral-shell-organization';\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    this._validateSelection(item);\n  }\n\n  /** @private */\n  _onSubItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n\n    // If a sub organization is selected, deselect all selected organization items\n    if (item.hasAttribute('selected')) {\n      this.items._getAllSelected().forEach((itemElement) => {\n        if (itemElement.tagName === 'CORAL-SHELL-ORGANIZATION') {\n          this._preventTriggeringEvents = true;\n          itemElement.removeAttribute('selected');\n        }\n      });\n\n      this._preventTriggeringEvents = false;\n    }\n  }\n\n  /** @private */\n  _onOrganizationChange() {\n    this._triggerChangeEvent();\n  }\n\n  /**\n   Returns the selected workspace.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /** @private */\n  _selectFirst(event) {\n    event.stopPropagation();\n\n    const first = this.items.first();\n    if (first) {\n      first.setAttribute('selected', '');\n    }\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    // gets the current selection\n    const selection = this.items._getAllSelected();\n    const selectionCount = selection.length;\n\n    if (selectionCount > 1) {\n      for (let i = 0 ; i < selectionCount ; i++) {\n        if (selection[i] !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selection[i].removeAttribute('selected');\n        }\n      }\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-shell-orgswitcher:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @private */\n  _showAll(event) {\n    event.stopPropagation();\n\n    this._elements.resultMessage.hidden = true;\n\n    // Show all items\n    this.items.getAll().forEach((item) => {\n      item.hidden = false;\n\n      if (item.items) {\n        // Show all sub-items\n        item.items.getAll().forEach((itemElement) => {\n          itemElement.hidden = false;\n        });\n      }\n    });\n  }\n\n  /** @private */\n  _performSearch(event) {\n    event.stopPropagation();\n\n    const searchTerm = this._elements.search.value.toLowerCase();\n\n    this._elements.resultMessage.hidden = true;\n\n    // Hide items that don't match\n    let resultCount = 0;\n\n    this.items.getAll().forEach((item) => {\n      let matched = item.content.textContent.toLowerCase().indexOf(searchTerm) !== -1;\n\n      let childMatched = false;\n      if (item.items) {\n        item.items.getAll().forEach((itemElement) => {\n          const elementMatch = itemElement.content.textContent.toLowerCase().indexOf(searchTerm) !== -1;\n          childMatched = childMatched || elementMatch;\n\n          itemElement.hidden = !elementMatch;\n        });\n      }\n\n      matched = matched || childMatched;\n      item.hidden = !matched;\n\n      if (matched) {\n        resultCount++;\n      }\n    });\n\n    if (resultCount === 0) {\n      this._elements.resultMessage.hidden = false;\n    }\n  }\n\n  /** @private */\n  _moveItems() {\n    this.setAttribute('id', this.id || commons.getUID());\n    Array.prototype.forEach.call(this.querySelectorAll(`#${this.id} > coral-shell-organization`), (item) => {\n      this._elements.items.appendChild(item);\n    });\n  }\n\n  /** @private */\n  _onCollectionChange(item) {\n    // Move all items into the right place\n    this._moveItems();\n\n    // Select the last selected item\n    this._validateSelection(item);\n\n    // if mincountforsearch is set and number of organizations are less than or equal to it, hide the search\n    if (this.items.length <= SEARCH_VISIBILITY_THRESHOLD) {\n      this._elements.search.hide();\n    } else {\n      this._elements.search.show();\n    }\n  }\n\n  get _contentZones() {\n    return {'coral-shell-orgswitcher-footer': 'footer'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['placeholder']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Move the items into the right place\n    this._moveItems();\n\n    const container = this.querySelector('[handle=\"container\"]');\n\n    // Support cloneNode\n    if (container) {\n      this._elements.container = container;\n      this._elements.items = this.querySelector('._coral-Shell-orgSwitcher-items');\n      this._elements.search = this.querySelector('._coral-Shell-orgSwitcher-search');\n      this._elements.resultMessage = this.querySelector('._coral-Shell-orgSwitcher-resultMessage');\n      this._items._container = this._elements.items;\n    } else {\n      this.appendChild(this._elements.container);\n    }\n\n    // Call content zone insert\n    this.footer = this._elements.footer;\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /**\n   Triggered when the {@link ShellOrgSwitcher} selected organization has changed.\n\n   @typedef {CustomEvent} coral-shell-orgswitcher:change\n\n   @property {HTMLElement} detail.oldSelection\n   The prior selected organization item.\n   @property {HTMLElement} detail.selection\n   The newly selected organization item.\n   */\n}\n\nexport default ShellOrgSwitcher;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1605,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1606,
    "kind": "variable",
    "name": "SEARCH_VISIBILITY_THRESHOLD",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~SEARCH_VISIBILITY_THRESHOLD",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Minimum number of entries required to show search control.",
    "lineNumber": 26,
    "ignore": true,
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 1607,
    "kind": "class",
    "name": "ShellOrgSwitcher",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell OrgSwitcher component",
    "lineNumber": 34,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.OrgSwitcher"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell OrgSwitcher component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-orgswitcher"
      }
    ],
    "interface": false,
    "extends": [
      "List"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-orgswitcher></coral-shell-orgswitcher>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.OrgSwitcher();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1608,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 36,
    "ignore": true
  },
  {
    "__docId__": 1609,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 51,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"footer\": *}"
      ]
    }
  },
  {
    "__docId__": 1610,
    "kind": "member",
    "name": "_oldSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_oldSelection",
    "access": "private",
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1611,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 69,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1612,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_items",
    "access": "private",
    "description": null,
    "lineNumber": 72,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1613,
    "kind": "member",
    "name": "placeholder",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#placeholder",
    "access": "public",
    "description": "The search field placeholder.\n<ul><li><code>''</code> by default.</li></ul>",
    "lineNumber": 92,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "''"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "placeholder"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1615,
    "kind": "member",
    "name": "footer",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#footer",
    "access": "public",
    "description": "Content zone where the buttons are located.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 106,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellOrgSwitcherFooter"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1617,
    "kind": "member",
    "name": "_itemTagName",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_itemTagName",
    "access": "private",
    "description": null,
    "lineNumber": 121,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1618,
    "kind": "method",
    "name": "_onItemSelectedChanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_onItemSelectedChanged",
    "access": "private",
    "description": null,
    "lineNumber": 127,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1619,
    "kind": "method",
    "name": "_onSubItemSelectedChanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_onSubItemSelectedChanged",
    "access": "private",
    "description": null,
    "lineNumber": 135,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1620,
    "kind": "member",
    "name": "_preventTriggeringEvents",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_preventTriggeringEvents",
    "access": "private",
    "description": null,
    "lineNumber": 144,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 1622,
    "kind": "method",
    "name": "_onOrganizationChange",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_onOrganizationChange",
    "access": "private",
    "description": null,
    "lineNumber": 154,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1623,
    "kind": "member",
    "name": "selectedItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#selectedItem",
    "access": "public",
    "description": "Returns the selected workspace.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 164,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1624,
    "kind": "method",
    "name": "_selectFirst",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_selectFirst",
    "access": "private",
    "description": null,
    "lineNumber": 169,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1625,
    "kind": "method",
    "name": "_validateSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_validateSelection",
    "access": "private",
    "description": null,
    "lineNumber": 179,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1628,
    "kind": "method",
    "name": "_triggerChangeEvent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_triggerChangeEvent",
    "access": "private",
    "description": null,
    "lineNumber": 201,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1630,
    "kind": "method",
    "name": "_showAll",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_showAll",
    "access": "private",
    "description": null,
    "lineNumber": 216,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1631,
    "kind": "method",
    "name": "_performSearch",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_performSearch",
    "access": "private",
    "description": null,
    "lineNumber": 235,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1632,
    "kind": "method",
    "name": "_moveItems",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_moveItems",
    "access": "private",
    "description": null,
    "lineNumber": 272,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1633,
    "kind": "method",
    "name": "_onCollectionChange",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_onCollectionChange",
    "access": "private",
    "description": null,
    "lineNumber": 280,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1634,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 295,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1635,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 300,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1636,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher#render",
    "access": "public",
    "description": null,
    "lineNumber": 305,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1637,
    "kind": "typedef",
    "name": "coral-shell-orgswitcher:change",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcher.js~ShellOrgSwitcher.coral-shell-orgswitcher:change",
    "access": "public",
    "description": "Triggered when the {@link ShellOrgSwitcher} selected organization has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected organization item."
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected organization item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-shell-orgswitcher:change"
    }
  },
  {
    "__docId__": 1642,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcherFooter.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.OrgSwitcher.Footer\n @classdesc Shell's OrgSwitcher footer component\n @htmltag coral-shell-orgswitcher-footer\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-orgswitcher-footer');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcherFooter.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1643,
    "kind": "function",
    "name": "ShellOrgSwitcherFooter",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcherFooter.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrgSwitcherFooter.js~ShellOrgSwitcherFooter",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's OrgSwitcher footer component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.OrgSwitcher.Footer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's OrgSwitcher footer component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-orgswitcher-footer"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-orgswitcher-footer></coral-shell-orgswitcher-footer>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.OrgSwitcher.Footer();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1644,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {List} from '../../../coral-component-list';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {Icon} from '../../../coral-component-icon';\nimport organization from '../templates/organization';\nimport {transform, commons} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-orgSwitcher-item';\n\n/**\n @class Coral.Shell.Organization\n @classdesc A Shell Organization component\n @htmltag coral-shell-organization\n @extends {ListItem}\n */\nclass ShellOrganization extends List.Item {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      'click': '_onClick',\n      'key:enter': '_onClick',\n      'key:space': '_onClick',\n      // Private\n      'coral-shell-suborganization:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    const template = {};\n    organization.call(template, {Icon});\n    commons.extend(this._elements, template);\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Item handling\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The item collection.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-shell-suborganization',\n        container: this._elements.items,\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Returns the selected workspace.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /**\n   Whether this organization is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.setAttribute('aria-selected', this._selected);\n    this.classList.toggle('is-selected', this._selected);\n    this._elements.checkmark.hidden = !this._selected;\n\n    if (this.items) {\n      const selectedItem = this.selectedItem;\n\n      this.classList.toggle('is-child-selected', selectedItem);\n\n      if (!this._selected && selectedItem) {\n        // Always de-select children when de-selected\n        selectedItem.removeAttribute('selected');\n      }\n    }\n\n    this.trigger(`${this.tagName.toLowerCase()}:_selectedchanged`);\n  }\n\n  /**\n   The name of this organization.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._name || '';\n  }\n\n  set name(value) {\n    this._name = transform.string(value);\n    this._reflectAttribute('name', this._name);\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    // Validate the selection only if we're an organization\n    if (this.tagName === 'CORAL-SHELL-ORGANIZATION') {\n      // Don't stop propagation here as the orgSwitcher listens to the event too\n      const item = event.target;\n      this._validateSelection(item);\n    }\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    // Move all items into the right place\n    this._moveItems();\n\n    this._validateSelection(item);\n  }\n\n  /** @private */\n  _onItemRemoved(item) {\n    this._setParent();\n\n    this._validateSelection(item);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    // gets the current selection\n    const selection = this.items._getAllSelected();\n    const selectionCount = selection.length;\n\n    if (selectionCount > 1) {\n      for (let i = 0 ; i < selectionCount ; i++) {\n        if (selection[i] !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selection[i].removeAttribute('selected');\n        }\n      }\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger(`${this.tagName.toLowerCase()}:change`, {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @private */\n  _moveItems() {\n    Array.prototype.forEach.call(this.querySelectorAll('coral-shell-suborganization'), (item) => {\n      if (!this._elements.items.contains(item)) {\n        this._elements.items.appendChild(item);\n      }\n    });\n  }\n\n  /** @private */\n  _setParent() {\n    const hasChildren = this.items.length !== 0;\n\n    if (hasChildren) {\n      this.removeAttribute('role');\n      this.removeAttribute('tabindex');\n    } else {\n      // Be accessible\n      this.setAttribute('role', 'button');\n      this.setAttribute('tabindex', 0);\n    }\n\n    this.classList.toggle('is-parent', hasChildren);\n  }\n\n  /** @private */\n  _onClick() {\n    if (this.items.length !== 0) {\n      // You can't be selected if you have sub-organizations\n      return;\n    }\n\n    this.selected = true;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['name', 'selected']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Move items into the right place\n    this._moveItems();\n\n    this.setAttribute('id', this.id || commons.getUID());\n\n    // Support cloneNode\n    const items = this.querySelector(`#${this.id} > ._coral-Shell-orgSwitcher-subitems`);\n    if (items) {\n      items.remove();\n    }\n    const checkmark = this.querySelector(`#${this.id} > ._coral-Shell-orgSwitcher-checkmark`);\n    if (checkmark) {\n      checkmark.remove();\n    }\n\n    // Render template\n    const frag = document.createDocumentFragment();\n\n    frag.appendChild(this._elements.checkmark);\n    frag.appendChild(this._elements.items);\n    this.appendChild(frag);\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n\n    this._setParent();\n  }\n\n  /**\n   Triggered when a {@link ShellOrganization} selection changed.\n\n   @typedef {CustomEvent} coral-shell-organization:_selectedchanged\n\n   @private\n   */\n}\n\nexport default ShellOrganization;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1645,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1646,
    "kind": "class",
    "name": "ShellOrganization",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Organization component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Organization"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Organization component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-organization"
      }
    ],
    "interface": false,
    "extends": [
      "ListItem"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-organization></coral-shell-organization>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Organization();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1647,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 29,
    "ignore": true
  },
  {
    "__docId__": 1648,
    "kind": "member",
    "name": "_oldSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_oldSelection",
    "access": "private",
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1649,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 58,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1650,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_items",
    "access": "private",
    "description": null,
    "lineNumber": 61,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1651,
    "kind": "member",
    "name": "selectedItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#selectedItem",
    "access": "public",
    "description": "Returns the selected workspace.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 79,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1652,
    "kind": "member",
    "name": "selected",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#selected",
    "access": "public",
    "description": "Whether this organization is selected.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 91,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "selected"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1654,
    "kind": "member",
    "name": "_selected",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_selected",
    "access": "private",
    "description": null,
    "lineNumber": 96,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1655,
    "kind": "member",
    "name": "name",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#name",
    "access": "public",
    "description": "The name of this organization.\n<ul><li><code>\"\"</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 125,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "name"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1657,
    "kind": "member",
    "name": "_name",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_name",
    "access": "private",
    "description": null,
    "lineNumber": 130,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1658,
    "kind": "method",
    "name": "_onItemSelectedChanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_onItemSelectedChanged",
    "access": "private",
    "description": null,
    "lineNumber": 135,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1659,
    "kind": "method",
    "name": "_onItemAdded",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_onItemAdded",
    "access": "private",
    "description": null,
    "lineNumber": 145,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1660,
    "kind": "method",
    "name": "_onItemRemoved",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_onItemRemoved",
    "access": "private",
    "description": null,
    "lineNumber": 153,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1661,
    "kind": "method",
    "name": "_validateSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_validateSelection",
    "access": "private",
    "description": null,
    "lineNumber": 160,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1662,
    "kind": "member",
    "name": "_preventTriggeringEvents",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_preventTriggeringEvents",
    "access": "private",
    "description": null,
    "lineNumber": 169,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 1664,
    "kind": "method",
    "name": "_triggerChangeEvent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_triggerChangeEvent",
    "access": "private",
    "description": null,
    "lineNumber": 182,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1666,
    "kind": "method",
    "name": "_moveItems",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_moveItems",
    "access": "private",
    "description": null,
    "lineNumber": 197,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1667,
    "kind": "method",
    "name": "_setParent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_setParent",
    "access": "private",
    "description": null,
    "lineNumber": 206,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1668,
    "kind": "method",
    "name": "_onClick",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#_onClick",
    "access": "private",
    "description": null,
    "lineNumber": 222,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1670,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 232,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1671,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization#render",
    "access": "public",
    "description": null,
    "lineNumber": 237,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1672,
    "kind": "typedef",
    "name": "coral-shell-organization:_selectedchanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellOrganization.js~ShellOrganization.coral-shell-organization:_selectedchanged",
    "access": "private",
    "description": "Triggered when a {@link ShellOrganization} selection changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-shell-organization:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1676,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport selectListSwitcher from '../templates/selectListSwitcher';\nimport {SelectList} from '../../../coral-component-list';\nimport {commons} from '../../../coral-utils';\n\nconst CLASSNAME =  '_coral-Shell-selectListSwitcher';\n\n/**\n @class Coral.Shell.SelectListSwitcher\n @classdesc A Shell SelectList Switcher component\n @htmltag coral-shell-selectlistswitcher\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellSelectListSwitcher extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Template\n    this._elements = {};\n\n    selectListSwitcher.call(this._elements);\n\n    this._delegateEvents({\n      'coral-selectlist:change':'_onSelectListChange',\n      'coral-shell-selectlistswitcher-item:change': '_onUpdateHref'\n    });\n  }\n\n  /**\n   The item collection.\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-shell-selectlistswitcher-item',\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n    return this._items;\n  }\n\n  _onItemAdded(item) {\n    item.id = item.id || commons.getUID();\n\n    let selectListItem = document.createElement('coral-selectlist-item');\n    if (item.href){\n      selectListItem.setAttribute(\"href\", item.href);\n    }\n    selectListItem.textContent = item.textContent;\n    selectListItem.id = item.id + \"-selectlist-item\";\n\n    this._elements.container.items.add(selectListItem);\n  }\n\n  _onItemRemoved(item) {\n    let selectListItemId = item.id + \"-selectlist-item\";\n    let selectListItem = this._elements.container.querySelector('#'+ selectListItemId);\n\n    this._elements.container.items.remove(selectListItem);\n  }\n\n  _onSelectListChange(event) {\n     const selectList = event.target;\n     const selectListItem = selectList.selectedItem;\n     if (selectListItem.hasAttribute(\"href\")) {\n      const href = selectListItem.getAttribute(\"href\");\n      window.open(href, '_self');\n     }\n  }\n\n  _onUpdateHref(event){\n    const switcherListItem = event.target;\n    let selectListItemId = switcherListItem.id + \"-selectlist-item\";\n    let selectListItem = this._elements.container.querySelector('#'+ selectListItemId);\n    if (switcherListItem.href){\n      selectListItem.setAttribute(\"href\", switcherListItem.getAttribute(\"href\"));\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n    const container = this.querySelector('._coral-Shell-selectList-container') || this._elements.container;\n    // Put the container as first child\n    this.insertBefore(container, this.firstChild);\n    this.items._startHandlingItems();\n  }\n}\n\nexport default ShellSelectListSwitcher;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1677,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1678,
    "kind": "class",
    "name": "ShellSelectListSwitcher",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell SelectList Switcher component",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.SelectListSwitcher"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell SelectList Switcher component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-selectlistswitcher"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-selectlistswitcher></coral-shell-selectlistswitcher>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.SelectListSwitcher();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1679,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 30,
    "ignore": true
  },
  {
    "__docId__": 1680,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 34,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 1681,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 49,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1682,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_items",
    "access": "private",
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1683,
    "kind": "method",
    "name": "_onItemAdded",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_onItemAdded",
    "access": "private",
    "description": null,
    "lineNumber": 62,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1684,
    "kind": "method",
    "name": "_onItemRemoved",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_onItemRemoved",
    "access": "private",
    "description": null,
    "lineNumber": 75,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1685,
    "kind": "method",
    "name": "_onSelectListChange",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_onSelectListChange",
    "access": "private",
    "description": null,
    "lineNumber": 82,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1686,
    "kind": "method",
    "name": "_onUpdateHref",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#_onUpdateHref",
    "access": "private",
    "description": null,
    "lineNumber": 91,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1687,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcher.js~ShellSelectListSwitcher#render",
    "access": "public",
    "description": null,
    "lineNumber": 101,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1688,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-selectlistswitcher-item';\n\n/**\n @class Coral.Shell.SelectListSwitcherItem\n @classdesc A Shell SelectListSwitcherItem component\n @htmltag coral-shell-selectlistswitcher-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellSelectListSwitcherItem extends BaseComponent(HTMLElement) {\n\n/**\n   href property of item\n   @type {String}\n   @htmlattribute href\n   @htmlattributereflected\n   */\n  get href() {\n    return this._href;\n  }\n\n  set href(value) {\n    var href = transform.string(value);\n    var update = false;\n    if(this._href) {\n      update = true;\n    }\n    this._href = href;\n    this._reflectAttribute('href', this._href);\n    if(update) {\n      this.trigger('coral-shell-selectlistswitcher-item:change');\n    }\n  }\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['href']);\n  }\n    /** @ignore */\n    render() {\n      super.render();\n      this.classList.add(CLASSNAME);\n    }\n  }\n\n  export default ShellSelectListSwitcherItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1689,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1690,
    "kind": "class",
    "name": "ShellSelectListSwitcherItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell SelectListSwitcherItem component",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.SelectListSwitcherItem"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell SelectListSwitcherItem component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-selectlistswitcher-item"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-selectlistswitcher-item></coral-shell-selectlistswitcher-item>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.SelectListSwitcherItem();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1691,
    "kind": "member",
    "name": "href",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem#href",
    "access": "public",
    "description": "href property of item\n<ul><li><code>reflected</code></li></ul>",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@htmlattribute",
        "tagValue": "href"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1693,
    "kind": "member",
    "name": "_href",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem#_href",
    "access": "private",
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1694,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 50,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1695,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSelectListSwitcherItem.js~ShellSelectListSwitcherItem#render",
    "access": "public",
    "description": null,
    "lineNumber": 54,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1696,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\nimport solutionIcon from '../templates/solutionIcon';\n\nconst CLASSNAME = '_coral-Shell-solution';\n\n/**\n @class Coral.Shell.Solution\n @classdesc A Shell Solution component\n @htmltag coral-shell-solution\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n */\nclass ShellSolution extends BaseComponent(HTMLAnchorElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      label: this.querySelector('coral-shell-solution-label') || document.createElement('coral-shell-solution-label')\n    };\n    solutionIcon.call(this._elements);\n  }\n\n  /**\n   Specifies the icon name used inside the button. See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.icon.icon;\n  }\n\n  set icon(value) {\n    this._elements.icon.icon = value;\n  }\n\n  /**\n   The solution's label content zone.\n\n   @type {ShellSolutionLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-shell-solution-label',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Whether a solution is linked or not\n\n   @type {Boolean}\n   @default false\n   @htmlattribute linked\n   @htmlattributereflected\n   */\n  get linked() {\n    return this._linked || false;\n  }\n\n  set linked(value) {\n    this._linked = transform.booleanAttr(value);\n    this._reflectAttribute('linked', this._linked);\n\n    this.classList.toggle(`${CLASSNAME}--linked`, this._linked);\n  }\n\n  get _contentZones() {\n    return {'coral-shell-solution-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['icon', 'linked']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const fragment = document.createDocumentFragment();\n\n    // Render template\n    fragment.appendChild(this._elements.icon);\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label) {\n      label.remove();\n    }\n\n    // Move any remaining elements into the content sub-component\n    while (this.firstChild) {\n      const child = this.firstChild;\n\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'icon') {\n        label.appendChild(child);\n      } else {\n        this.removeChild(child);\n      }\n    }\n\n    // Add template to component\n    this.appendChild(fragment);\n\n    // Call the content zone insert\n    this.label = label;\n  }\n}\n\nexport default ShellSolution;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1697,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1698,
    "kind": "class",
    "name": "ShellSolution",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Solution component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Solution"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Solution component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-solution"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLAnchorElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLAnchorElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-solution></coral-shell-solution>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Solution();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1699,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 1700,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"label\": *}"
      ]
    }
  },
  {
    "__docId__": 1701,
    "kind": "member",
    "name": "icon",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#icon",
    "access": "public",
    "description": "Specifies the icon name used inside the button. See {@link Icon} for valid icon names.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 46,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "icon"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1703,
    "kind": "member",
    "name": "label",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#label",
    "access": "public",
    "description": "The solution's label content zone.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 60,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellSolutionLabel"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1705,
    "kind": "member",
    "name": "linked",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#linked",
    "access": "public",
    "description": "Whether a solution is linked or not\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 82,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "linked"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1707,
    "kind": "member",
    "name": "_linked",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#_linked",
    "access": "private",
    "description": null,
    "lineNumber": 87,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1708,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 93,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1709,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 98,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1710,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolution.js~ShellSolution#render",
    "access": "public",
    "description": null,
    "lineNumber": 103,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1712,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.Solution.Label\n @classdesc Shell's Solution label component\n @htmltag coral-shell-solution-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-solution-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSolutionLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1713,
    "kind": "function",
    "name": "ShellSolutionLabel",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionLabel.js~ShellSolutionLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's Solution label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Solution.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's Solution label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-solution-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-solution-label></coral-shell-solution-label>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Solution.Label();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1714,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\nimport solutionSwitcher from '../templates/solutionSwitcher';\n\nconst CLASSNAME = '_coral-Shell-solutionSwitcher';\n\n/**\n @class Coral.Shell.SolutionSwitcher\n @classdesc A Shell Solution Switcher component\n @htmltag coral-shell-solutionswitcher\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellSolutionSwitcher extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Template\n    this._elements = {};\n    solutionSwitcher.call(this._elements);\n\n    // Listen for mutations\n    const observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n          const addedNode = mutation.addedNodes[i];\n          // Move non secondary solutions to the container\n          if (addedNode.nodeName === 'CORAL-SHELL-SOLUTIONS' && !addedNode.hasAttribute('secondary')) {\n            this._elements.container.appendChild(addedNode);\n          }\n        }\n      });\n    });\n\n    observer.observe(this, {\n      // Only care about direct children\n      childList: true\n    });\n  }\n\n  /**\n   The item collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-shell-solutions'\n      });\n    }\n\n    return this._items;\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // force darkest theme\n    this.classList.add('coral--darkest');\n\n    const container = this.querySelector('._coral-Shell-solutions-container') || this._elements.container;\n\n    // Remove it so we can process solutions\n    if (container.parentNode) {\n      container.remove();\n    }\n\n    // Move non secondary solutions to the container\n    Array.prototype.forEach.call(this.querySelectorAll('coral-shell-solutions:not([secondary])'), (item) => {\n      container.appendChild(item);\n    });\n\n    // Put the container as first child\n    this.insertBefore(container, this.firstChild);\n  }\n}\n\nexport default ShellSolutionSwitcher;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1715,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1716,
    "kind": "class",
    "name": "ShellSolutionSwitcher",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Solution Switcher component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.SolutionSwitcher"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Solution Switcher component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-solutionswitcher"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-solutionswitcher></coral-shell-solutionswitcher>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.SolutionSwitcher();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1717,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 1718,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 1719,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 60,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1720,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher#_items",
    "access": "private",
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1721,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionSwitcher.js~ShellSolutionSwitcher#render",
    "access": "public",
    "description": null,
    "lineNumber": 73,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1722,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\nimport {transform} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-solutions';\n\n/**\n @class Coral.Shell.Solutions\n @classdesc A Shell Solutions component\n @htmltag coral-shell-solutions\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellSolutions extends BaseComponent(HTMLElement) {\n  /**\n   The item collection.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-shell-solution',\n        itemBaseTagName: 'a'\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Whether the solution list is secondary.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute secondary\n   @htmlattributereflected\n   */\n  get secondary() {\n    return this._secondary || false;\n  }\n\n  set secondary(value) {\n    this._secondary = transform.booleanAttr(value);\n    this._reflectAttribute('secondary', this._secondary);\n\n    this.classList.toggle(`${CLASSNAME}--secondary`, this._secondary);\n  }\n\n  _sortSolutions() {\n    if (this.items.length > 1) {\n      const linked = [];\n      const nonLinked = [];\n      const isSecondary = this.hasAttribute('secondary');\n\n      this.items.getAll().forEach((item, i) => {\n        // Exclude the first secondary item\n        if (!(isSecondary && i === 0)) {\n          if (item.hasAttribute('linked')) {\n            linked.push(item);\n          } else {\n            nonLinked.push(item);\n          }\n        }\n      });\n\n      const alphabeticalSort = (a, b) => {\n        const aText = a.textContent.trim().toLowerCase();\n        const bText = b.textContent.trim().toLowerCase();\n\n        if (aText < bText) {\n          return -1;\n        }\n        if (aText > bText) {\n          return 1;\n        }\n        return 0;\n      };\n\n      linked.sort(alphabeticalSort);\n      nonLinked.sort(alphabeticalSort);\n\n      linked.forEach((item) => {\n        this.appendChild(item);\n      });\n\n      nonLinked.forEach((item) => {\n        this.appendChild(item);\n      });\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['secondary']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Sort linked solutions then non linked solutions alphabetically\n    this._sortSolutions();\n  }\n}\n\nexport default ShellSolutions;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1723,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1724,
    "kind": "class",
    "name": "ShellSolutions",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Solutions component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Solutions"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Solutions component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-solutions"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-solutions></coral-shell-solutions>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Solutions();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1725,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 33,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1726,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#_items",
    "access": "private",
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1727,
    "kind": "member",
    "name": "secondary",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#secondary",
    "access": "public",
    "description": "Whether the solution list is secondary.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 54,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "secondary"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1729,
    "kind": "member",
    "name": "_secondary",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#_secondary",
    "access": "private",
    "description": null,
    "lineNumber": 59,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1730,
    "kind": "method",
    "name": "_sortSolutions",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#_sortSolutions",
    "access": "private",
    "description": null,
    "lineNumber": 65,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1731,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 109,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1732,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutions.js~ShellSolutions#render",
    "access": "public",
    "description": null,
    "lineNumber": 114,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1733,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionsHeader.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\n\n/**\n @class Coral.Shell.Solutions.Header\n @classdesc Shell's solution sub-cloud name\n @htmltag coral-shell-solutions-header\n @return {HTMLElement}\n\n @deprecated\n */\nexport default () => {\n  commons._log('warn', 'Coral.Shell.Solutions.Header: coral-shell-solutions-header is deprecated.');\n  return document.createElement('coral-shell-solutions-header');\n};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSolutionsHeader.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1734,
    "kind": "function",
    "name": "ShellSolutionsHeader",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionsHeader.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSolutionsHeader.js~ShellSolutionsHeader",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's solution sub-cloud name",
    "lineNumber": 23,
    "deprecated": true,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Solutions.Header"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's solution sub-cloud name"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-solutions-header"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-solutions-header></coral-shell-solutions-header>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Solutions.Header();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1735,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport ShellOrganization from './ShellOrganization';\nimport {Icon} from '../../../coral-component-icon';\n\nconst CLASSNAME = '_coral-Shell-orgSwitcher-subitem';\n\n/**\n @class Coral.Shell.Suborganization\n @classdesc A Shell Sub organization component\n @htmltag coral-shell-suborganization\n @extends {ShellOrganization}\n */\nclass ShellSuborganization extends ShellOrganization {\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Set the icon size\n    this._elements.icon.size = Icon.size.SMALL;\n\n    // Be accessible\n    this.setAttribute('role', 'button');\n    this.setAttribute('tabindex', 0);\n  }\n}\n\nexport default ShellSuborganization;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1736,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1737,
    "kind": "class",
    "name": "ShellSuborganization",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js~ShellSuborganization",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Sub organization component",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Suborganization"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Sub organization component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-suborganization"
      }
    ],
    "interface": false,
    "extends": [
      "ShellOrganization"
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-suborganization></coral-shell-suborganization>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Suborganization();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1738,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js~ShellSuborganization",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellSuborganization.js~ShellSuborganization#render",
    "access": "public",
    "description": null,
    "lineNumber": 26,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1739,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport user from '../templates/user';\n\nconst CLASSNAME = '_coral-Shell-user';\n\n/**\n Enumeration for {@link ShellUser} avatar options. Avatar assets should use one of those provided, when no asset is set\n\n @typedef {Object} ShellUserAvatarEnum\n\n @property {String} DEFAULT\n Default avatar, show user icon from icon font.\n */\nconst avatar = {\n  DEFAULT: 'UserCircleColor_Light'\n};\n\n/**\n @class Coral.Shell.User\n @classdesc A Shell User component\n @htmltag coral-shell-user\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellUser extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      name: this.querySelector('coral-shell-user-name') || document.createElement('coral-shell-user-name'),\n      heading: this.querySelector('coral-shell-user-heading') || document.createElement('coral-shell-user-heading'),\n      subheading: this.querySelector('coral-shell-user-subheading') || document.createElement('coral-shell-user-subheading'),\n      content: this.querySelector('coral-shell-user-content') || document.createElement('coral-shell-user-content'),\n      footer: this.querySelector('coral-shell-user-footer') || document.createElement('coral-shell-user-footer')\n    };\n\n    this._elements.name.setAttribute('role', 'heading');\n    this._elements.name.setAttribute('aria-level', '2');\n\n    user.call(this._elements, {icon: avatar.DEFAULT});\n  }\n\n  /**\n   Specifies the asset used inside the avatar view.\n   See {@link Icon} for valid usage and icon names.\n\n   @type {String}\n   @default ShellUserAvatarEnum.DEFAULT\n   @htmlattribute avatar\n   */\n  get avatar() {\n    return this._elements.avatar.icon;\n  }\n\n  set avatar(value) {\n    this._elements.avatar.icon = value;\n  }\n\n  /**\n   The name content zone of the user-menu.\n\n   @type {ShellUserName}\n   @contentzone\n   */\n  get name() {\n    return this._getContentZone(this._elements.name);\n  }\n\n  set name(value) {\n    this._setContentZone('content', value, {\n      handle: 'name',\n      tagName: 'coral-shell-user-name',\n      insert: function (content) {\n        this._elements.container.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The heading content zone of the user-menu.\n\n   @type {ShellUserHeading}\n   @contentzone\n   */\n  get heading() {\n    return this._getContentZone(this._elements.heading);\n  }\n\n  set heading(value) {\n    this._setContentZone('heading', value, {\n      handle: 'heading',\n      tagName: 'coral-shell-user-heading',\n      insert: function (content) {\n        this._elements.container.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The subheading content zone of the user-menu.\n\n   @type {ShellUserSubheading}\n   @contentzone\n   */\n  get subheading() {\n    return this._getContentZone(this._elements.subheading);\n  }\n\n  set subheading(value) {\n    this._setContentZone('subheading', value, {\n      handle: 'subheading',\n      tagName: 'coral-shell-user-subheading',\n      insert: function (content) {\n        this._elements.container.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The main content zone of the user-menu.\n\n   @type {ShellUserContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-shell-user-content',\n      insert: function (content) {\n        // Empty content to hide it\n        if (content.innerHTML.trim() === '') {\n          content.innerHTML = '';\n        }\n\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The footer content zone of the user-menu.\n\n   @type {ShellUserFooter}\n   @contentzone\n   */\n  get footer() {\n    return this._getContentZone(this._elements.footer);\n  }\n\n  set footer(value) {\n    this._setContentZone('footer', value, {\n      handle: 'footer',\n      tagName: 'coral-shell-user-footer',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {\n      'coral-shell-user-name': 'name',\n      'coral-shell-user-heading': 'heading',\n      'coral-shell-user-subheading': 'subheading',\n      'coral-shell-user-content': 'content',\n      'coral-shell-user-footer': 'footer'\n    };\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['avatar']);\n  }\n\n  /**\n   Returns {@link ShellUser} avatar options.\n\n   @return {ShellUserAvatarEnum}\n   */\n  static get avatar() {\n    return avatar;\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const frag = document.createDocumentFragment();\n\n    // Render template\n    frag.appendChild(this._elements.container);\n\n    for (const contentZone in this._contentZones) {\n      const element = this._elements[this._contentZones[contentZone]];\n      // Remove it so we can process children\n      if (element.parentNode) {\n        element.parentNode.removeChild(element);\n      }\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'container') {\n        // Add non-template elements to the content\n        this._elements.content.appendChild(child);\n      } else {\n        // Remove anything else element\n        this.removeChild(child);\n      }\n    }\n\n    this.appendChild(frag);\n\n    // Assign the content zones so the insert functions will be called\n    for (const contentZone in this._contentZones) {\n      const contentZoneName = this._contentZones[contentZone];\n      const element = this._elements[this._contentZones[contentZone]];\n\n      /** @ignore */\n      this[contentZoneName] = element;\n    }\n  }\n}\n\nexport default ShellUser;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUser.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1740,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1741,
    "kind": "typedef",
    "name": "ShellUserAvatarEnum",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUserAvatarEnum",
    "access": "public",
    "description": "Enumeration for {@link ShellUser} avatar options. Avatar assets should use one of those provided, when no asset is set",
    "lineNumber": 26,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Default avatar, show user icon from icon font."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ShellUserAvatarEnum"
    }
  },
  {
    "__docId__": 1742,
    "kind": "class",
    "name": "ShellUser",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell User component",
    "lineNumber": 37,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell User component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user></coral-shell-user>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1743,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 39,
    "ignore": true
  },
  {
    "__docId__": 1744,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"name\": *, \"heading\": *, \"subheading\": *, \"content\": *, \"footer\": *}"
      ]
    }
  },
  {
    "__docId__": 1745,
    "kind": "member",
    "name": "avatar",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#avatar",
    "access": "public",
    "description": "Specifies the asset used inside the avatar view.\nSee {@link Icon} for valid usage and icon names.\n<ul><li><code>ShellUserAvatarEnum.DEFAULT</code> by default.</li></ul>",
    "lineNumber": 66,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "ShellUserAvatarEnum.DEFAULT"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "avatar"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1747,
    "kind": "member",
    "name": "name",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#name",
    "access": "public",
    "description": "The name content zone of the user-menu.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 80,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellUserName"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1749,
    "kind": "member",
    "name": "heading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#heading",
    "access": "public",
    "description": "The heading content zone of the user-menu.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 100,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellUserHeading"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1751,
    "kind": "member",
    "name": "subheading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#subheading",
    "access": "public",
    "description": "The subheading content zone of the user-menu.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 120,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellUserSubheading"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1753,
    "kind": "member",
    "name": "content",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#content",
    "access": "public",
    "description": "The main content zone of the user-menu.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 140,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellUserContent"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1755,
    "kind": "member",
    "name": "footer",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#footer",
    "access": "public",
    "description": "The footer content zone of the user-menu.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 165,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "ShellUserFooter"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1757,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 179,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1758,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 190,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1759,
    "kind": "member",
    "name": "avatar",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser.avatar",
    "access": "public",
    "description": "Returns {@link ShellUser} avatar options.",
    "lineNumber": 199,
    "return": {
      "nullable": null,
      "types": [
        "ShellUserAvatarEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1760,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#render",
    "access": "public",
    "description": null,
    "lineNumber": 204,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1761,
    "kind": "member",
    "name": "[contentZoneName]",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUser.js~ShellUser#[contentZoneName]",
    "access": "public",
    "description": null,
    "lineNumber": 242,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1762,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUserContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.User.Content\n @classdesc Shell's User content component\n @htmltag coral-shell-user-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-user-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUserContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1763,
    "kind": "function",
    "name": "ShellUserContent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUserContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUserContent.js~ShellUserContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's User content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's User content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user-content></coral-shell-user-content>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User.Content();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1764,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUserFooter.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.User.Footer\n @classdesc Shell's User footer component\n @htmltag coral-shell-user-footer\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-user-footer');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUserFooter.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1765,
    "kind": "function",
    "name": "ShellUserFooter",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUserFooter.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUserFooter.js~ShellUserFooter",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's User footer component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User.Footer"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's User footer component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user-footer"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user-footer></coral-shell-user-footer>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User.Footer();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1766,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUserHeading.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.User.Heading\n @classdesc Shell's User heading component\n @htmltag coral-shell-user-heading\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-user-heading');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUserHeading.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1767,
    "kind": "function",
    "name": "ShellUserHeading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUserHeading.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUserHeading.js~ShellUserHeading",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's User heading component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User.Heading"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's User heading component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user-heading"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user-heading></coral-shell-user-heading>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User.Heading();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1768,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUserName.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.User.Name\n @classdesc Shell's User name component\n @htmltag coral-shell-user-name\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-user-name');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUserName.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1769,
    "kind": "function",
    "name": "ShellUserName",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUserName.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUserName.js~ShellUserName",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's User name component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User.Name"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's User name component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user-name"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user-name></coral-shell-user-name>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User.Name();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1770,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellUserSubheading.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Shell.User.Subheading\n @classdesc Shell's User subheading component\n @htmltag coral-shell-user-subheading\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-shell-user-subheading');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellUserSubheading.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1771,
    "kind": "function",
    "name": "ShellUserSubheading",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellUserSubheading.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellUserSubheading.js~ShellUserSubheading",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "Shell's User subheading component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.User.Subheading"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Shell's User subheading component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-user-subheading"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-user-subheading></coral-shell-user-subheading>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.User.Subheading();"
    ],
    "see": [
      "../examples/#shell"
    ],
    "params": []
  },
  {
    "__docId__": 1772,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Shell-workspaces-workspace';\n\n/**\n @class Coral.Shell.Workspace\n @classdesc A Shell Workspace component\n @htmltag coral-shell-workspace\n @htmlbasetag a\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n */\nclass ShellWorkspace extends BaseComponent(HTMLAnchorElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      click: '_onClick'\n    });\n  }\n\n  /**\n   Whether this workspace is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.setAttribute('aria-selected', this._selected);\n    this.classList.toggle('is-selected', this._selected);\n\n    this.trigger('coral-shell-workspace:_selectedchanged');\n  }\n\n  /** @private */\n  _onClick() {\n    if (!this.selected) {\n      this.selected = true;\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n\n  /**\n   Triggered when a {@link ShellWorkspace} selection changed.\n\n   @typedef {CustomEvent} coral-shell-workspace:_selectedchanged\n\n   @private\n   */\n}\n\nexport default ShellWorkspace;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1773,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1774,
    "kind": "class",
    "name": "ShellWorkspace",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Workspace component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Workspace"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Workspace component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-workspace"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "a"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLAnchorElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLAnchorElement)",
    "examples": [
      "<caption>Markup</caption>\n<a is=\"coral-shell-workspace\"></a>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Workspace();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1775,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 1776,
    "kind": "member",
    "name": "selected",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace#selected",
    "access": "public",
    "description": "Whether this workspace is selected.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "selected"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1778,
    "kind": "member",
    "name": "_selected",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace#_selected",
    "access": "private",
    "description": null,
    "lineNumber": 50,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1779,
    "kind": "method",
    "name": "_onClick",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace#_onClick",
    "access": "private",
    "description": null,
    "lineNumber": 60,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1781,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 67,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1782,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace#render",
    "access": "public",
    "description": null,
    "lineNumber": 72,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1783,
    "kind": "typedef",
    "name": "coral-shell-workspace:_selectedchanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspace.js~ShellWorkspace.coral-shell-workspace:_selectedchanged",
    "access": "private",
    "description": "Triggered when a {@link ShellWorkspace} selection changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-shell-workspace:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 1784,
    "kind": "file",
    "name": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {Select} from '../../../coral-component-select';\n\nconst CLASSNAME = '_coral-Shell-workspaces';\n\n/**\n @class Coral.Shell.Workspaces\n @classdesc A Shell Workspaces component\n @htmltag coral-shell-workspaces\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass ShellWorkspaces extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Events\n    this._delegateEvents({\n      'key:down [is=\"coral-shell-workspace\"]': '_focusNextItem',\n      'key:right [is=\"coral-shell-workspace\"]': '_focusNextItem',\n      'key:left [is=\"coral-shell-workspace\"]': '_focusPreviousItem',\n      'key:up [is=\"coral-shell-workspace\"]': '_focusPreviousItem',\n      'key:pageup [is=\"coral-shell-workspace\"]': '_focusPreviousItem',\n      'key:pagedown [is=\"coral-shell-workspace\"]': '_focusNextItem',\n      'key:home [is=\"coral-shell-workspace\"]': '_focusFirstItem',\n      'key:end [is=\"coral-shell-workspace\"]': '_focusLastItem',\n      // private\n      'coral-shell-workspace:_selectedchanged': '_onItemSelectedChanged',\n      'change ._coral-Shell-workspaces-select': '_onSelectChanged'\n    });\n\n    // Template\n    this._elements = {\n      select: new Select().set({\n        variant: 'quiet'\n      })\n    };\n    this._elements.select.classList.add('_coral-Shell-workspaces-select');\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The item collection.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request:\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-shell-workspace',\n        itemBaseTagName: 'a',\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Returns the selected workspace.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    // gets the current selection\n    const selection = this.items._getAllSelected();\n    const selectionCount = selection.length;\n\n    // if no item is currently selected, we need to find a candidate\n    if (selectionCount === 0) {\n      // gets the first candidate for selection\n      const selectable = this.items._getFirstSelectable();\n\n      if (selectable) {\n        selectable.setAttribute('selected', '');\n      }\n    }\n    // more items are selected, so we find a single item and deselect everything else\n    else if (selectionCount > 1) {\n      // By default, the last one stays selected\n      item = item || selection[selection.length - 1];\n\n      for (let i = 0 ; i < selectionCount ; i++) {\n        if (selection[i] !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selection[i].removeAttribute('selected');\n        }\n      }\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    // Sync select items under the hood\n    this._renderSelectItems();\n\n    this._triggerChangeEvent();\n  }\n\n  _renderSelectItems() {\n    this._elements.select.items.clear();\n\n    this.items.getAll().forEach((item) => {\n      this._elements.select.items.add({\n        content: {\n          innerHTML: item.innerHTML\n        },\n        selected: item.hasAttribute('selected'),\n        _workspace: item\n      });\n    });\n  }\n\n  _onSelectChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._elements.select.selectedItem._workspace.selected = true;\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-shell-workspaces:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    this._validateSelection(item);\n  }\n\n  /**\n   Returns true if the event is at the matched target.\n\n   @private\n   */\n  _eventIsAtTarget(event) {\n    const target = event.target;\n    const listItem = event.matchedTarget;\n\n    const isAtTarget = target === listItem;\n\n    if (isAtTarget) {\n      // Don't let arrow keys etc scroll the page\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    return isAtTarget;\n  }\n\n  /** @private */\n  _focusNextItem(event) {\n    if (!this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const target = event.matchedTarget;\n    if (target.nextElementSibling) {\n      target.nextElementSibling.focus();\n    } else {\n      this.items.first().focus();\n    }\n  }\n\n  /** @private */\n  _focusPreviousItem(event) {\n    if (!this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    const target = event.matchedTarget;\n    if (target.previousElementSibling) {\n      target.previousElementSibling.focus();\n    } else {\n      this.items.last().focus();\n    }\n  }\n\n  /** @private */\n  _focusFirstItem(event) {\n    if (!this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    this.items.first().focus();\n  }\n\n  /** @private */\n  _focusLastItem(event) {\n    if (!this._eventIsAtTarget(event)) {\n      return;\n    }\n\n    this.items.last().focus();\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n\n    // Support cloneNode\n    const template = this.querySelector('._coral-Shell-workspaces-select');\n    if (template) {\n      template.remove();\n    }\n\n    this.appendChild(this._elements.select);\n  }\n}\n\nexport default ShellWorkspaces;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1785,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1786,
    "kind": "class",
    "name": "ShellWorkspaces",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Shell}",
    "description": "A Shell Workspaces component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Shell.Workspaces"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Shell Workspaces component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-shell-workspaces"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-shell-workspaces></coral-shell-workspaces>",
      "<caption>JS constructor</caption>\nnew Coral.Shell.Workspaces();"
    ],
    "see": [
      "../examples/#shell"
    ]
  },
  {
    "__docId__": 1787,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "ignore": true
  },
  {
    "__docId__": 1788,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 47,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"select\": *}"
      ]
    }
  },
  {
    "__docId__": 1789,
    "kind": "member",
    "name": "_oldSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_oldSelection",
    "access": "private",
    "description": null,
    "lineNumber": 55,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1790,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#items",
    "access": "public",
    "description": "The item collection.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 67,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1791,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_items",
    "access": "private",
    "description": null,
    "lineNumber": 70,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1792,
    "kind": "member",
    "name": "selectedItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#selectedItem",
    "access": "public",
    "description": "Returns the selected workspace.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 88,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1793,
    "kind": "method",
    "name": "_validateSelection",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_validateSelection",
    "access": "private",
    "description": null,
    "lineNumber": 93,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1794,
    "kind": "member",
    "name": "_preventTriggeringEvents",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_preventTriggeringEvents",
    "access": "private",
    "description": null,
    "lineNumber": 115,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 1796,
    "kind": "method",
    "name": "_renderSelectItems",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_renderSelectItems",
    "access": "private",
    "description": null,
    "lineNumber": 130,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1797,
    "kind": "method",
    "name": "_onSelectChanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_onSelectChanged",
    "access": "private",
    "description": null,
    "lineNumber": 144,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1798,
    "kind": "method",
    "name": "_triggerChangeEvent",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_triggerChangeEvent",
    "access": "private",
    "description": null,
    "lineNumber": 151,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1800,
    "kind": "method",
    "name": "_onItemSelectedChanged",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_onItemSelectedChanged",
    "access": "private",
    "description": null,
    "lineNumber": 166,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1801,
    "kind": "method",
    "name": "_eventIsAtTarget",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_eventIsAtTarget",
    "access": "private",
    "description": "Returns true if the event is at the matched target.",
    "lineNumber": 178,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1802,
    "kind": "method",
    "name": "_focusNextItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_focusNextItem",
    "access": "private",
    "description": null,
    "lineNumber": 194,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1803,
    "kind": "method",
    "name": "_focusPreviousItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_focusPreviousItem",
    "access": "private",
    "description": null,
    "lineNumber": 208,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1804,
    "kind": "method",
    "name": "_focusFirstItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_focusFirstItem",
    "access": "private",
    "description": null,
    "lineNumber": 222,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1805,
    "kind": "method",
    "name": "_focusLastItem",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#_focusLastItem",
    "access": "private",
    "description": null,
    "lineNumber": 231,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1806,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-shell/src/scripts/ShellWorkspaces.js~ShellWorkspaces#render",
    "access": "public",
    "description": null,
    "lineNumber": 240,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1810,
    "kind": "file",
    "name": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-SideNav';\n\nconst isLevel = node => node.nodeName === 'CORAL-SIDENAV-LEVEL';\nconst isHeading = node => node.nodeName === 'CORAL-SIDENAV-HEADING';\nconst isItem = node => node.nodeName === 'A' && node.getAttribute('is') === 'coral-sidenav-item';\n\n/**\n Enumeration for {@link SideNav} variants.\n\n @typedef {Object} SideNavVariantEnum\n\n @property {String} DEFAULT\n A default sidenav.\n @property {String} MULTI_LEVEL\n A sidenav with multiple levels of indentation.\n */\nconst variant = {\n  DEFAULT: 'default',\n  MULTI_LEVEL: 'multilevel',\n};\n\n/**\n @class Coral.SideNav\n @classdesc A Side Navigation component to navigate the entire content of a product or a section.\n These can be used for a single level or a multi-level navigation.\n @htmltag coral-sidenav\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SideNav = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      // Interaction\n      'click a[is=\"coral-sidenav-item\"]': '_onItemClick',\n\n      // Accessibility\n      'capture:focus a[is=\"coral-sidenav-item\"].focus-ring': '_onItemFocusIn',\n      'capture:blur a[is=\"coral-sidenav-item\"]': '_onItemFocusOut',\n\n      // Private\n      'coral-sidenav-item:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Level Collection\n    this._levels = this.getElementsByTagName('coral-sidenav-level');\n\n    // Heading Collection\n    this._headings = this.getElementsByTagName('coral-sidenav-heading');\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n\n    // Initialize content MO\n    this._observer = new MutationObserver(this._handleMutations.bind(this));\n    this._observer.observe(this, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-sidenav-item',\n        itemBaseTagName: 'a',\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Returns the first selected item in the sidenav. The value <code>null</code> is returned if no element is\n   selected.\n\n   @type {SideNavItem}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected();\n  }\n\n  /**\n   The sidenav's variant. See {@link SideNavVariantEnum}.\n\n   @type {String}\n   @default SideNavVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.toggle(`${CLASSNAME}--multiLevel`, this._variant === variant.MULTI_LEVEL);\n\n    if (this.variant === variant.MULTI_LEVEL) {\n      // Don't hide the selected item level\n      const selectedItem = this.selectedItem;\n      const ignoreLevel = selectedItem && selectedItem.parentNode;\n\n      // Hide every other level that doesn't contain the selected item\n      for (let i = 0 ; i < this._levels.length ; i++) {\n        if (this._levels[i] !== ignoreLevel) {\n          this._levels[i].setAttribute('_expanded', 'off');\n        }\n      }\n    }\n  }\n\n  _onItemClick(event) {\n    const item = event.matchedTarget;\n\n    if (!item.selected) {\n      item.selected = true;\n    }\n  }\n\n  _onItemFocusIn(event) {\n    const item = event.matchedTarget;\n\n    item._elements.container.classList.add('focus-ring');\n  }\n\n  _onItemFocusOut(event) {\n    const item = event.matchedTarget;\n\n    item._elements.container.classList.remove('focus-ring');\n  }\n\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n    // Last selected item wins if multiple selection while not allowed\n    item = item || selectedItems[selectedItems.length - 1];\n\n    // Deselect other selected items\n    if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    // Expand multi level\n    this._expandLevels();\n\n    // Notify of change\n    this._triggerChangeEvent();\n  }\n\n  _expandLevels() {\n    const selectedItem = this.selectedItem;\n    if (selectedItem) {\n      let level = selectedItem.closest('coral-sidenav-level');\n\n      // Expand until root\n      while (level) {\n        level.setAttribute('_expanded', 'on');\n\n        const prev = level.previousElementSibling;\n        if (prev && prev.matches('a[is=\"coral-sidenav-item\"]')) {\n          prev.setAttribute('aria-expanded', 'true');\n        }\n\n        level = level.parentNode && level.parentNode.closest('coral-sidenav-level');\n      }\n\n      // Expand corresponding item level\n      level = selectedItem.nextElementSibling;\n      if (level && level.tagName === 'CORAL-SIDENAV-LEVEL') {\n        level.setAttribute('_expanded', 'on');\n        selectedItem.setAttribute('aria-expanded', 'true');\n      }\n    }\n  }\n\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-sidenav:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  _syncLevel(el, isRemoved) {\n    if (isRemoved) {\n      if (el.id && isLevel(el)) {\n        const item = this.querySelector(`a[is=\"coral-sidenav-item\"][aria-controls=\"${el.id}\"]`);\n        item && item.removeAttribute('aria-controls');\n      } else if (el.id && (isHeading(el) || isItem(el))) {\n        const level = this.querySelector(`coral-sidenav-level[aria-labelledby=\"${el.id}\"]`);\n        level && level.removeAttribute('aria-labelledby');\n        this._syncLevel(level);\n      }\n    } else if (isLevel(el)) {\n      const prev = el.previousElementSibling;\n      if (prev && (isHeading(prev) || isItem(prev))) {\n        prev.id = prev.id || commons.getUID();\n        el.setAttribute('aria-labelledby', prev.id);\n\n        if (isItem(prev)) {\n          el.id = el.id || commons.getUID();\n          prev.setAttribute('aria-controls', el.id);\n        }\n      }\n    } else if (isHeading(el) || isItem(el)) {\n      const next = el.nextElementSibling;\n      if (next && isLevel(next)) {\n        el.id = el.id || commons.getUID();\n        next.setAttribute('aria-labelledby', el.id);\n\n        if (isItem(el)) {\n          next.id = next.id || commons.getUID();\n          el.setAttribute('aria-controls', next.id);\n        }\n      }\n    }\n  }\n\n  _syncHeading(heading) {\n    heading.classList.add(`${CLASSNAME}-heading`);\n    heading.setAttribute('role', 'heading');\n  }\n\n  _handleMutations(mutations) {\n    mutations.forEach((mutation) => {\n      // Sync added levels and headings\n      for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n        const addedNode = mutation.addedNodes[i];\n\n        // a11y\n        this._syncLevel(addedNode);\n\n        // a11y\n        if (isHeading(addedNode)) {\n          this._syncHeading(addedNode);\n        }\n\n        if (isLevel(addedNode)) {\n          this._validateSelection(addedNode.querySelector('a[is=\"coral-sidenav-item\"][selected]'));\n        }\n      }\n\n      // Sync removed levels\n      for (let k = 0 ; k < mutation.removedNodes.length ; k++) {\n        const removedNode = mutation.removedNodes[k];\n\n        this._syncLevel(removedNode, true);\n\n        if (isLevel(removedNode)) {\n          this._validateSelection();\n        }\n      }\n    });\n  }\n\n  /**\n   Returns {@link SideNav} variants.\n\n   @return {SideNavVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // a11y\n    for (let i = 0 ; i < this._levels.length ; i++) {\n      this._syncLevel(this._levels[i]);\n    }\n\n    // a11y\n    for (let i = 0 ; i < this._headings.length ; i++) {\n      this._syncHeading(this._headings[i]);\n    }\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /**\n   Triggered when {@link SideNav} selected item has changed.\n\n   @typedef {CustomEvent} coral-sidenav:change\n\n   @property {SideNavItem} detail.oldSelection\n   The prior selected item.\n   @property {SideNavItem} detail.selection\n   The newly selected item.\n   */\n});\n\nexport default SideNav;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1811,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1812,
    "kind": "function",
    "name": "isLevel",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~isLevel",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1813,
    "kind": "function",
    "name": "isHeading",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~isHeading",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1814,
    "kind": "function",
    "name": "isItem",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~isItem",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 1815,
    "kind": "typedef",
    "name": "SideNavVariantEnum",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~SideNavVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link SideNav} variants.",
    "lineNumber": 34,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default sidenav."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MULTI_LEVEL",
        "description": "A sidenav with multiple levels of indentation."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "SideNavVariantEnum"
    }
  },
  {
    "__docId__": 1816,
    "kind": "variable",
    "name": "SideNav",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~SideNav",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SideNav}",
    "description": "A Side Navigation component to navigate the entire content of a product or a section.\nThese can be used for a single level or a multi-level navigation.",
    "lineNumber": 47,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SideNav"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Side Navigation component to navigate the entire content of a product or a section.\nThese can be used for a single level or a multi-level navigation."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-sidenav"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-sidenav></coral-sidenav>",
      "<caption>JS constructor</caption>\nnew Coral.SideNav();"
    ],
    "see": [
      "../examples/#sidenav"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1817,
    "kind": "typedef",
    "name": "coral-sidenav:change",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNav.js~coral-sidenav:change",
    "access": "public",
    "description": "Triggered when {@link SideNav} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "SideNavItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The prior selected item."
      },
      {
        "nullable": null,
        "types": [
          "SideNavItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-sidenav:change"
    }
  },
  {
    "__docId__": 1818,
    "kind": "file",
    "name": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavHeading.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.SideNav.Heading\n @classdesc The SideNav Heading\n @htmltag coral-sidenav-heading\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-sidenav-heading');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-sidenav/src/scripts/SideNavHeading.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1819,
    "kind": "function",
    "name": "SideNavHeading",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavHeading.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavHeading.js~SideNavHeading",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SideNav}",
    "description": "The SideNav Heading",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SideNav.Heading"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The SideNav Heading"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-sidenav-heading"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-sidenav-heading></coral-sidenav-heading>",
      "<caption>JS constructor</caption>\nnew Coral.SideNav.Heading();"
    ],
    "see": [
      "../examples/#sidenav"
    ],
    "params": []
  },
  {
    "__docId__": 1820,
    "kind": "file",
    "name": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nconst CLASSNAME = '_coral-SideNav-item';\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseLabellable} from '../../../coral-base-labellable';\nimport {transform} from '../../../coral-utils';\nimport item from '../templates/item';\nimport '../../../coral-component-icon';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.SideNav.Item\n @classdesc A SideNav Item component.\n @htmltag coral-sidenav-item\n @extends {HTMLAnchorElement}\n @extends {BaseComponent}\n */\nconst SideNavItem = Decorator(class extends BaseLabellable(BaseComponent(HTMLAnchorElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      content: this.querySelector('coral-sidenav-item-content') || document.createElement('coral-sidenav-item-content')\n    };\n\n    item.call(this._elements);\n\n    super._observeLabel();\n  }\n\n  /**\n   The content of the sidenav item.\n\n   @type {SideNavItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-sidenav-item-content',\n      insert: function (content) {\n        this._elements.container.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Specifies the icon name used inside the item. See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    return this._elements.icon.icon;\n  }\n\n  set icon(value) {\n    this._elements.icon.icon = value;\n    this._elements.icon.hidden = this._elements.icon.icon === '';\n\n    super._toggleIconAriaHidden();\n  }\n\n  /**\n   Whether the item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.classList.toggle('is-selected', this._selected);\n\n    this.trigger('coral-sidenav-item:_selectedchanged');\n  }\n\n  get _contentZones() {\n    return {'coral-sidenav-item-label': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'icon']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    // Render the main template\n    fragment.appendChild(this._elements.container);\n\n    const content = this._elements.content;\n\n    // Remove it so we can process children\n    if (content.parentNode) {\n      content.parentNode.removeChild(content);\n    }\n\n    // Process remaining elements as necessary\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'container') {\n        // Add non-template elements to the content\n        content.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(fragment);\n\n    // Assign the content zones, moving them into place in the process\n    this.content = content;\n  }\n});\n\nexport default SideNavItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1821,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Copyright 2019 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 13,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1822,
    "kind": "variable",
    "name": "SideNavItem",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItem.js~SideNavItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SideNav}",
    "description": "A SideNav Item component.",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SideNav.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A SideNav Item component."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-sidenav-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLAnchorElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-sidenav-item></coral-sidenav-item>",
      "<caption>JS constructor</caption>\nnew Coral.SideNav.Item();"
    ],
    "see": [
      "../examples/#sidenav"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1823,
    "kind": "file",
    "name": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.SideNav.Item.Content\n @classdesc The SideNav Item Content\n @htmltag coral-sidenav-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-sidenav-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-sidenav/src/scripts/SideNavItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1824,
    "kind": "function",
    "name": "SideNavItemContent",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavItemContent.js~SideNavItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SideNav}",
    "description": "The SideNav Item Content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SideNav.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The SideNav Item Content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-sidenav-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-sidenav-item-content></coral-sidenav-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.SideNav.Item.Content();"
    ],
    "see": [
      "../examples/#sidenav"
    ],
    "params": []
  },
  {
    "__docId__": 1825,
    "kind": "file",
    "name": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-SideNav';\n\n/**\n @class Coral.SideNav.Level\n @classdesc A SideNav Level component\n @htmltag coral-sidenav-level\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SideNavLevel = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['_expanded']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_expanded') {\n      const isExpanded = value === 'on';\n\n      if (oldValue !== value) {\n        this.classList.toggle('is-expanded', isExpanded);\n\n        // Do animation in next frame to avoid a forced reflow\n        window.requestAnimationFrame(() => {\n          // Don't animate on initialization\n          if (this._animate) {\n            // Remove height as we want the level to naturally grow if content is added later\n            commons.transitionEnd(this, () => {\n              if (isExpanded) {\n                this.style.height = '';\n              } else {\n                this.hidden = true;\n              }\n            });\n\n            // Force height to enable transition\n            if (!isExpanded) {\n              this.style.height = `${this.scrollHeight}px`;\n            } else {\n              this.hidden = false;\n            }\n\n            // We read the offset height to force a reflow, this is needed to start the transition between absolute values\n            // https://blog.alexmaccaw.com/css-transitions under Redrawing\n            // eslint-disable-next-line no-unused-vars\n            const offsetHeight = this.offsetHeight;\n\n            this.style.height = isExpanded ? `${this.scrollHeight}px` : 0;\n          } else {\n            // Make sure it's animated next time\n            this._animate = true;\n\n            // Hide it on initialization if closed\n            if (!isExpanded) {\n              this.style.height = 0;\n              this.hidden = true;\n            }\n          }\n        });\n      }\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'region');\n  }\n});\n\nexport default SideNavLevel;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1826,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1827,
    "kind": "variable",
    "name": "SideNavLevel",
    "memberof": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-sidenav/src/scripts/SideNavLevel.js~SideNavLevel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SideNav}",
    "description": "A SideNav Level component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SideNav.Level"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A SideNav Level component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-sidenav-level"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-sidenav-level></coral-sidenav-level>",
      "<caption>JS constructor</caption>\nnew Coral.SideNav.Level();"
    ],
    "see": [
      "../examples/#sidenav"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1828,
    "kind": "file",
    "name": "coral-spectrum/coral-component-slider/src/scripts/RangedSlider.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ExtensibleSlider, Slider} from './Slider';\nimport range from '../templates/range';\nimport {commons, transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n @class Coral.RangedSlider\n @classdesc A Ranged Slider\n @htmltag coral-rangedslider\n @extends {Slider}\n */\nconst RangedSlider = Decorator(class extends ExtensibleSlider {\n  /**\n   Ranged sliders are always filled.\n\n   @type {Boolean}\n   @default true\n   @htmlattribute filled\n   @htmlattributereflected\n   */\n  get filled() {\n    return true;\n  }\n\n  set filled(value) {\n    if (!transform.booleanAttr(value)) {\n      commons._log('warn', 'Coral.RangedSlider: filled can not be set to false.');\n    }\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this.startValue;\n  }\n\n  set value(value) {\n    this.startValue = value;\n  }\n\n  /**\n   The starting value of the range.\n\n   @type {String}\n   @default '1'\n   @emits {change}\n   @htmlattribute startValue\n   */\n  get startValue() {\n    return this.values[0] || '1';\n  }\n\n  set startValue(value) {\n    // Snap value to step\n    value = String(this._snapValueToStep(transform.number(value), this.min, this.max, this.step));\n\n    const values = this.values;\n    values[0] = value;\n    this.values = values;\n\n    // in order to keep the reset value in sync, we need to handle the \"startvalue\" attribute of the inner input\n    const input = this._elements.inputs[0];\n    const valueAttribute = this.getAttribute('startvalue') || this.getAttribute('value');\n    input[valueAttribute ? 'setAttribute' : 'removeAttribute']('value', valueAttribute);\n  }\n\n  /**\n   The ending value of the range.\n\n   @type {String}\n   @default '100'\n   @emits {change}\n   @htmlattribute endValue\n   */\n  get endValue() {\n    return this.values[1] || '100';\n  }\n\n  set endValue(value) {\n    // Snap value to step\n    value = String(this._snapValueToStep(transform.number(value), this.min, this.max, this.step));\n\n    const values = this.values;\n    values[1] = value;\n    this.values = values;\n\n    // in order to keep the reset value in sync, we need to handle the \"endvalue\" attribute of the inner input\n    const input = this._elements.inputs[1];\n    const valueAttribute = this.getAttribute('endvalue');\n    input[valueAttribute ? 'setAttribute' : 'removeAttribute']('value', valueAttribute);\n  }\n\n  /**\n   The current values of the ranged slider.\n\n   @type {Array.<String>}\n   @default [{@link Coral.RangedSlider#startValue},{@link Coral.RangedSlider#endValue}]\n   @emits {change}\n   */\n  get values() {\n    return this._values;\n  }\n\n  set values(values) {\n    this._values = values;\n  }\n\n  /** @private */\n  _getHighestValue() {\n    return Math.max.apply(null, this.values);\n  }\n\n  /** @private */\n  _getLowestValue() {\n    return Math.min.apply(null, this.values);\n  }\n\n  /** @override */\n  _updateValue(handle, val) {\n    const idx = this._elements.handles.indexOf(handle);\n\n    if (idx === 0) {\n      if (val > parseFloat(this.values[1])) {\n        val = this.values[1];\n      }\n      this._elements.rightInput.min = val;\n      this._elements.rightHandle.setAttribute('aria-valuemin', val);\n    } else {\n      if (val < parseFloat(this.values[0])) {\n        val = this.values[0];\n      }\n      this._elements.leftInput.max = val;\n      this._elements.leftHandle.setAttribute('aria-valuemax', val);\n    }\n\n    const resValue = [this.values[0], this.values[1]];\n    resValue[idx] = val;\n\n    const oldValues = this.values;\n    this.values = resValue;\n    const newValues = this.values;\n\n    if (oldValues.join(':') !== newValues.join(':')) {\n      this.trigger('change');\n    }\n  }\n\n  /** @override */\n  _getTemplate() {\n    return range;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#clear}.\n   */\n  clear() {\n    this.startValue = this.min;\n    this.endValue = this.max;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // since the 'value' property is not reflected, form components use it to restore the initial value. When a\n    // component has support for values, this method needs to be overwritten\n    const initialStartValue = this.getAttribute('startvalue') || this.getAttribute('value');\n    const initialEndValue = this.getAttribute('endvalue');\n\n    this.startValue = transform.string(initialStartValue);\n    this.endValue = transform.string(initialEndValue);\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      startvalue: 'startValue',\n      endvalue: 'endValue'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'startvalue',\n      'endvalue'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add('_coral-Slider--range');\n\n    // Set filled attribute by default\n    this.setAttribute('filled', '');\n  }\n});\n\nexport default RangedSlider;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-slider/src/scripts/RangedSlider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1829,
    "kind": "variable",
    "name": "RangedSlider",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/RangedSlider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/RangedSlider.js~RangedSlider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{RangedSlider}",
    "description": "A Ranged Slider",
    "lineNumber": 24,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.RangedSlider"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Ranged Slider"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-rangedslider"
      },
      {
        "tagName": "@extends",
        "tagValue": "{Slider}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-rangedslider></coral-rangedslider>",
      "<caption>JS constructor</caption>\nnew Coral.RangedSlider();"
    ],
    "see": [
      "../examples/#slider"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1830,
    "kind": "file",
    "name": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {Collection} from '../../../coral-collection';\nimport base from '../templates/base';\nimport {transform, validate, events, commons, Keys} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Slider';\nconst CLASSNAME_HANDLE = '_coral-Slider-handle';\nconst CLASSNAME_INPUT = '_coral-Slider-input';\n\n/**\n Enumeration for {@link Slider} orientations.\n\n @typedef {Object} SliderOrientationEnum\n\n @property {String} HORIZONTAL\n Horizontal slider.\n @property {String} VERTICAL\n Not supported. Falls back to HORIZONTAL.\n */\nconst orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical'\n};\n\n/**\n @class Coral.Slider\n @classdesc A Slider component is a form field that can be used to set a number within a range.\n @htmltag coral-slider\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\n\nclass ExtensibleSlider extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      'key:up ._coral-Slider-handle': '_handleKey',\n      'key:right ._coral-Slider-handle': '_handleKey',\n      'key:down ._coral-Slider-handle': '_handleKey',\n      'key:left ._coral-Slider-handle': '_handleKey',\n      'key:pageUp ._coral-Slider-handle': '_handleKey',\n      'key:pageDown ._coral-Slider-handle': '_handleKey',\n      'key:home ._coral-Slider-handle': '_handleKey',\n      'key:end ._coral-Slider-handle': '_handleKey',\n\n      'input': '_onInputChangeHandler',\n\n      'touchstart': '_onMouseDown',\n      'mousedown': '_onMouseDown',\n\n      'capture:focus': '_focus',\n      'capture:blur': '_blur'\n    }));\n\n    // Prepare templates\n    this._elements = {};\n    this._getTemplate().call(this._elements, {commons});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.leftInput;\n\n    // Content zone\n    this._elements.content = this.querySelector('coral-slider-content') || document.createElement('coral-slider-content');\n\n    // Additional shortcuts\n    const handleContainer = this._elements.controls;\n    this._elements.handles = Array.prototype.slice.call(handleContainer.querySelectorAll(`.${CLASSNAME_HANDLE}`));\n    this._elements.inputs = Array.prototype.slice.call(handleContainer.querySelectorAll(`.${CLASSNAME_INPUT}`));\n\n    // Binding\n    this._onInteraction = this._onInteraction.bind(this);\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The slider's content.\n\n   @type {SliderContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-slider-content',\n      insert: function (content) {\n        this._elements.labelContent.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-slider-item'\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Increment value of one step.\n\n   @type {Number}\n   @default 1\n   @htmlattribute step\n   @htmlattributereflected\n   */\n  get step() {\n    return this._getValueOf('step', 1);\n  }\n\n  set step(value) {\n    value = transform.number(value);\n    if (value > 0) {\n      this._step = value;\n      this._reflectAttribute('step', this._step);\n\n      this._elements.inputs.forEach((input) => {\n        input.setAttribute('step', this._step);\n      });\n    }\n  }\n\n  /**\n   The minimum value.\n\n   @type {Number}\n   @default 1\n   @htmlattribute min\n   @htmlattributereflected\n   */\n  get min() {\n    return this._getValueOf('min', 1);\n  }\n\n  set min(value) {\n    this._min = transform.number(value);\n    this._reflectAttribute('min', this._min);\n\n    this._elements.inputs.forEach((input) => {\n      input.setAttribute('min', this._min);\n    });\n  }\n\n  /**\n   The maximum value.\n\n   @type {Number}\n   @default 100\n   @htmlattribute max\n   @htmlattributereflected\n   */\n  get max() {\n    return this._getValueOf('max', 100);\n  }\n\n  set max(value) {\n    this._max = transform.number(value);\n    this._reflectAttribute('max', this._max);\n\n    this._elements.inputs.forEach((input) => {\n      input.setAttribute('max', this._max);\n    });\n  }\n\n  /**\n   @ignore\n\n   Not supported anymore. Use \"showValue\" instead.\n   */\n  get tooltips() {\n    return this.showValue;\n  }\n\n  set tooltips(value) {\n    this.showValue = value;\n  }\n\n  /**\n   Display the slider value.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute showvalue\n   @htmlattributereflected\n   */\n  get showValue() {\n    return this._showValue || false;\n  }\n\n  set showValue(value) {\n    this._showValue = transform.booleanAttr(value);\n    this._reflectAttribute('showvalue', this._showValue);\n\n    this._elements.labelValue.hidden = !this._showValue;\n  }\n\n  /**\n   Orientation of the slider. See {@link SliderOrientationEnum}.\n\n   @type {String}\n   @default SliderOrientationEnum.HORIZONTAL\n   @htmlattribute orientation\n   @htmlattributereflected\n   */\n  get orientation() {\n    return this._orientation || orientation.HORIZONTAL;\n  }\n\n  set orientation(value) {\n    value = transform.string(value).toLowerCase();\n    this._orientation = validate.enumeration(orientation)(value) && value || orientation.HORIZONTAL;\n    this._reflectAttribute('orientation', this._orientation);\n  }\n\n  /**\n   Fill a value or value range using a highlight color.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute filled\n   @htmlattributereflected\n   */\n  get filled() {\n    return this._filled || false;\n  }\n\n  set filled(value) {\n    this._filled = transform.booleanAttr(value);\n    this._reflectAttribute('filled', this._filled);\n\n    this.classList.toggle(`${CLASSNAME}--filled`, this._filled);\n  }\n\n  /**\n   The value returned as a Number. Value is <code>NaN</code> if conversion to Number is not possible.\n\n   @type {Number}\n   @default NaN\n   */\n  get valueAsNumber() {\n    return parseFloat(this.value);\n  }\n\n  set valueAsNumber(value) {\n    this.value = transform.float(value);\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.inputs[0].name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.inputs.forEach((input) => {\n      input.name = this.getAttribute('name');\n    });\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.inputs[0].value;\n  }\n\n  set value(value) {\n    value = transform.number(value);\n\n    // setting the value should always set the first value\n    if (this._elements.handles.length === 1) {\n      const input = this._elements.inputs[0];\n\n      value = this._snapValueToStep(value, this.min, this.max, this.step);\n\n      input.value = value;\n      if (input.value) {\n        input.setAttribute('aria-valuenow', value);\n        input.setAttribute('aria-valuetext', this._getLabel(value));\n      } else {\n        input.removeAttribute('aria-valuenow');\n        input.removeAttribute('aria-valuetext');\n      }\n\n      this._moveHandles();\n\n      // in order to keep the reset value in sync, we need to handle the \"value\" attribute of the inner input\n      const valueAttribute = this.getAttribute('value');\n      input[valueAttribute ? 'setAttribute' : 'removeAttribute']('value', valueAttribute);\n    }\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this._elements.inputs.forEach((input) => {\n      input.disabled = this._disabled;\n    });\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.inputs.forEach((input) => {\n      input.required = this._required;\n    });\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this._elements.inputs.forEach((input) => {\n      input.readOnly = this._readOnly;\n    });\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelledBy}.\n   */\n  get labelledBy() {\n    return super.labelledBy;\n  }\n\n  set labelledBy(value) {\n    super.labelledBy = value;\n\n    if (this._elements.inputs.length > 1) {\n      const input = this._elements.inputs[1];\n      const labelledBy = this.labelledBy;\n\n      input[labelledBy ? 'setAttribute' : 'removeAttribute']('aria-labelledby', labelledBy);\n    }\n  }\n\n  /** @private */\n  get _values() {\n    return this._elements.inputs.map((input) => String(parseInt(input.value, 10)));\n  }\n\n  set _values(values) {\n    if (values && values.length === this._elements.handles.length) {\n      this._elements.inputs.forEach((input, i) => {\n        const value = values[i] = this._snapValueToStep(values[i], this.min, this.max, this.step);\n\n        input.value = value;\n        if (input.value) {\n          input.setAttribute('aria-valuenow', value);\n          input.setAttribute('aria-valuetext', this._getLabel(value));\n        } else {\n          input.removeAttribute('aria-valuenow');\n          input.removeAttribute('aria-valuetext');\n        }\n      });\n\n      this._moveHandles();\n    }\n  }\n\n  /** @private */\n  _getValueOf(name, defaultValue) {\n    if (typeof this[`_${name}`] === 'number') {\n      return this[`_${name}`];\n    } else if (this.hasAttribute(name)) {\n      return parseFloat(this.getAttribute(name));\n    }\n\n    return defaultValue;\n  }\n\n  /**\n   handles any mousedown/touchstart on the whole slider\n   @private\n   */\n  _onMouseDown(event) {\n    if (this.disabled) {\n      return;\n    }\n\n    // do not accept right mouse button clicks\n    if (event instanceof MouseEvent) {\n      if ((event.which || event.button) !== 1) {\n        return;\n      }\n    }\n\n    event.preventDefault();\n\n    this._currentHandle = event.target.closest(`.${CLASSNAME_HANDLE}`);\n\n    // If no handle was touched:\n    // the closest handle needs to jump to the closest valid position\n    if (!this._currentHandle) {\n      const p = this._getPoint(event);\n      const val = this._getValueFromCoord(p.pageX, p.pageY, true);\n\n      this._currentHandle = this._findNearestHandle(p.pageX, p.pageY);\n      this._updateValue(this._currentHandle, val);\n      this._setHandleFocus(this._currentHandle);\n    }\n\n    this._currentHandle.classList.add('is-dragged');\n    document.body.classList.add('u-coral-closedHand');\n\n    this._draggingHandler = this._handleDragging.bind(this);\n    this._mouseUpHandler = this._mouseUp.bind(this);\n\n    events.on('mousemove.Slider', this._draggingHandler);\n    events.on('mouseup.Slider', this._mouseUpHandler);\n\n    events.on('touchmove.Slider', this._draggingHandler);\n    events.on('touchend.Slider', this._mouseUpHandler);\n    events.on('touchcancel.Slider', this._mouseUpHandler);\n\n    this._setHandleFocus(this._currentHandle);\n  }\n\n  /**\n   @private\n   @return {Object} which contains the real coordinates\n   */\n  _getPoint(event) {\n    if (event.changedTouches && event.changedTouches.length > 0) {\n      return event.changedTouches[0];\n    } else if (event.touches && event.touches.length > 0) {\n      return event.touches[0];\n    }\n\n    return event;\n  }\n\n  /**\n   will set the focus either on the handle element\n   or its input if range is supported\n\n   @protected\n   */\n  _setHandleFocus(handle) {\n    handle.querySelector(`.${CLASSNAME_INPUT}`).focus();\n  }\n\n  /**\n   Handles keyboard interaction with the handlers.\n   In case input[type=range] is supported, the focus\n   will be on the input and keyboard handling will happen natively\n\n   @private\n   */\n  _handleKey(event) {\n    event.preventDefault();\n\n    this._focus(event);\n\n    const handle = event.matchedTarget;\n    const idx = this._elements.handles.indexOf(handle);\n    let v = parseInt(this._values[idx], 10);\n\n    // increase\n    if (event.keyCode === Keys.keyToCode('up') ||\n      event.keyCode === Keys.keyToCode('right') ||\n      event.keyCode === Keys.keyToCode('pageUp')) {\n      v += this.step;\n    }\n    // decrease\n    else if (event.keyCode === Keys.keyToCode('down') ||\n      event.keyCode === Keys.keyToCode('left') ||\n      event.keyCode === Keys.keyToCode('pageDown')) {\n      v -= this.step;\n    }\n    // min\n    else if (event.keyCode === Keys.keyToCode('home')) {\n      v = this.min;\n    }\n    // max\n    else if (event.keyCode === Keys.keyToCode('end')) {\n      v = this.max;\n    }\n\n    this._updateValue(handle, v);\n  }\n\n  /**\n   Finds the nearest handle based on X/Y coordinates\n\n   @private\n   */\n  _findNearestHandle(mouseX, mouseY) {\n    let closestDistance = Infinity;\n    let closestHandle;\n\n    function calculateDistance(elem, x, y) {\n      const box = elem.getBoundingClientRect();\n      const top = box.top + window.pageYOffset;\n      const left = box.left + window.pageXOffset;\n\n      return Math.floor(\n        Math.sqrt(Math.pow(x - (left + box.width / 2), 2) + Math.pow(y - (top + box.height / 2), 2))\n      );\n    }\n\n    // Find the nearest handle\n    this._elements.handles.forEach((handle) => {\n      const distance = calculateDistance(handle, mouseX, mouseY);\n\n      if (distance < closestDistance) {\n        closestDistance = distance;\n        closestHandle = handle;\n      }\n    });\n\n    return closestHandle;\n  }\n\n  /**\n   Moves the handles to right position\n   based on the data in this._values\n\n   @private\n   */\n  _moveHandles() {\n    const calculatePercent = (value) => (value - this.min) / (this.max - this.min) * 100;\n    const labelValue = [];\n\n    // Set the handle position as a percentage based on the stored values\n    if (this._elements.handles.length === 1) {\n      const handle = this._elements.handles[0];\n      const percent = calculatePercent(this._values[0]);\n      handle.style.left = `${percent}%`;\n\n      handle.previousElementSibling.style.width = `${percent}%`;\n      handle.nextElementSibling.style.width = `${100 - percent}%`;\n\n      labelValue.push(this._getLabel(this._values[0]));\n    } else {\n      const leftHandle = this._elements.handles[0];\n      const leftPercent = calculatePercent(this._values[0]);\n      leftHandle.style.left = `${leftPercent}%`;\n\n      const rightHandle = this._elements.handles[1];\n      const rightPercent = calculatePercent(this._values[1]);\n      rightHandle.style.left = `${rightPercent}%`;\n\n      leftHandle.previousElementSibling.style.width = `${leftPercent}%`;\n      leftHandle.nextElementSibling.style.left = `${leftPercent}%`;\n\n      const middlePercent = 100 - rightPercent;\n      leftHandle.nextElementSibling.style.right = `${middlePercent}%`;\n      rightHandle.nextElementSibling.style.width = `${middlePercent}%`;\n\n      labelValue.push(this._getLabel(this._values[0]));\n      labelValue.push(this._getLabel(this._values[1]));\n    }\n\n    this._elements.labelValue.textContent = labelValue.length > 1 ? labelValue.join(' - ') : labelValue[0];\n  }\n\n  /**\n   Handles \"onchange\" events from the input.\n   This is only neede in case of IE10 which doesn't handle \"oninput event\".\n   In that case, the _onInputChangeHandler will be called from this handler.\n\n   @private\n   */\n  _onInputChange(event) {\n    if (typeof event.target.oninput === 'undefined') {\n      this._onInputChangeHandler(event);\n    }\n  }\n\n  /**\n   Handles \"oninput\" events from the input.\n   This makes ensures native inputs like\n   - direct keyboard interaction with input[type=range]\n   - accessibility features with input[type=range]\n\n   Note we are not using the \"_onInputChange\" directly because Firefox\n   will trigger the \"change\" event only after the focus has been lost.\n\n   @private\n   */\n  _onInputChangeHandler(event) {\n    // stops the current event\n    event.stopPropagation();\n\n    const handle = event.target.closest(`.${CLASSNAME_HANDLE}`);\n\n    if (event.target === document.activeElement) {\n      this._focus(event);\n    }\n\n    this._updateValue(handle, event.target.value, true);\n  }\n\n  /**\n   Handles \"focusin\" event from  either an input or its handle.\n\n   @private\n   */\n  _focus(event) {\n    // Depending on support for input[type=range],\n    // the event.target could be either the handle or its child input.\n    // Use closest() to locate the actual handle.\n    event.target.closest(`.${CLASSNAME_HANDLE}`).classList.add('is-focused');\n\n    events.on('touchstart.Slider', this._onInteraction);\n    events.on('mousedown.Slider', this._onInteraction);\n  }\n\n  /**\n   Handles the blur\n\n   @private\n   */\n  _onInteraction(event) {\n    if (!this.contains(event.target)) {\n      return;\n    }\n    event.target.blur();\n  }\n\n  /**\n   Handles \"focusout\" event from  either an input or its handle.\n\n   @private\n   */\n  _blur(event) {\n    // Depending on support for input[type=range],\n    // the event.target could be either the handle or its child input.\n    // Use closest() to locate the actual handle.\n    event.target.closest(`.${CLASSNAME_HANDLE}`).classList.remove('is-focused');\n\n    events.off('touchstart.Slider');\n    events.off('mousedown.Slider');\n  }\n\n  /**\n   handles mousemove/touchmove after a succesful start on an handle\n\n   @private\n   */\n  _handleDragging(event) {\n    const p = this._getPoint(event);\n\n    this._updateValue(this._currentHandle, this._getValueFromCoord(p.pageX, p.pageY));\n\n    event.preventDefault();\n  }\n\n  /**\n   updates the value for a handle\n   @param handle\n   @param val\n   @param {Boolean} forceEvent\n   Always triggers the event. If <code>true</code> the change event will be triggered without checking if the value really changed. This is useful if we are called from something like the _onInputChange where new value has already been updated AND we are certain the change event should be triggered without checking.\n   @protected\n   */\n  _updateValue(handle, val, forceEvent) {\n    // this is prepared to work for multiple handles\n    const idx = this._elements.handles.indexOf(handle);\n    const values = this._values;\n\n    values[idx] = val;\n\n    const oldValues = this._values;\n    this._values = values;\n    const newValues = this._values;\n\n    if (forceEvent || oldValues.join(':') !== newValues.join(':')) {\n      this.trigger('change');\n    }\n  }\n\n  /** @private */\n  // eslint-disable-next-line no-unused-vars\n  _getValueFromCoord(posX, posY, restrictBounds) {\n    const boundingClientRect = this.getBoundingClientRect();\n    const elementWidth = boundingClientRect.width;\n    const percent = (posX - boundingClientRect.left) / elementWidth;\n\n    // if the bounds are restricted, as with _handleClick, we shouldn't change the value.\n    if (restrictBounds && (percent < 0 || percent > 1)) {\n      return NaN;\n    }\n\n    const rawValue = this.min + (this.max - this.min) * percent;\n\n    // Snap value to nearest step\n    return this._snapValueToStep(rawValue, this.min, this.max, this.step);\n  }\n\n  /** @private */\n  _snapValueToStep(rawValue, min, max, step) {\n    step = parseFloat(step);\n    const remainder = (rawValue - min) % step;\n    const floatString = step.toString().replace(/^(?:\\d+)(?:\\.(\\d+))?$/g, '$1');\n    const precision = floatString.length;\n    let snappedValue;\n\n    if (Math.abs(remainder) * 2 >= step) {\n      snappedValue = rawValue - Math.abs(remainder) + step;\n    } else {\n      snappedValue = rawValue - remainder;\n    }\n\n    if (snappedValue < min) {\n      snappedValue = min;\n    } else if (snappedValue > max) {\n      snappedValue = min + Math.floor((max - min) / step) * step;\n    }\n\n    // correct floating point behavior by rounding to step precision\n    if (precision > 0) {\n      snappedValue = parseFloat(snappedValue.toFixed(precision));\n    }\n\n    return snappedValue;\n  }\n\n  /**\n   end operation of a dragging flow\n   @private\n   */\n  _mouseUp() {\n    if (this._currentHandle) {\n      this._currentHandle.style.cursor = 'grab';\n      this._currentHandle.classList.remove('is-dragged');\n    }\n    document.body.classList.remove('u-coral-closedHand');\n\n    events.off('mousemove.Slider', this._draggingHandler);\n    events.off('touchmove.Slider', this._draggingHandler);\n    events.off('mouseup.Slider', this._mouseUpHandler);\n    events.off('touchend.Slider', this._mouseUpHandler);\n    events.off('touchcancel.Slider', this._mouseUpHandler);\n\n    this._currentHandle = null;\n    this._draggingHandler = null;\n    this._mouseUpHandler = null;\n  }\n\n  /**\n   Gets the label for a passed value.\n\n   @param value\n   @return {String|Number} the known label from the item or the value itself\n   @protected\n   */\n  _getLabel(value) {\n    const items = this.items.getAll();\n    let item;\n\n    for (let i = 0 ; i < items.length ; i++) {\n      if (transform.number(items[i].getAttribute('value')) === transform.number(value)) {\n        item = items[i];\n        break;\n      }\n    }\n\n    // Use the innerHTML of the item if one was found\n    return item ? item.innerHTML : value;\n  }\n\n  // To be overridden by RangedSlider\n  _getTemplate() {\n    return base;\n  }\n\n  get _contentZones() {\n    return {'coral-slider-content': 'content'};\n  }\n\n  /**\n   Returns {@link Slider} orientation options.\n\n   @return {SliderOrientationEnum}\n   */\n  static get orientation() {\n    return orientation;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      showvalue: 'showValue'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'step',\n      'min',\n      'max',\n      'tooltips',\n      'showvalue',\n      'orientation',\n      'filled'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._min) {\n      this.min = this.min;\n    }\n    if (!this._max) {\n      this.max = this.max;\n    }\n    if (!this._step) {\n      this.step = this.step;\n    }\n    if (!this._orientation) {\n      this.orientation = orientation.HORIZONTAL;\n    }\n\n    // A11y\n    this.setAttribute('role', 'presentation');\n\n    // Support cloneNode\n    const template = this.querySelectorAll('._coral-Slider-labelContainer, ._coral-Slider-controls');\n    for (let i = 0 ; i < template.length ; i++) {\n      template[i].remove();\n    }\n\n    // Render the main template\n    const frag = document.createDocumentFragment();\n    frag.appendChild(this._elements.label);\n    frag.appendChild(this._elements.controls);\n\n    const content = this._elements.content;\n\n    // If no default content zone was provided, move everything there\n    if (!content.parentNode) {\n      // Process remaining elements as necessary\n      while (this.firstChild) {\n        const child = this.firstChild;\n\n        if (child.nodeName === 'CORAL-SLIDER-ITEM') {\n          // Add items to the fragment\n          frag.appendChild(child);\n        } else {\n          // Add anything else to the content\n          content.appendChild(child);\n        }\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(frag);\n\n    // Assign the content zone so the insert function will be called\n    this.content = content;\n\n    // Defaults\n    this._moveHandles();\n  }\n}\n\nconst Slider = Decorator(ExtensibleSlider);\n\nexport {ExtensibleSlider, Slider};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1831,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1832,
    "kind": "variable",
    "name": "CLASSNAME_HANDLE",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~CLASSNAME_HANDLE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1833,
    "kind": "variable",
    "name": "CLASSNAME_INPUT",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~CLASSNAME_INPUT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1834,
    "kind": "typedef",
    "name": "SliderOrientationEnum",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~SliderOrientationEnum",
    "access": "public",
    "description": "Enumeration for {@link Slider} orientations.",
    "lineNumber": 34,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Horizontal slider."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Not supported. Falls back to HORIZONTAL."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "SliderOrientationEnum"
    }
  },
  {
    "__docId__": 1835,
    "kind": "class",
    "name": "ExtensibleSlider",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Slider}",
    "description": "A Slider component is a form field that can be used to set a number within a range.",
    "lineNumber": 48,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Slider"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Slider component is a form field that can be used to set a number within a range."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-slider"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent",
      "BaseFormField"
    ],
    "expressionExtends": "BaseFormField(BaseComponent(HTMLElement))",
    "examples": [
      "<caption>Markup</caption>\n<coral-slider></coral-slider>",
      "<caption>JS constructor</caption>\nnew Coral.Slider();"
    ],
    "see": [
      "../examples/#slider"
    ]
  },
  {
    "__docId__": 1836,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 50,
    "ignore": true
  },
  {
    "__docId__": 1837,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 73,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 1838,
    "kind": "member",
    "name": "_labellableElement",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_labellableElement",
    "access": "private",
    "description": null,
    "lineNumber": 77,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1840,
    "kind": "member",
    "name": "content",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#content",
    "access": "public",
    "description": "The slider's content.\n<ul><li><code>content-zone</code></li></ul>",
    "lineNumber": 100,
    "unknown": [
      {
        "tagName": "@contentzone",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SliderContent"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1842,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#items",
    "access": "public",
    "description": "The Collection Interface that allows interacting with the items that the component contains.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 120,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Collection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 1843,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_items",
    "access": "private",
    "description": null,
    "lineNumber": 123,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1844,
    "kind": "member",
    "name": "step",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#step",
    "access": "public",
    "description": "Increment value of one step.\n<ul><li><code>1</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 139,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "step"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1846,
    "kind": "member",
    "name": "_step",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_step",
    "access": "private",
    "description": null,
    "lineNumber": 146,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1847,
    "kind": "member",
    "name": "min",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#min",
    "access": "public",
    "description": "The minimum value.\n<ul><li><code>1</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 163,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "min"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1849,
    "kind": "member",
    "name": "_min",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_min",
    "access": "private",
    "description": null,
    "lineNumber": 168,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1850,
    "kind": "member",
    "name": "max",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#max",
    "access": "public",
    "description": "The maximum value.\n<ul><li><code>100</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 184,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "100"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "max"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1852,
    "kind": "member",
    "name": "_max",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_max",
    "access": "private",
    "description": null,
    "lineNumber": 189,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1853,
    "kind": "member",
    "name": "tooltips",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#tooltips",
    "access": "public",
    "description": "",
    "lineNumber": 202,
    "ignore": true,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1856,
    "kind": "member",
    "name": "showValue",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#showValue",
    "access": "public",
    "description": "Display the slider value.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 218,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "showvalue"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1858,
    "kind": "member",
    "name": "_showValue",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_showValue",
    "access": "private",
    "description": null,
    "lineNumber": 223,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1859,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#orientation",
    "access": "public",
    "description": "Orientation of the slider. See {@link SliderOrientationEnum}.\n<ul><li><code>SliderOrientationEnum.HORIZONTAL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 237,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "SliderOrientationEnum.HORIZONTAL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "orientation"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1861,
    "kind": "member",
    "name": "_orientation",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_orientation",
    "access": "private",
    "description": null,
    "lineNumber": 243,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1862,
    "kind": "member",
    "name": "filled",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#filled",
    "access": "public",
    "description": "Fill a value or value range using a highlight color.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 255,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "filled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1864,
    "kind": "member",
    "name": "_filled",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_filled",
    "access": "private",
    "description": null,
    "lineNumber": 260,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1865,
    "kind": "member",
    "name": "valueAsNumber",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#valueAsNumber",
    "access": "public",
    "description": "The value returned as a Number. Value is <code>NaN</code> if conversion to Number is not possible.\n<ul><li><code>NaN</code> by default.</li></ul>",
    "lineNumber": 272,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "NaN"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1868,
    "kind": "member",
    "name": "name",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#name",
    "access": "public",
    "description": "Name used to submit the data in a form.\n<ul><li><code>\"\"</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 287,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "name"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1870,
    "kind": "member",
    "name": "value",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#value",
    "access": "public",
    "description": "This field's current value.\n<ul><li><code>\"\"</code> by default.</li></ul>",
    "lineNumber": 305,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "\"\""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "value"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1872,
    "kind": "member",
    "name": "disabled",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#disabled",
    "access": "public",
    "description": "Whether this field is disabled or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 342,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "disabled"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1874,
    "kind": "member",
    "name": "_disabled",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_disabled",
    "access": "private",
    "description": null,
    "lineNumber": 347,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1875,
    "kind": "member",
    "name": "required",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#required",
    "access": "public",
    "description": "Whether this field is required or not.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 364,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "required"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1877,
    "kind": "member",
    "name": "_required",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_required",
    "access": "private",
    "description": null,
    "lineNumber": 369,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1878,
    "kind": "member",
    "name": "readOnly",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#readOnly",
    "access": "public",
    "description": "Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n<ul><li><code>false</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 384,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "readonly"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1880,
    "kind": "member",
    "name": "_readOnly",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_readOnly",
    "access": "private",
    "description": null,
    "lineNumber": 389,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1881,
    "kind": "member",
    "name": "labelledBy",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#labelledBy",
    "access": "public",
    "description": "Inherited from {@link BaseFormField#labelledBy}.",
    "lineNumber": 400,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1883,
    "kind": "member",
    "name": "_values",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_values",
    "access": "private",
    "description": "null",
    "lineNumber": 416,
    "modality": "both",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1885,
    "kind": "method",
    "name": "_getValueOf",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_getValueOf",
    "access": "private",
    "description": null,
    "lineNumber": 440,
    "ignore": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      },
      {
        "name": "defaultValue",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1886,
    "kind": "method",
    "name": "_onMouseDown",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_onMouseDown",
    "access": "private",
    "description": "handles any mousedown/touchstart on the whole slider",
    "lineNumber": 454,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1887,
    "kind": "member",
    "name": "_currentHandle",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_currentHandle",
    "access": "private",
    "description": null,
    "lineNumber": 468,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1889,
    "kind": "member",
    "name": "_draggingHandler",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_draggingHandler",
    "access": "private",
    "description": null,
    "lineNumber": 484,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1890,
    "kind": "member",
    "name": "_mouseUpHandler",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_mouseUpHandler",
    "access": "private",
    "description": null,
    "lineNumber": 485,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1891,
    "kind": "method",
    "name": "_getPoint",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_getPoint",
    "access": "private",
    "description": "",
    "lineNumber": 501,
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "which contains the real coordinates"
    },
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ]
  },
  {
    "__docId__": 1892,
    "kind": "method",
    "name": "_setHandleFocus",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_setHandleFocus",
    "access": "protected",
    "description": "will set the focus either on the handle element\nor its input if range is supported",
    "lineNumber": 517,
    "ignore": true,
    "params": [
      {
        "name": "handle",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1893,
    "kind": "method",
    "name": "_handleKey",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_handleKey",
    "access": "private",
    "description": "Handles keyboard interaction with the handlers.\nIn case input[type=range] is supported, the focus\nwill be on the input and keyboard handling will happen natively",
    "lineNumber": 528,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1894,
    "kind": "method",
    "name": "_findNearestHandle",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_findNearestHandle",
    "access": "private",
    "description": "Finds the nearest handle based on X/Y coordinates",
    "lineNumber": 566,
    "ignore": true,
    "params": [
      {
        "name": "mouseX",
        "types": [
          "*"
        ]
      },
      {
        "name": "mouseY",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1895,
    "kind": "method",
    "name": "_moveHandles",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_moveHandles",
    "access": "private",
    "description": "Moves the handles to right position\nbased on the data in this._values",
    "lineNumber": 599,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1896,
    "kind": "method",
    "name": "_onInputChange",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_onInputChange",
    "access": "private",
    "description": "Handles \"onchange\" events from the input.\nThis is only neede in case of IE10 which doesn't handle \"oninput event\".\nIn that case, the _onInputChangeHandler will be called from this handler.",
    "lineNumber": 643,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1897,
    "kind": "method",
    "name": "_onInputChangeHandler",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_onInputChangeHandler",
    "access": "private",
    "description": "Handles \"oninput\" events from the input.\nThis makes ensures native inputs like\n- direct keyboard interaction with input[type=range]\n- accessibility features with input[type=range]\n\nNote we are not using the \"_onInputChange\" directly because Firefox\nwill trigger the \"change\" event only after the focus has been lost.",
    "lineNumber": 660,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1898,
    "kind": "method",
    "name": "_focus",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_focus",
    "access": "private",
    "description": "Handles \"focusin\" event from  either an input or its handle.",
    "lineNumber": 678,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1899,
    "kind": "method",
    "name": "_onInteraction",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_onInteraction",
    "access": "private",
    "description": "Handles the blur",
    "lineNumber": 693,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1900,
    "kind": "method",
    "name": "_blur",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_blur",
    "access": "private",
    "description": "Handles \"focusout\" event from  either an input or its handle.",
    "lineNumber": 705,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1901,
    "kind": "method",
    "name": "_handleDragging",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_handleDragging",
    "access": "private",
    "description": "handles mousemove/touchmove after a succesful start on an handle",
    "lineNumber": 720,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1902,
    "kind": "method",
    "name": "_updateValue",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_updateValue",
    "access": "protected",
    "description": "updates the value for a handle",
    "lineNumber": 736,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "handle",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "val",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "forceEvent",
        "description": "Always triggers the event. If <code>true</code> the change event will be triggered without checking if the value really changed. This is useful if we are called from something like the _onInputChange where new value has already been updated AND we are certain the change event should be triggered without checking."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 1904,
    "kind": "method",
    "name": "_getValueFromCoord",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_getValueFromCoord",
    "access": "private",
    "description": null,
    "lineNumber": 754,
    "ignore": true,
    "params": [
      {
        "name": "posX",
        "types": [
          "*"
        ]
      },
      {
        "name": "posY",
        "types": [
          "*"
        ]
      },
      {
        "name": "restrictBounds",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1905,
    "kind": "method",
    "name": "_snapValueToStep",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_snapValueToStep",
    "access": "private",
    "description": null,
    "lineNumber": 771,
    "ignore": true,
    "params": [
      {
        "name": "rawValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "min",
        "types": [
          "*"
        ]
      },
      {
        "name": "max",
        "types": [
          "*"
        ]
      },
      {
        "name": "step",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1906,
    "kind": "method",
    "name": "_mouseUp",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_mouseUp",
    "access": "private",
    "description": "end operation of a dragging flow",
    "lineNumber": 802,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1910,
    "kind": "method",
    "name": "_getLabel",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_getLabel",
    "access": "protected",
    "description": "Gets the label for a passed value.",
    "lineNumber": 827,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String",
        "Number"
      ],
      "spread": false,
      "description": "the known label from the item or the value itself"
    },
    "ignore": true
  },
  {
    "__docId__": 1911,
    "kind": "method",
    "name": "_getTemplate",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_getTemplate",
    "access": "private",
    "description": null,
    "lineNumber": 843,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1912,
    "kind": "member",
    "name": "_contentZones",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#_contentZones",
    "access": "private",
    "description": null,
    "lineNumber": 847,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1913,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider.orientation",
    "access": "public",
    "description": "Returns {@link Slider} orientation options.",
    "lineNumber": 856,
    "return": {
      "nullable": null,
      "types": [
        "SliderOrientationEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1914,
    "kind": "member",
    "name": "_attributePropertyMap",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider._attributePropertyMap",
    "access": "private",
    "description": null,
    "lineNumber": 860,
    "undocument": true,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1915,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 867,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1916,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~ExtensibleSlider#render",
    "access": "public",
    "description": null,
    "lineNumber": 880,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1922,
    "kind": "variable",
    "name": "Slider",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/Slider.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/Slider.js~Slider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Slider}",
    "description": null,
    "lineNumber": 942,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1923,
    "kind": "file",
    "name": "coral-spectrum/coral-component-slider/src/scripts/SliderContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Slider.Content\n @classdesc Slider's content component\n @htmltag coral-slider-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-slider-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-slider/src/scripts/SliderContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1924,
    "kind": "function",
    "name": "SliderContent",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/SliderContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/SliderContent.js~SliderContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Slider}",
    "description": "Slider's content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Slider.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Slider's content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-slider-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-slider-content></coral-slider-content>",
      "<caption>JS constructor</caption>\nnew Coral.Slider.Content();"
    ],
    "see": [
      "../examples/#slider"
    ],
    "params": []
  },
  {
    "__docId__": 1925,
    "kind": "file",
    "name": "coral-spectrum/coral-component-slider/src/scripts/SliderItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\nimport {transform} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Slider-item';\n\n/**\n @class Coral.Slider.Item\n @classdesc The Slider item\n @htmltag coral-slider-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SliderItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /**\n   The slider's item value.\n   This should contain a number formatted as a string (e.g.: \"10\") or an empty string.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return this.getAttribute('value');\n  }\n\n  set value(value) {\n    this._reflectAttribute('value', transform.string(value));\n  }\n\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    if (value instanceof HTMLElement) {\n      /** @ignore */\n      this.innerHTML = value.innerHTML;\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default SliderItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-slider/src/scripts/SliderItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1926,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/SliderItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/SliderItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1927,
    "kind": "variable",
    "name": "SliderItem",
    "memberof": "coral-spectrum/coral-component-slider/src/scripts/SliderItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-slider/src/scripts/SliderItem.js~SliderItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Slider}",
    "description": "The Slider item",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Slider.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Slider item"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-slider-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-slider-item></coral-slider-item>",
      "<caption>JS constructor</caption>\nnew Coral.Slider.Item();"
    ],
    "see": [
      "../examples/#slider"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1928,
    "kind": "file",
    "name": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-button';\nimport '../../../coral-component-anchorbutton';\nimport '../../../coral-component-popover';\nimport '../../../coral-component-list';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link SplitButton} variants.\n\n @typedef {Object} SplitButtonVariantEnum\n\n @property {String} DEFAULT\n The default button look and feel.\n @property {String} CTA\n A button that is meant to grab the user's attention.\n @property {String} SECONDARY\n A button that indicates that the button's action is the secondary action.\n */\nconst variant = {\n  DEFAULT: 'default',\n  CTA: 'cta',\n  SECONDARY: 'secondary'\n};\n\nconst CLASSNAME = '_coral-SplitButton';\n\n/**\n @class Coral.SplitButton\n @classdesc A Split Button component composed of an action and a trigger {@link AnchorButton} or {@link Button}.\n These elements should be marked with following attributes:\n - <code>[coral-splitbutton-action]</code> for the main action button.\n - <code>[coral-splitbutton-trigger]</code> for the trigger button.\n\n @htmltag coral-splitbutton\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst SplitButton = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Watch for inner button changes\n    this._observer = new MutationObserver(() => {\n      this._updateLeftVariant();\n      this._updateInnerButtons();\n      this._updateInnerButtonsVariant(this.variant);\n    });\n\n    this._observer.observe(this, {\n      subtree: true,\n      childList: true\n    });\n  }\n\n  /**\n   The button's variant. See {@link SplitButtonVariantEnum}.\n\n   @type {String}\n   @default SplitButtonVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this._updateInnerButtonsVariant(this._variant);\n  }\n\n  _getInnerButtons() {\n    const action = this.querySelector('[coral-splitbutton-action]');\n    const trigger = this.querySelector('[coral-splitbutton-trigger]');\n    return {action, trigger};\n  }\n\n  _updateLeftVariant() {\n    for (let i = 0 ; i < this.children.length ; i++) {\n      const child = this.children[i];\n      if (child.hasAttribute('coral-splitbutton-trigger')) {\n        this.classList.add('_coral-SplitButton--left');\n        return;\n      } else if (child.hasAttribute('coral-splitbutton-action')) {\n        this.classList.remove('_coral-SplitButton--left');\n        return;\n      }\n    }\n  }\n\n  _updateInnerButtonsVariant(variant) {\n    const {action, trigger} = this._getInnerButtons();\n    if (action) {\n      action.setAttribute('variant', variant);\n    }\n    if (trigger) {\n      trigger.setAttribute('variant', variant);\n    }\n  }\n\n  _updateInnerButtons() {\n    const {action, trigger} = this._getInnerButtons();\n    if (action) {\n      action.classList.add('_coral-SplitButton-action');\n    }\n    if (trigger) {\n      trigger.classList.add('_coral-SplitButton-trigger');\n      // a11y assume a popover is targeting the trigger\n      trigger.setAttribute('aria-haspopup', 'true');\n      if (action) {\n        action.id = action.id || commons.getUID();\n        trigger.setAttribute('aria-labelledby', action.id);\n      }\n    }\n  }\n\n  /**\n   Returns {@link SplitButton} variants.\n\n   @return {SplitButtonVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'group');\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Update styles\n    this._updateLeftVariant();\n    this._updateInnerButtons();\n  }\n});\n\nexport default SplitButton;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1929,
    "kind": "typedef",
    "name": "SplitButtonVariantEnum",
    "memberof": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js~SplitButtonVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link SplitButton} variants.",
    "lineNumber": 33,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "The default button look and feel."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CTA",
        "description": "A button that is meant to grab the user's attention."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SECONDARY",
        "description": "A button that indicates that the button's action is the secondary action."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "SplitButtonVariantEnum"
    }
  },
  {
    "__docId__": 1930,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1931,
    "kind": "variable",
    "name": "SplitButton",
    "memberof": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-splitbutton/src/scripts/SplitButton.js~SplitButton",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{SplitButton}",
    "description": "A Split Button component composed of an action and a trigger {@link AnchorButton} or {@link Button}.\nThese elements should be marked with following attributes:\n- <code>[coral-splitbutton-action]</code> for the main action button.\n- <code>[coral-splitbutton-trigger]</code> for the trigger button.",
    "lineNumber": 52,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.SplitButton"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Split Button component composed of an action and a trigger {@link AnchorButton} or {@link Button}.\nThese elements should be marked with following attributes:\n- <code>[coral-splitbutton-action]</code> for the main action button.\n- <code>[coral-splitbutton-trigger]</code> for the trigger button."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-splitbutton"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-splitbutton></coral-splitbutton>",
      "<caption>JS constructor</caption>\nnew Coral.SplitButton();"
    ],
    "see": [
      "../examples/#splitbutton"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1932,
    "kind": "file",
    "name": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Status} variants.\n\n @typedef {Object} StatusVariantEnum\n\n @property {String} NEUTRAL\n A default semantic neutral status.\n @property {String} WARNING\n A notice semantic status.\n @property {String} SUCCESS\n A positive semantic status.\n @property {String} ERROR\n A negative semantic status.\n @property {String} INFO\n An informative semantic status.\n */\nconst variant = {\n  NEUTRAL: 'neutral',\n  ERROR: 'error',\n  WARNING: 'warning',\n  SUCCESS: 'success',\n  INFO: 'info'\n};\n\n/**\n Enumeration for {@link Status} colors.\n\n @typedef {Object} StatusColorEnum\n\n @property {String} DEFAULT\n @property {String} CELERY\n @property {String} YELLOW\n @property {String} FUCHSIA\n @property {String} INDIGO\n @property {String} SEA_FOAM\n @property {String} CHARTREUSE\n @property {String} MAGENTA\n @property {String} PURPLE\n */\nconst color = {\n  DEFAULT: '',\n  CELERY: 'celery',\n  YELLOW: 'yellow',\n  FUCHSIA: 'fuchsia',\n  INDIGO: 'indigo',\n  SEA_FOAM: 'seafoam',\n  CHARTREUSE: 'chartreuse',\n  MAGENTA: 'magenta',\n  PURPLE: 'purple'\n};\n\nconst CLASSNAME = '_coral-StatusLight';\nconst variantMapping = {\n  SUCCESS: 'positive',\n  ERROR: 'negative',\n  WARNING: 'notice'\n};\n\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variantMapping[variantValue] || variant[variantValue]}`);\n}\n\nconst ALL_COLOR_CLASSES = [];\nfor (const colorValue in color) {\n  ALL_COLOR_CLASSES.push(`${CLASSNAME}--${color[colorValue]}`);\n}\n\n/**\n @class Coral.Status\n @classdesc A Status component to describe the condition of another entity. They can be used to convey semantic meaning\n such as statuses and categories.\n\n @htmltag coral-status\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Status = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone element\n      label: this.querySelector('coral-status-label') || document.createElement('coral-status-label')\n    };\n  }\n\n  /**\n   Whether the status is disabled or not.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n  }\n\n  /**\n   The status variant. See {@link StatusVariantEnum}.\n   When a status has a semantic meaning, it should use semantic colors.\n\n   @type {String}\n   @default StatusVariantEnum.NEUTRAL\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.NEUTRAL;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.NEUTRAL;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n    this.classList.add(`${CLASSNAME}--${variantMapping[this._variant.toUpperCase()] || this._variant}`);\n  }\n\n  /**\n   The status color. See {@link StatusColorEnum}.\n   When a status is used to color code categories and labels commonly found in data visualization, they should use\n   colors.\n\n   The ideal usage for colors is when there are 8 or fewer categories or labels being color coded.\n   Use them in the following order to ensure the greatest possible color differences for multiple forms of color\n   blindness:\n   - Indigo\n   - Celery\n   - Magenta\n   - Yellow\n   - Fuchsia\n   - Seafoam\n   - Chartreuse\n   - Purple\n\n   If a color is set, it'll override any semantic variant.\n\n   @type {String}\n   @default StatusColorEnum.DEFAULT\n   @htmlattribute color\n   @htmlattributereflected\n   */\n  get color() {\n    return this._color || color.DEFAULT;\n  }\n\n  set color(value) {\n    value = transform.string(value).toLowerCase();\n    this._color = validate.enumeration(color)(value) && value || color.DEFAULT;\n    this._reflectAttribute('color', this._color);\n\n    this.classList.remove(...ALL_COLOR_CLASSES);\n    if (this._color !== color.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._color}`);\n    }\n  }\n\n  /**\n   The status label element.\n\n   @type {StatusLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-status-label',\n      insert: function (label) {\n        this.appendChild(label);\n      }\n    });\n  }\n\n  get _contentZones() {\n    return {\n      'coral-status-label': 'label'\n    };\n  }\n\n  /**\n   Returns {@link Status} variants.\n\n   @return {StatusVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns {@link Status} colors.\n\n   @return {StatusColorEnum}\n   */\n  static get color() {\n    return color;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'color', 'disabled']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.NEUTRAL;\n    }\n    if (!this._color) {\n      this.color = color.DEFAULT;\n    }\n\n    // Fetch or create the content content zone element\n    const label = this._elements.label;\n\n    // This stops the content zone from being voracious\n    if (!label.parentNode) {\n      // move the contents into the content zone\n      while (this.firstChild) {\n        label.appendChild(this.firstChild);\n      }\n    }\n\n    // Assign the content zone moving it into place\n    this.label = label;\n  }\n});\n\nexport default Status;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-status/src/scripts/Status.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1933,
    "kind": "typedef",
    "name": "StatusVariantEnum",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~StatusVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Status} variants.",
    "lineNumber": 33,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NEUTRAL",
        "description": "A default semantic neutral status."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "A notice semantic status."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "A positive semantic status."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A negative semantic status."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "An informative semantic status."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "StatusVariantEnum"
    }
  },
  {
    "__docId__": 1934,
    "kind": "typedef",
    "name": "StatusColorEnum",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~StatusColorEnum",
    "access": "public",
    "description": "Enumeration for {@link Status} colors.",
    "lineNumber": 56,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CELERY",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "YELLOW",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FUCHSIA",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INDIGO",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SEA_FOAM",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CHARTREUSE",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MAGENTA",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PURPLE",
        "description": ""
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "StatusColorEnum"
    }
  },
  {
    "__docId__": 1935,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 68,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1936,
    "kind": "variable",
    "name": "variantMapping",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~variantMapping",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 69,
    "undocument": true,
    "type": {
      "types": [
        "{\"SUCCESS\": string, \"ERROR\": string, \"WARNING\": string}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1937,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 75,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1938,
    "kind": "variable",
    "name": "ALL_COLOR_CLASSES",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~ALL_COLOR_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 80,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1939,
    "kind": "variable",
    "name": "Status",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/Status.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/Status.js~Status",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Status}",
    "description": "A Status component to describe the condition of another entity. They can be used to convey semantic meaning\nsuch as statuses and categories.",
    "lineNumber": 94,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Status"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Status component to describe the condition of another entity. They can be used to convey semantic meaning\nsuch as statuses and categories."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-status"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-status></coral-status>",
      "<caption>JS constructor</caption>\nnew Coral.Status();"
    ],
    "see": [
      "../examples/#status"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1940,
    "kind": "file",
    "name": "coral-spectrum/coral-component-status/src/scripts/StatusLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Status.Label\n @classdesc The Status Label\n @htmltag coral-status-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-status-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-status/src/scripts/StatusLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1941,
    "kind": "function",
    "name": "StatusLabel",
    "memberof": "coral-spectrum/coral-component-status/src/scripts/StatusLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-status/src/scripts/StatusLabel.js~StatusLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Status}",
    "description": "The Status Label",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Status.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Status Label"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-status-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-status-label></coral-status-label>",
      "<caption>JS constructor</caption>\nnew Coral.Status.Label();"
    ],
    "see": [
      "../examples/#status"
    ],
    "params": []
  },
  {
    "__docId__": 1942,
    "kind": "file",
    "name": "coral-spectrum/coral-component-steplist/src/scripts/Step.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-tooltip';\nimport step from '../templates/step';\nimport {transform, commons} from '../../../coral-utils';\nimport getTarget from './getTarget';\nimport StepList from './StepList';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Steplist-item';\n\n/**\n @class Coral.Step\n @classdesc A Step component\n @htmltag coral-step\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Step = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Fetch or create content zone\n    this._elements = {\n      label: this.querySelector('coral-step-label') || document.createElement('coral-step-label')\n    };\n    step.call(this._elements);\n  }\n\n  /**\n   The label of the step.\n\n   @type {StepLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-step-label',\n      insert: function (label) {\n        label.classList.add('_coral-Steplist-label');\n        this._elements.link.insertBefore(label, this._elements.stepMarkerContainer);\n      }\n    });\n  }\n\n  /**\n   Whether the item is selected. When <code>true</code>, the item will appear as the active element in the\n   StepList. The item must be a child of a StepList before this property is set to <code>true</code>.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.classList.toggle('is-selected', this.selected);\n    this.removeAttribute('aria-selected');\n\n    if (this.selected) {\n      this._elements.link.setAttribute('aria-current', 'step');\n    } else {\n      this._elements.link.removeAttribute('aria-current');\n    }\n\n    const stepList = this.parentElement;\n    let realTarget;\n\n    // in case the Step is selected, we need to communicate it to the panels\n    if (this._selected) {\n      realTarget = getTarget(this.target);\n      // if the target was defined at the Step level, it has precedence over everything\n      if (realTarget) {\n        realTarget.setAttribute('selected', '');\n      }\n      // we use the target defined at the StepList level\n      else if (stepList && stepList.target) {\n        realTarget = getTarget(stepList.target);\n\n        if (realTarget) {\n          // we get the position of this step inside the steplist\n          const currentIndex = stepList.items.getAll().indexOf(this);\n\n          // we select the item with the same index\n          const targetItem = (realTarget.items ? realTarget.items.getAll() : realTarget.children)[currentIndex];\n\n          // we select the item if it exists\n          if (targetItem) {\n            targetItem.setAttribute('selected', '');\n          }\n        }\n      }\n    }\n\n    this.trigger('coral-step:_selectedchanged');\n  }\n\n  /**\n   Whether the item is disabled\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n    this.classList.toggle('is-disabled', this.disabled);\n    const stepList = this.parentElement;\n    if (stepList) {\n      this._syncTabIndex(stepList.interaction === StepList.interaction.ON);\n    }\n  }\n\n  /**\n   Reflects the <code>aria-label</code> attribute to the marker dot for cases where no visible label is provided for the Step.\n   @type {?String}\n   @default ''\n   @htmlattribute labelled\n   @htmlattributereflected\n   @memberof Coral.Step#\n   */\n  get labelled() {\n    return this._labelled || this.getAttribute('labelled') || this._elements.stepMarkerContainer.getAttribute('aria-label') || '';\n  }\n\n  set labelled(value) {\n    this._labelled = transform.string(value);\n    this._reflectAttribute('labelled', value || false);\n    if (this._labelled !== '') {\n      this._elements.stepMarkerContainer.setAttribute('aria-label', this._labelled);\n      this._elements.stepMarkerContainer.removeAttribute('aria-hidden');\n    } else {\n      this._elements.stepMarkerContainer.removeAttribute('aria-label');\n      if (!this.labelledBy) {\n        this._elements.stepMarkerContainer.setAttribute('aria-hidden', 'true');\n      }\n    }\n  }\n\n  /**\n   Reflects the <code>aria-labelledby</code> attribute to the marker dot for cases where no visible label is provided for the Step,\n   and the Step is labelled by an external element.\n   @type {?String}\n   @default ''\n   @htmlattribute labelledby\n   @htmlattributereflected\n   @memberof Coral.Step#\n   */\n  get labelledBy() {\n    return this._labelledBy || this.getAttribute('labelledby') || this._elements.stepMarkerContainer.getAttribute('aria-labelledby') || '';\n  }\n\n  set labelledBy(value) {\n    this._labelledBy = transform.string(value);\n    this._reflectAttribute('labelledby', value || false);\n    if (this._labelledBy !== '') {\n      this._elements.stepMarkerContainer.setAttribute('aria-labelledby', this._labelledBy);\n      this._elements.stepMarkerContainer.removeAttribute('aria-hidden');\n    } else {\n      this._elements.stepMarkerContainer.removeAttribute('aria-labelledby');\n      if (!this.labelled) {\n        this._elements.stepMarkerContainer.setAttribute('aria-hidden', 'true');\n      }\n    }\n  }\n\n  /**\n   Reflects the <code>aria-describedby</code> attribute to the link element.\n   @type {?String}\n   @default ''\n   @htmlattribute describedby\n   @htmlattributereflected\n   @memberof Coral.Step#\n   */\n  get describedBy() {\n    return this._describedBy || this.getAttribute('describedby') || this._elements.link.getAttribute('aria-describedby') || '';\n  }\n\n  set describedBy(value) {\n    this._describedBy = transform.string(value);\n    this._reflectAttribute('describedby', value || false);\n    if (this._describedBy !== '') {\n      this._elements.link.setAttribute('aria-describedby', this._describedBy);\n    } else {\n      this._elements.link.removeAttribute('aria-describedby');\n    }\n  }\n\n  /**\n   The target element that will be selected when this Step is selected. It accepts a CSS selector or a DOM element.\n   If a CSS Selector is provided, the first matching element will be used.\n\n   @type {?HTMLElement|String}\n   @default null\n   @htmlattribute target\n   */\n  get target() {\n    return this._target || null;\n  }\n\n  set target(value) {\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n      const realTarget = getTarget(this._target);\n\n      // we add proper accessibility if available\n      if (realTarget) {\n        // creates a 2 way binding for accessibility\n        this.setAttribute('aria-controls', realTarget.id);\n        realTarget.setAttribute('aria-labelledby', this.id);\n      }\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  _isHybrid() {\n    const label = this.label;\n    const maxWidth = this.label.clientWidth;\n\n    // Required to be able to measure full width\n    label.style.position = 'relative';\n    label.style.whiteSpace = 'inherit';\n    label.style.display = 'inline';\n\n    // Mark it for hybrid mode\n    this._labelIsHidden = label.getBoundingClientRect().width > maxWidth;\n\n    // Restore defaults\n    label.style.position = '';\n    label.style.whiteSpace = '';\n    label.style.display = '';\n  }\n\n  focus() {\n    this._elements.link.focus();\n  }\n\n  blur() {\n    this._elements.link.blur();\n  }\n\n  /** @private */\n  _syncTabIndex(isInteractive) {\n    // the list item itself should never include a tabindex\n    this.removeAttribute('tabindex');\n\n    // when interaction is on, we enable the tabindex so users can tab into the items\n    if (isInteractive) {\n      this._elements.link.setAttribute('role', 'link');\n      if (this.disabled) {\n        this._elements.link.removeAttribute('tabindex');\n        this._elements.link.setAttribute('aria-disabled', true);\n      } else {\n        this._elements.link.removeAttribute('aria-disabled');\n        this._elements.link.setAttribute('tabindex', this.selected ? '0' : '-1');\n      }\n    } else {\n      // when off, removing the tabindex allows the component to never get focus\n      this._elements.link.removeAttribute('tabindex');\n      this._elements.link.removeAttribute('role');\n    }\n  }\n\n  /** @private */\n  _syncSizeAndCurrentIndex(currentStep, totalSteps) {\n    this.setAttribute('aria-setsize', totalSteps);\n    this.setAttribute('aria-posinset', currentStep);\n  }\n\n  get _contentZones() {\n    return {'coral-step-label': 'label'};\n  }\n\n  /** @ignore */\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      labelledby: 'labelledBy',\n      describedby: 'describedBy',\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'target', 'disabled', 'labelled', 'labelledby', 'describedby']);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    const overlay = this._elements.overlay;\n    // Cannot be open by default when rendered\n    overlay.removeAttribute('open');\n    // Restore in DOM\n    if (overlay._parent) {\n      overlay._parent.appendChild(overlay);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Generate a unique ID for the Step panel if one isn't already present\n    // This will be used for accessibility purposes\n    this.setAttribute('id', this.id || commons.getUID());\n\n    // A11y\n    this.setAttribute('role', 'listitem');\n\n    const frag = document.createDocumentFragment();\n\n    // Discard the template-created link, accessibilityLabel, stepMarkerContainer, and line if one is provided by markup\n    this._elements.link = this.querySelector('[handle=\"link\"]') || this._elements.link;\n    this._elements.accessibilityLabel = this.querySelector('[handle=\"accessibilityLabel\"]') || this._elements.accessibilityLabel;\n    this._elements.stepMarkerContainer = this.querySelector('[handle=\"stepMarkerContainer\"]') || this._elements.stepMarkerContainer;\n    this._elements.line = this.querySelector('[handle=\"line\"]') || this._elements.line;\n\n    // Discard the template-created tooltip if one is provided by markup\n    this._elements.overlay = this.querySelector('coral-tooltip') || this._elements.overlay;\n\n    // Render main template\n    frag.appendChild(this._elements.link);\n    this._elements.link.appendChild(this._elements.stepMarkerContainer);\n    this._elements.link.appendChild(this._elements.overlay);\n    frag.appendChild(this._elements.line);\n\n    const templateHandleNames = ['link', 'accessibilityLabel', 'stepMarkerContainer', 'overlay', 'line'];\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      label.remove();\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        label.appendChild(child);\n      } else {\n        this.removeChild(child);\n      }\n    }\n\n    // Link tooltip target\n    this._elements.overlay.target = this._elements.stepMarkerContainer;\n\n    this.appendChild(frag);\n\n    // Assign the content zone so the insert function will be called\n    this.label = label;\n\n    // Measure hybrid potential\n    this._isHybrid();\n\n\n    // Sync the tabIndex value an role depending on whether interaction is on.\n    const stepList = this.parentElement;\n    if (stepList) {\n      this._syncTabIndex(stepList.interaction === StepList.interaction.ON);\n    }\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    const overlay = this._elements.overlay;\n    // In case it was moved out don't forget to remove it\n    if (!this.contains(overlay)) {\n      overlay._parent = overlay._repositioned ? document.body : this;\n      overlay.remove();\n    }\n  }\n});\n\nexport default Step;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-steplist/src/scripts/Step.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1943,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/Step.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/Step.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1944,
    "kind": "variable",
    "name": "Step",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/Step.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/Step.js~Step",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Step}",
    "description": "A Step component",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Step"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Step component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-step"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-step></coral-step>",
      "<caption>JS constructor</caption>\nnew Coral.Step();"
    ],
    "see": [
      "../examples/#steplist"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1945,
    "kind": "file",
    "name": "coral-spectrum/coral-component-steplist/src/scripts/StepLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Step.Label\n @classdesc A Step Label\n @htmltag coral-step-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-step-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-steplist/src/scripts/StepLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1946,
    "kind": "function",
    "name": "StepLabel",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepLabel.js~StepLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Step}",
    "description": "A Step Label",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Step.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Step Label"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-step-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-step-label></coral-step-label>",
      "<caption>JS constructor</caption>\nnew Coral.Step.Label();"
    ],
    "see": [
      "../examples/#steplist"
    ],
    "params": []
  },
  {
    "__docId__": 1947,
    "kind": "file",
    "name": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate, commons, i18n} from '../../../coral-utils';\nimport getTarget from './getTarget';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link StepList} interaction options.\n\n @todo support \"click only past steps\" mode\n\n @typedef {Object} StepListInteractionEnum\n\n @property {String} ON\n Steps can be clicked to visit them.\n @property {String} OFF\n Steps cannot be clicked.\n */\nconst interaction = {\n  ON: 'on',\n  OFF: 'off'\n};\n\n/**\n Enumeration for {@link StepList} sizes.\n\n @typedef {Object} StepListSizeEnum\n\n @property {String} SMALL\n A small-sized StepList.\n @property {String} LARGE\n A large-sized StepList.\n */\nconst size = {\n  SMALL: 'S',\n  LARGE: 'L'\n};\n\n// the StepList's base classname\nconst CLASSNAME = '_coral-Steplist';\n\n/**\n @class Coral.StepList\n @classdesc A StepList component that holds a collection of steps.\n @htmltag coral-steplist\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst StepList = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents({\n      'click > coral-step > [handle=\"link\"]': '_onStepClick',\n\n      'capture:focus > coral-step': '_onStepMouseEnter',\n      'capture:mouseenter > coral-step > [handle=\"link\"]': '_onStepMouseEnter',\n      'capture:blur > coral-step': '_onStepMouseLeave',\n      'capture:mouseleave > coral-step > [handle=\"link\"]': '_onStepMouseLeave',\n\n      'key:enter > coral-step > [handle=\"link\"]': '_onStepKeyboardSelect',\n      'key:space > coral-step > [handle=\"link\"]': '_onStepKeyboardSelect',\n      'key:home > coral-step > [handle=\"link\"]': '_onHomeKey',\n      'key:end > coral-step > [handle=\"link\"]': '_onEndKey',\n      'key:pagedown > coral-step > [handle=\"link\"]': '_selectNextItem',\n      'key:right > coral-step > [handle=\"link\"]': '_selectNextItem',\n      'key:down > coral-step > [handle=\"link\"]': '_selectNextItem',\n      'key:pageup > coral-step > [handle=\"link\"]': '_selectPreviousItem',\n      'key:left > coral-step > [handle=\"link\"]': '_selectPreviousItem',\n      'key:up > coral-step > [handle=\"link\"]': '_selectPreviousItem',\n\n      // private\n      'coral-step:_selectedchanged': '_onItemSelectedChanged'\n    });\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // we do lazy initialization of the collection\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-step',\n        onItemAdded: this._validateSelection,\n        onItemRemoved: this._validateSelection\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Returns the selected step.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /**\n   The target component that will be linked to the StepList. It accepts either a CSS selector or a DOM element. If\n   a CSS Selector is provided, the first matching element will be used. Items will be selected based on the index.\n   If both target and {@link Coral.Step#target} are set, the second will have higher priority.\n\n   @type {?HTMLElement|String}\n   @default null\n   @htmlattribute target\n   */\n  get target() {\n    return this._target || null;\n  }\n\n  set target(value) {\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      // we do this in the sync in case the target was not yet in the DOM\n      window.requestAnimationFrame(() => {\n        const realTarget = getTarget(this._target);\n\n        // we add proper accessibility if available\n        if (realTarget) {\n          const stepItems = this.items.getAll();\n          const panelItems = realTarget.items ? realTarget.items.getAll() : realTarget.children;\n\n          // we need to add a11y to all components, regardless of whether they can be perfectly paired\n          const maxItems = Math.max(stepItems.length, panelItems.length);\n\n          let step;\n          let panel;\n          for (let i = 0 ; i < maxItems ; i++) {\n            step = stepItems[i];\n            panel = panelItems[i];\n\n            // if the step has its own target, we assume the target component will handle its own accessibility.\n            // if the target is an empty string we simply ignore it\n            if (step && step.target && step.target.trim() !== '') {\n              continue;\n            }\n\n            if (panel) {\n              panel.setAttribute('role', 'region');\n            }\n\n            if (step && panel) {\n              // sets the required ids\n              step.id = step.id || commons.getUID();\n              panel.id = panel.id || commons.getUID();\n\n              // creates a 2 way binding for accessibility\n              step.setAttribute('aria-controls', panel.id);\n              panel.setAttribute('aria-labelledby', step.id);\n            } else if (step) {\n              // cleans the aria since there is no matching panel\n              step.removeAttribute('aria-controls');\n            } else {\n              // cleans the aria since there is no matching Step\n              panel.removeAttribute('aria-labelledby');\n            }\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   The size of the StepList. It accepts both lower and upper case sizes. Currently only \"S\" and \"L\" (the default)\n   are available.\n   See {@link StepListSizeEnum}.\n\n   @type {String}\n   @default StepListSizeEnum.LARGE\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.LARGE;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.LARGE;\n    this._reflectAttribute('size', this._size);\n\n    this.classList.toggle(`${CLASSNAME}--small`, this._size === size.SMALL);\n\n    if (!this.items.length) {\n      return;\n    }\n\n    // update aria-label for all children\n    const _syncItemLabelled = () => {\n      const isSmall = this.size === size.SMALL;\n      const steps = this.items.getAll();\n      const stepsCount = steps.length;\n\n      for (let i = 0 ; i < stepsCount ; i++) {\n        const step = steps[i];\n        const label = step._elements.label;\n        const link = step._elements.link;\n        if (!step.labelled && label.textContent.length) {\n          label.classList.toggle('u-coral-screenReaderOnly', isSmall);\n          label.style.display = isSmall ? 'block' : '';\n          link.tabIndex = isSmall ? 0 : -1;\n        }\n      }\n    };\n\n    const lastItem = this.items.last();\n\n    if (typeof lastItem._syncTabIndex === 'function') {\n      _syncItemLabelled();\n    } else {\n      commons.ready(lastItem, _syncItemLabelled);\n    }\n  }\n\n  /**\n   Whether Steps should be interactive or not. When interactive, a Step can be clicked to jump to it.\n   See {@link StepListInteractionEnum}.\n\n   @type {String}\n   @default StepListInteractionEnum.OFF\n   @htmlattribute interaction\n   @htmlattributereflected\n   */\n  get interaction() {\n    return this._interaction || interaction.OFF;\n  }\n\n  set interaction(value) {\n    value = transform.string(value).toLowerCase();\n    this._interaction = validate.enumeration(interaction)(value) && value || interaction.OFF;\n    this._reflectAttribute('interaction', this._interaction);\n\n    const isInteractive = this._interaction === interaction.ON;\n    this.classList.toggle(`${CLASSNAME}--interactive`, isInteractive);\n\n    if (!this.items.length) {\n      return;\n    }\n\n    // update tab index for all children\n    const _syncItemProps = () => {\n      const steps = this.items.getAll();\n      const stepsCount = steps.length;\n\n      for (let i = 0 ; i < stepsCount ; i++) {\n        // update tab index for all children\n        steps[i]._syncTabIndex(isInteractive);\n        //update posin set and total size for all steps\n        steps[i]._syncSizeAndCurrentIndex(i + 1, stepsCount);\n      }\n    };\n\n    const lastItem = this.items.last();\n\n    if (typeof lastItem._syncTabIndex === 'function') {\n      _syncItemProps();\n    } else {\n      commons.ready(lastItem, _syncItemProps);\n    }\n  }\n\n  /** @private */\n  _syncItemTabIndex(item) {\n    item._syncTabIndex(this.interaction === interaction.ON);\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n\n    this._syncItemTabIndex(item);\n    this._validateSelection(item);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    // gets the current selection\n    const selection = this.items._getAllSelected();\n    const selectionCount = selection.length;\n\n    // if no item is currently selected, we need to find a candidate\n    if (selectionCount === 0) {\n      // gets the first candidate for selection\n      const selectable = this.items._getFirstSelectable();\n\n      if (selectable) {\n        selectable.setAttribute('selected', '');\n      }\n    }\n    // more items are selected, so we find a single item and deselect everything else\n    else if (selectionCount > 1) {\n      // By default, the last one stays selected\n      item = item || selection[selection.length - 1];\n\n      for (let i = 0 ; i < selectionCount ; i++) {\n        if (selection[i] !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selection[i].removeAttribute('selected');\n        }\n      }\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n\n    // sets the state-related classes every time the selection changes\n    this._setStateClasses();\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-steplist:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /** @private */\n  _setStateClasses() {\n    let selectedItemIndex = Infinity;\n    this.items.getAll().forEach((item, index) => {\n      // Use attribute instead of property as items might not be initialized\n      if (item.hasAttribute('selected')) {\n        // Mark which one is selected\n        selectedItemIndex = index;\n      }\n\n      // Add/remove classes based on index\n      item.classList.toggle('is-complete', index < selectedItemIndex);\n\n      if (!item._elements) {\n        return;\n      }\n\n      // Set accessibilityState text label\n      let accessibilityLabel = i18n.get('not completed: ');\n\n      if (index < selectedItemIndex) {\n        accessibilityLabel = i18n.get('completed: ');\n      } else if (index === selectedItemIndex) {\n        accessibilityLabel = i18n.get('current: ');\n      }\n\n      item._elements.accessibilityLabel.innerHTML = accessibilityLabel;\n    });\n  }\n\n  /** @private */\n  _onStepKeyboardSelect(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const item = event.matchedTarget.closest('coral-step');\n      this._selectAndFocusItem(item);\n\n      this._trackEvent('click', 'coral-steplist-item', event, item);\n    }\n  }\n\n  /** @private */\n  _onStepClick(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const item = event.matchedTarget.closest('coral-step');\n\n      // Disabled item should not get selected\n      if (item.disabled) {\n        return;\n      }\n\n      this._selectAndFocusItem(item);\n\n      this._trackEvent('click', 'coral-steplist-item', event, item);\n    }\n  }\n\n  /** @private */\n  _onStepMouseEnter() {\n    if (this.size === size.SMALL) {\n      const step = event.target.closest('coral-step');\n\n      // we only show the tooltip if we have a label to show\n      if (step._elements.label.innerHTML.trim() !== '') {\n        step._elements.overlay.content.innerHTML = step._elements.label.innerHTML;\n        step._elements.overlay.open = true;\n      }\n    }\n  }\n\n  /** @private */\n  _onStepMouseLeave(event) {\n    if (this.size === size.SMALL) {\n      const step = event.target.closest('coral-step');\n      step._elements.overlay.open = false;\n    }\n  }\n\n  /** @private */\n  _onHomeKey(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n\n      const item = this.items._getFirstSelectable();\n      this._selectAndFocusItem(item);\n    }\n  }\n\n  /** @private */\n  _onEndKey(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n\n      const item = this.items._getLastSelectable();\n      this._selectAndFocusItem(item);\n    }\n  }\n\n  /** @private */\n  _selectNextItem(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n\n      this.next();\n    }\n  }\n\n  /** @private */\n  _selectPreviousItem(event) {\n    if (this.interaction === interaction.ON) {\n      event.preventDefault();\n\n      this.previous();\n    }\n  }\n\n  /** @private */\n  _selectAndFocusItem(item) {\n    if (item) {\n      item.setAttribute('selected', '');\n      item.focus();\n    }\n  }\n\n  /**\n   Show the next Step.\n\n   @emits {coral-steplist:change}\n   */\n  next() {\n    let item = this.selectedItem;\n    if (item) {\n      item = this.items._getNextSelectable(item);\n      this._selectAndFocusItem(item);\n    }\n  }\n\n  /**\n   Show the previous Step.\n\n   @emits {coral-steplist:change}\n   */\n  previous() {\n    let item = this.selectedItem;\n    if (item) {\n      item = this.items._getPreviousSelectable(item);\n      this._selectAndFocusItem(item);\n    }\n  }\n\n  /**\n   Returns {@link StepList} sizes.\n\n   @return {StepListSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link StepList} interaction options.\n\n   @return {StepListInteractionEnum}\n   */\n  static get interaction() {\n    return interaction;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['target', 'size', 'interaction']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._interaction) {\n      this.interaction = interaction.OFF;\n    }\n    if (!this._size) {\n      this.size = size.LARGE;\n    }\n\n    // A11y\n    this.setAttribute('role', 'list');\n\n    // provide accessibility label for the list\n    if (!this.hasAttribute('aria-label') && !this.hasAttribute('aria-labelledby')) {\n      this.setAttribute('aria-label', i18n.get('Step List'));\n    }\n\n    // the screen reader should not navigate to hidden element\n    // the element is hidden if has only one child\n    if (this.items.length === 1) {\n      this.setAttribute('aria-hidden', 'true');\n      this.interaction = StepList.interaction.OFF;\n    }\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n  }\n\n  /**\n   Triggered when the {@link StepList} selected {@link Step} has changed.\n\n   @typedef {CustomEvent} coral-steplist:change\n\n   @property {Step} detail.selection\n   The newly selected Step.\n   @property {Step} detail.oldSelection\n   The previously selected Step.\n   */\n});\n\nexport default StepList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1948,
    "kind": "typedef",
    "name": "StepListInteractionEnum",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js~StepListInteractionEnum",
    "access": "public",
    "description": "Enumeration for {@link StepList} interaction options.",
    "lineNumber": 31,
    "todo": [
      "support \"click only past steps\" mode"
    ],
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ON",
        "description": "Steps can be clicked to visit them."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "OFF",
        "description": "Steps cannot be clicked."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "StepListInteractionEnum"
    }
  },
  {
    "__docId__": 1949,
    "kind": "typedef",
    "name": "StepListSizeEnum",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js~StepListSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link StepList} sizes.",
    "lineNumber": 46,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small-sized StepList."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "A large-sized StepList."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "StepListSizeEnum"
    }
  },
  {
    "__docId__": 1950,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1951,
    "kind": "variable",
    "name": "StepList",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js~StepList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{StepList}",
    "description": "A StepList component that holds a collection of steps.",
    "lineNumber": 61,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.StepList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A StepList component that holds a collection of steps."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-steplist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-steplist></coral-steplist>",
      "<caption>JS constructor</caption>\nnew Coral.StepList();"
    ],
    "see": [
      "../examples/#steplist"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1952,
    "kind": "typedef",
    "name": "coral-steplist:change",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/StepList.js~coral-steplist:change",
    "access": "public",
    "description": "Triggered when the {@link StepList} selected {@link Step} has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Step"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The newly selected Step."
      },
      {
        "nullable": null,
        "types": [
          "Step"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The previously selected Step."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-steplist:change"
    }
  },
  {
    "__docId__": 1953,
    "kind": "file",
    "name": "coral-spectrum/coral-component-steplist/src/scripts/getTarget.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Gets the target panel of the item.\n\n @private\n @param {HTMLElement|String} [targetValue]\n A specific target value to use.\n @returns {?HTMLElement}\n */\nexport default function getTarget(targetValue) {\n  if (targetValue instanceof Node) {\n    // Just return the provided Node\n    return targetValue;\n  }\n\n  // Dynamically get the target node based on the target\n  let newTarget = null;\n  if (typeof targetValue === 'string' && targetValue.trim() !== '') {\n    newTarget = document.querySelector(targetValue);\n  }\n\n  return newTarget;\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-steplist/src/scripts/getTarget.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1954,
    "kind": "function",
    "name": "getTarget",
    "memberof": "coral-spectrum/coral-component-steplist/src/scripts/getTarget.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-steplist/src/scripts/getTarget.js~getTarget",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getTarget}",
    "description": "Gets the target panel of the item.",
    "lineNumber": 21,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{?HTMLElement}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement",
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "targetValue",
        "description": "A specific target value to use."
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 1955,
    "kind": "file",
    "name": "coral-spectrum/coral-component-switch/src/scripts/Switch.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport base from '../templates/base';\nimport {transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-ToggleSwitch';\n\n/**\n @class Coral.Switch\n @classdesc A Switch component is a toggle form field similar to a Checkbox component.\n @htmltag coral-switch\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Switch = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Make sure the events from the FormField are attached\n    this._delegateEvents(commons.extend(this._events, {\n      'capture:focus ._coral-ToggleSwitch-input': '_onFocus',\n      'capture:blur ._coral-ToggleSwitch-input': '_onBlur'\n    }));\n\n    // Prepare templates\n    this._elements = {\n      // Try to find the label content zone\n      label: this.querySelector('coral-switch-label') || document.createElement('coral-switch-label')\n    };\n    base.call(this._elements, {commons, i18n});\n\n    // Pre-define labellable element\n    this._labellableElement = this._elements.input;\n\n    // Check if the label is empty whenever we get a mutation\n    this._observer = new MutationObserver(this._hideLabelIfEmpty.bind(this));\n\n    // Watch for changes to the label element's children\n    this._observer.observe(this._elements.labelWrapper, {\n      // Catch changes to childList\n      childList: true,\n      // Catch changes to textContent\n      characterData: true,\n      // Monitor any child node\n      subtree: true\n    });\n  }\n\n  /**\n   Whether the switch is on or off.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute checked\n   @htmlattributereflected\n   @emits {change}\n   */\n  get checked() {\n    return this._checked || false;\n  }\n\n  set checked(value) {\n    this._checked = transform.booleanAttr(value);\n    this._reflectAttribute('checked', this._checked);\n\n    this._elements.input.checked = this._checked;\n  }\n\n  /**\n   The switch's label element.\n\n   @type {SwitchLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-switch-label',\n      insert: function (label) {\n        this._elements.labelWrapper.appendChild(label);\n      }\n    });\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._elements.input.name;\n  }\n\n  set name(value) {\n    this._reflectAttribute('name', value);\n\n    this._elements.input.name = value;\n  }\n\n  /**\n   The value that will be submitted when the checkbox is checked. Changing this value will not trigger an event.\n\n   @type {String}\n   @default \"on\"\n   @htmlattribute value\n   */\n  get value() {\n    return this._elements.input.value || 'on';\n  }\n\n  set value(value) {\n    this._elements.input.value = value;\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n    this.classList.toggle('is-disabled', this._disabled);\n    this._elements.input.disabled = this._disabled;\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n\n    this._elements.input.required = this._required;\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this.classList.toggle('is-readOnly', this._readOnly);\n    this._elements.input.tabIndex = this._readOnly ? -1 : 0;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#labelled}.\n   */\n  get labelled() {\n    return super.labelled;\n  }\n\n  set labelled(value) {\n    super.labelled = value;\n\n    this._hideLabelIfEmpty();\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property needs to be set in this component.\n\n   @protected\n   */\n  get _componentTargetProperty() {\n    return 'checked';\n  }\n\n  /*\n   Indicates to the formField that the 'checked' property has to be extracted from the event.\n\n   @protected\n   */\n  get _eventTargetProperty() {\n    return 'checked';\n  }\n\n  /**\n   Hide the label if it's empty.\n\n   @ignore\n   */\n  _hideLabelIfEmpty() {\n    const label = this._elements.label;\n\n    // If it's empty and has no non-textnode children, hide the label\n    const hiddenValue = !(label.children.length === 0 && label.textContent.replace(/\\s*/g, '') === '');\n\n    // Toggle the screen reader text\n    this._elements.labelWrapper.style.margin = !hiddenValue ? '0' : '';\n    this._elements.screenReaderOnly.hidden = hiddenValue || this.labelled;\n  }\n\n  _onFocus() {\n    this._elements.input.classList.add('focus-ring');\n  }\n\n  _onBlur() {\n    this._elements.input.classList.remove('focus-ring');\n  }\n\n  get _contentZones() {\n    return {'coral-switch-label': 'label'};\n  }\n\n  /**\n   Inherited from {@link BaseFormField#clear}.\n   */\n  clear() {\n    this.checked = false;\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    this.checked = this._initialCheckedState;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['checked']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    const templateHandleNames = ['input', 'switch', 'labelWrapper'];\n\n    // Render the template\n    frag.appendChild(this._elements.input);\n    frag.appendChild(this._elements.switch);\n    frag.appendChild(this._elements.labelWrapper);\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label && label.parentNode) {\n      label.parentNode.removeChild(label);\n    }\n\n    // Clean up\n    while (this.firstChild) {\n      const child = this.firstChild;\n      // Only works if all root template elements have a handle attribute\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the content\n        label.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Append the fragment to the component\n    this.appendChild(frag);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n\n    // Cache the initial checked state of the switch (in order to implement reset)\n    this._initialCheckedState = this.checked;\n\n    // Check if we need to hide the label\n    // We must do this because IE does not catch mutations when nodes are not in the DOM\n    this._hideLabelIfEmpty();\n  }\n});\n\nexport default Switch;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-switch/src/scripts/Switch.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1956,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-switch/src/scripts/Switch.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-switch/src/scripts/Switch.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1957,
    "kind": "variable",
    "name": "Switch",
    "memberof": "coral-spectrum/coral-component-switch/src/scripts/Switch.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-switch/src/scripts/Switch.js~Switch",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Switch}",
    "description": "A Switch component is a toggle form field similar to a Checkbox component.",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Switch"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Switch component is a toggle form field similar to a Checkbox component."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-switch"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-switch></coral-switch>",
      "<caption>JS constructor</caption>\nnew Coral.Switch();"
    ],
    "see": [
      "../examples/#switch"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1958,
    "kind": "file",
    "name": "coral-spectrum/coral-component-switch/src/scripts/SwitchLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Switch.Label\n @classdesc The Switch label\n @htmltag coral-switch-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-switch-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-switch/src/scripts/SwitchLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1959,
    "kind": "function",
    "name": "SwitchLabel",
    "memberof": "coral-spectrum/coral-component-switch/src/scripts/SwitchLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-switch/src/scripts/SwitchLabel.js~SwitchLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Switch}",
    "description": "The Switch label",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Switch.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Switch label"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-switch-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-switch-label></coral-switch-label>",
      "<caption>JS constructor</caption>\nnew Coral.Switch.Label();"
    ],
    "see": [
      "../examples/#switch"
    ],
    "params": []
  },
  {
    "__docId__": 1960,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {divider} from './TableUtil';\nimport {transform, validate} from '../../../coral-utils';\n\n// Builds a string containing all possible divider classnames. This will be used to remove classnames when the\n// divider changes\nconst ALL_DIVIDER_CLASSES = [];\nfor (const dividerValue in divider) {\n  ALL_DIVIDER_CLASSES.push(`_coral-Table-divider--${divider[dividerValue]}`);\n}\n\n/**\n @base BaseTableSection\n @classdesc The base element for table sections\n */\nclass BaseTableSection extends superClass {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._tagName = this.getAttribute('is').toLowerCase();\n  }\n\n  /**\n   The table section divider. See {@link TableSectionDividerEnum}.\n\n   @type {String}\n   @default TableSectionDividerEnum.ROW\n   @htmlattributereflected\n   @htmlattribute divider\n   */\n  get divider() {\n    return this._divider || divider.ROW;\n  }\n\n  set divider(value) {\n    value = transform.string(value).toLowerCase();\n    this._divider = validate.enumeration(divider)(value) && value || divider.ROW;\n    this._reflectAttribute('divider', this._divider);\n\n    this.classList.remove(...ALL_DIVIDER_CLASSES);\n    this.classList.add(`_coral-Table-divider--${this.divider}`);\n  }\n\n  _toggleObserver(enable) {\n    this._observer = this._observer || new MutationObserver(this._handleMutations.bind(this));\n\n    if (enable) {\n      // Initialize content MO\n      this._observer.observe(this, {\n        childList: true,\n        subtree: true\n      });\n    } else {\n      this._observer.disconnect();\n    }\n  }\n\n  _handleMutations(mutations) {\n    mutations.forEach((mutation) => {\n      this.trigger(`${this._tagName}:_contentchanged`, {\n        addedNodes: mutation.addedNodes,\n        removedNodes: mutation.removedNodes\n      });\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['divider', '_observe']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_observe') {\n      this._toggleObserver(value !== 'off');\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // Default reflected attributes\n    if (!this._divider) {\n      this.divider = divider.ROW;\n    }\n  }\n};\n\nexport default BaseTableSection;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1961,
    "kind": "variable",
    "name": "ALL_DIVIDER_CLASSES",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~ALL_DIVIDER_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1962,
    "kind": "class",
    "name": "BaseTableSection",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "",
    "description": "The base element for table sections",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@base",
        "tagValue": "BaseTableSection"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The base element for table sections"
      }
    ],
    "interface": false,
    "extends": [
      "superClass"
    ]
  },
  {
    "__docId__": 1963,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 29,
    "ignore": true
  },
  {
    "__docId__": 1964,
    "kind": "member",
    "name": "_tagName",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#_tagName",
    "access": "private",
    "description": null,
    "lineNumber": 32,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1965,
    "kind": "member",
    "name": "divider",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#divider",
    "access": "public",
    "description": "The table section divider. See {@link TableSectionDividerEnum}.\n<ul><li><code>TableSectionDividerEnum.ROW</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 43,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "TableSectionDividerEnum.ROW"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "divider"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 1967,
    "kind": "member",
    "name": "_divider",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#_divider",
    "access": "private",
    "description": null,
    "lineNumber": 49,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1968,
    "kind": "method",
    "name": "_toggleObserver",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#_toggleObserver",
    "access": "private",
    "description": null,
    "lineNumber": 56,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "enable",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1969,
    "kind": "member",
    "name": "_observer",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#_observer",
    "access": "private",
    "description": null,
    "lineNumber": 57,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1970,
    "kind": "method",
    "name": "_handleMutations",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#_handleMutations",
    "access": "private",
    "description": null,
    "lineNumber": 70,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "mutations",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1971,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 80,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1972,
    "kind": "method",
    "name": "attributeChangedCallback",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#attributeChangedCallback",
    "access": "public",
    "description": null,
    "lineNumber": 85,
    "ignore": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      },
      {
        "name": "oldValue",
        "types": [
          "*"
        ]
      },
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 1973,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-table/src/scripts/BaseTableSection.js~BaseTableSection#render",
    "access": "public",
    "description": null,
    "lineNumber": 94,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 1975,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {DragAction} from '../../../coral-dragaction';\nimport TableColumn from './TableColumn';\nimport TableCell from './TableCell';\nimport TableRow from './TableRow';\nimport TableHead from './TableHead';\nimport TableBody from './TableBody';\nimport TableFoot from './TableFoot';\nimport '../../../coral-component-button';\nimport {Checkbox} from '../../../coral-component-checkbox';\nimport base from '../templates/base';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {Decorator} from '../../../coral-decorator';\nimport {\n  isTableHeaderCell,\n  isTableCell,\n  isTableRow,\n  isTableBody,\n  getCellByIndex,\n  getColumns,\n  getCells,\n  getContentCells,\n  getHeaderCells,\n  getRows,\n  getSiblingsOf,\n  getIndexOf,\n  divider\n} from './TableUtil';\nimport {events, transform, validate, commons, i18n, Keys} from '../../../coral-utils';\n\nconst CLASSNAME = '_coral-Table-wrapper';\n\n/**\n Enumeration for {@link Table} variants\n\n @typedef {Object} TableVariantEnum\n\n @property {String} DEFAULT\n A default table.\n @property {String} QUIET\n A quiet table with transparent borders and background.\n @property {String} LIST\n Not supported. Falls back to DEFAULT.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet',\n  LIST: 'list'\n};\n\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\nconst IS_DISABLED = 'is-disabled';\nconst IS_SORTED = 'is-sorted';\nconst IS_UNSELECTABLE = 'is-unselectable';\nconst IS_FIRST_ITEM_DRAGGED = 'is-draggedFirstItem';\nconst IS_LAST_ITEM_DRAGGED = 'is-draggedLastItem';\nconst IS_DRAGGING_CLASS = 'is-dragging';\nconst IS_BEFORE_CLASS = 'is-before';\nconst IS_AFTER_CLASS = 'is-after';\nconst IS_LAYOUTING = 'is-layouting';\nconst IS_READY = 'is-ready';\nconst KEY_SPACE = Keys.keyToCode('space');\n\n/**\n @class Coral.Table\n @classdesc A Table component is a container component to display and manipulate data in two dimensions.\n To define table actions on specific elements, handles can be used.\n A handle is given a special attribute :\n - <code>[coral-table-select]</code>. Select/unselect all table items.\n - <code>[coral-table-rowselect]</code>. Select/unselect the table item.\n - <code>[coral-table-roworder]</code>. Drag to order the table item.\n - <code>[coral-table-rowlock]</code>. Lock/unlock the table item.\n @htmltag coral-table\n @htmlbasetag table\n @extends {HTMLTableElement}\n @extends {BaseComponent}\n */\nconst Table = Decorator(class extends BaseComponent(HTMLTableElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      head: this.querySelector('thead[is=\"coral-table-head\"]') || new TableHead(),\n      body: this.querySelector('tbody[is=\"coral-table-body\"]') || new TableBody(),\n      foot: this.querySelector('tfoot[is=\"coral-table-foot\"]') || new TableFoot(),\n      columns: this.querySelector('colgroup') || document.createElement('colgroup')\n    };\n    base.call(this._elements, {commons});\n\n    // Events\n    this._delegateEvents({\n      // Table specific\n      'global:coral-commons:_webfontactive': '_resetLayout',\n      'change [coral-table-select]': '_onSelectAll',\n      'capture:scroll [handle=\"container\"]': '_onScroll',\n\n      // Head specific\n      'click thead[is=\"coral-table-head\"] th[is=\"coral-table-headercell\"]': '_onHeaderCellSort',\n      'coral-dragaction:dragstart thead[is=\"coral-table-head\"] th[is=\"coral-table-headercell\"]': '_onHeaderCellDragStart',\n      'coral-dragaction:drag thead[is=\"coral-table-head\"] tr[is=\"coral-table-row\"] > th[is=\"coral-table-headercell\"]': '_onHeaderCellDrag',\n      'coral-dragaction:dragend thead[is=\"coral-table-head\"] tr[is=\"coral-table-row\"] > th[is=\"coral-table-headercell\"]': '_onHeaderCellDragEnd',\n      // a11y\n      'key:enter th[is=\"coral-table-headercell\"]': '_onHeaderCellSort',\n      'key:enter th[is=\"coral-table-headercell\"] coral-table-headercell-content': '_onHeaderCellSort',\n      'key:space th[is=\"coral-table-headercell\"]': '_onHeaderCellSort',\n      'key:space th[is=\"coral-table-headercell\"] coral-table-headercell-content': '_onHeaderCellSort',\n\n      // Body specific\n      'click tbody[is=\"coral-table-body\"] [coral-table-rowlock]': '_onRowLock',\n      'click tbody[is=\"coral-table-body\"] [coral-table-rowselect]': '_onRowSelect',\n      'click tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"][selectable] [coral-table-cellselect]': '_onCellSelect',\n      'capture:mousedown tbody[is=\"coral-table-body\"] [coral-table-roworder]:not([disabled])': '_onRowOrder',\n      'capture:touchstart tbody[is=\"coral-table-body\"] [coral-table-roworder]:not([disabled])': '_onRowOrder',\n      'coral-dragaction:dragstart tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragStart',\n      'coral-dragaction:drag tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDrag',\n      'coral-dragaction:dragover tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragOver',\n      'coral-dragaction:dragend tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragEnd',\n      // a11y dnd\n      'key:space tbody[is=\"coral-table-body\"] [coral-table-roworder]:not([disabled])': '_onKeyboardDrag',\n      'click tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"] [coral-table-roworder]:not([disabled])': '_onDragHandleClick',\n      'coral-dragaction:dragonkeyspace tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragOnKeySpace',\n      'coral-dragaction:dragoveronkeyarrowdown tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragOverOnKeyArrowDown',\n      'coral-dragaction:dragoveronkeyarrowup tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragOverOnKeyArrowUp',\n      'coral-dragaction:dragendonkey tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowDragOverOnKeyEnter',\n      // a11y\n      'mousedown tbody[is=\"coral-table-body\"] [coral-table-rowselect]': '_onRowDown',\n      'key:enter tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowSelect',\n      'key:space tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onRowSelect',\n      'key:pageup tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusPreviousItem',\n      'key:pagedown tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusNextItem',\n      'key:left tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusPreviousItem',\n      'key:right tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusNextItem',\n      'key:up tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusPreviousItem',\n      'key:down tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusNextItem',\n      'key:home tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusFirstItem',\n      'key:end tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onFocusLastItem',\n      'key:shift+pageup tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectPreviousItem',\n      'key:shift+pagedown tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectNextItem',\n      'key:shift+left tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectPreviousItem',\n      'key:shift+right tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectNextItem',\n      'key:shift+up tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectPreviousItem',\n      'key:shift+down tbody[is=\"coral-table-body\"] tr[is=\"coral-table-row\"]': '_onSelectNextItem',\n\n      // Private\n      'coral-table-row:_multiplechanged': '_onRowMultipleChanged',\n      'coral-table-row:_beforeselectedchanged': '_onBeforeRowSelectionChanged',\n      'coral-table-row:_selectedchanged': '_onRowSelectionChanged',\n      'coral-table-row:_lockedchanged': '_onRowLockedChanged',\n      'coral-table-row:_change': '_onRowChange',\n      'coral-table-row:_contentchanged': '_onRowContentChanged',\n      'coral-table-headercell:_contentchanged': '_resetLayout',\n      'coral-table-head:_contentchanged': '_onHeadContentChanged',\n      'coral-table-body:_contentchanged': '_onBodyContentChanged',\n      'coral-table-body:_empty': '_onBodyEmpty',\n      'coral-table-column:_alignmentchanged': '_onAlignmentChanged',\n      'coral-table-column:_fixedwidthchanged': '_onFixedWidthChanged',\n      'coral-table-column:_orderablechanged': '_onColumnOrderableChanged',\n      'coral-table-column:_sortablechanged': '_onColumnSortableChanged',\n      'coral-table-column:_sortabledirectionchanged': '_onColumnSortableDirectionChanged',\n      'coral-table-column:_hiddenchanged': '_onColumnHiddenChanged',\n      'coral-table-column:_beforecolumnsort': '_onBeforeColumnSort',\n      'coral-table-column:_sort': '_onColumnSort',\n      'coral-table-head:_stickychanged': '_onHeadStickyChanged'\n    });\n\n    // Required for coral-table:change event\n    this._oldSelection = [];\n    // References selected items in their selection order and is only used for keyboard selection\n    this._lastSelectedItems = {\n      items: [],\n      direction: null\n    };\n\n    // Don't sort by default\n    this._allowSorting = false;\n\n    // Debounce timer\n    this._timeout = null;\n    // Debounce wait in milliseconds\n    this._wait = 50;\n\n    // Used by resizing detector\n    this._resetLayout = this._resetLayout.bind(this);\n    // Init observer\n    this._toggleObserver(true);\n  }\n\n  /**\n   The head of the table.\n\n   @type {TableHead}\n   @contentzone\n   */\n  get head() {\n    return this._getContentZone(this._elements.head);\n  }\n\n  set head(value) {\n    this._setContentZone('head', value, {\n      handle: 'head',\n      tagName: 'thead',\n      insert: function (head) {\n        // Using the native table API allows to position the head element at the correct position.\n        this._elements.table.tHead = head;\n\n        // To init the head observer\n        head.setAttribute('_observe', 'on');\n      }\n    });\n  }\n\n  /**\n   The body of the table. Multiple bodies are not supported.\n\n   @type {TableBody}\n   @contentzone\n   */\n  get body() {\n    return this._getContentZone(this._elements.body);\n  }\n\n  set body(value) {\n    this._setContentZone('body', value, {\n      handle: 'body',\n      tagName: 'tbody',\n      insert: function (body) {\n        this._elements.table.appendChild(body);\n        this.items._container = body;\n\n        // To init the body observer\n        body.setAttribute('_observe', 'on');\n      }\n    });\n  }\n\n  /**\n   The foot of the table.\n\n   @type {TableFoot}\n   @contentzone\n   */\n  get foot() {\n    return this._getContentZone(this._elements.foot);\n  }\n\n  set foot(value) {\n    this._setContentZone('foot', value, {\n      handle: 'foot',\n      tagName: 'tfoot',\n      insert: function (foot) {\n        // Using the native table API allows to position the foot element at the correct position.\n        this._elements.table.tFoot = foot;\n      }\n    });\n  }\n\n  /**\n   The columns of the table.\n\n   @type {TableColumn}\n   @contentzone\n   */\n  get columns() {\n    return this._getContentZone(this._elements.columns);\n  }\n\n  set columns(value) {\n    this._setContentZone('columns', value, {\n      handle: 'columns',\n      tagName: 'colgroup',\n      insert: function (content) {\n        this._elements.table.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The table's variant. See {@link TableVariantEnum}.\n\n   @type {String}\n   @default TableVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n  }\n\n  /**\n   Whether the items are selectable.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selectable\n   @htmlattributereflected\n   */\n  get selectable() {\n    return this._selectable || false;\n  }\n\n  set selectable(value) {\n    this._selectable = transform.booleanAttr(value);\n    this._reflectAttribute('selectable', this._selectable);\n\n    const rows = getRows([this.body]);\n\n    if (this._selectable) {\n      rows.forEach((row) => {\n        row.setAttribute('_selectable', '');\n      });\n    } else {\n      // Clear selection\n      rows.forEach((row) => {\n        row.removeAttribute('_selectable');\n      });\n\n      this.trigger('coral-table:change', {\n        selection: [],\n        oldSelection: this._oldSelection\n      });\n\n      // Sync used collection\n      this._oldSelection = [];\n      this._lastSelectedItems.items = [];\n    }\n\n    // a11y\n    this._toggleFocusable();\n  }\n\n  /**\n   Whether the table is orderable. If the table is sorted, ordering handles are hidden.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute orderable\n   @htmlattributereflected\n   */\n  get orderable() {\n    return this._orderable || false;\n  }\n\n  set orderable(value) {\n    this._orderable = transform.booleanAttr(value);\n    this._reflectAttribute('orderable', this._orderable);\n\n    getRows([this.body]).forEach((row) => {\n      row[this._orderable ? 'setAttribute' : 'removeAttribute']('_orderable', '');\n    });\n\n    // a11y\n    this._toggleFocusable();\n  }\n\n  /**\n   Whether multiple items can be selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this._elements.table.setAttribute('aria-multiselectable', this._multiple);\n\n    // Deselect all except last\n    if (!this.multiple) {\n      const selection = this.selectedItems;\n\n      if (selection.length > 1) {\n        selection.forEach((row, i) => {\n          // Don't trigger too many events\n          row.set('selected', i === selection.length - 1, true);\n        });\n\n        // Synchronise the table select handle\n        const newSelection = this.selectedItems;\n\n        if (newSelection.length) {\n          this._setSelectAllHandleState('indeterminate');\n        } else {\n          this._setSelectAllHandleState('unchecked');\n        }\n\n        this.trigger('coral-table:change', {\n          selection: newSelection,\n          oldSelection: selection\n        });\n\n        // Sync used collection\n        this._oldSelection = newSelection;\n        this._lastSelectedItems.items = newSelection;\n      }\n    }\n  }\n\n  /**\n   Whether the table rows can be locked/unlocked. If rows are locked, they float to the top of the table and aren't\n   affected by column sorting.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute lockable\n   @htmlattributereflected\n   */\n  get lockable() {\n    return this._lockable || false;\n  }\n\n  set lockable(value) {\n    this._lockable = transform.booleanAttr(value);\n    this._reflectAttribute('lockable', this._lockable);\n\n    getRows([this.body]).forEach((row) => {\n      row[this._lockable ? 'setAttribute' : 'removeAttribute']('_lockable', '');\n    });\n\n    // a11y\n    this._toggleFocusable();\n  }\n\n  /**\n   Specifies <code>aria-labelledby</code> value.\n\n   @type {?String}\n   @default null\n   @htmlattribute labelledby\n   */\n  get labelledBy() {\n    return this._elements.table.getAttribute('aria-labelledby');\n  }\n\n  set labelledBy(value) {\n    value = transform.string(value);\n\n    this._elements.table[value ? 'setAttribute' : 'removeAttribute']('aria-labelledby', value);\n  }\n\n  /**\n   Specifies <code>aria-label</code> value.\n\n   @type {String}\n   @default null\n   @htmlattribute labelled\n   */\n  get labelled() {\n    return this._elements.table.getAttribute('aria-label');\n  }\n\n  set labelled(value) {\n    value = transform.string(value);\n\n    this._elements.table[value ? 'setAttribute' : 'removeAttribute']('aria-label', value);\n  }\n\n  /**\n   Returns an Array containing the selected items.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Returns the first selected item of the table. The value <code>null</code> is returned if no element is\n   selected.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected();\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        container: this.body,\n        itemBaseTagName: 'tr',\n        itemTagName: 'coral-table-row'\n      });\n    }\n\n    return this._items;\n  }\n\n  /** @private */\n  _onSelectAll(event) {\n    if (this.selectable) {\n      let rows = this._getSelectableItems();\n\n      if (rows.length) {\n        if (this.multiple) {\n          const selected = event.target.checked;\n\n          rows.forEach((row) => {\n            // Don't trigger too many events\n            row.set('selected', selected, true);\n          });\n\n          rows = selected ? rows : [];\n\n          // Synchronise the table select handle\n          this._setSelectAllHandleState(selected ? 'checked' : 'unchecked');\n\n          this.trigger('coral-table:change', {\n            selection: rows,\n            oldSelection: this._oldSelection\n          });\n\n          // Sync used collection\n          this._oldSelection = rows;\n          this._lastSelectedItems.items = rows;\n        } else {\n          // Only select last item\n          const lastItem = rows[rows.length - 1];\n          lastItem.selected = !lastItem.selected;\n        }\n      }\n    }\n  }\n\n  _triggerChangeEvent() {\n    if (!this._preventTriggeringEvents) {\n      const selectedItems = this.selectedItems;\n      this.trigger('coral-table:change', {\n        oldSelection: this._oldSelection,\n        selection: selectedItems\n      });\n\n      this._oldSelection = selectedItems;\n    }\n  }\n\n  /** @private */\n  _onRowOrder(event) {\n    if (events.isVirtualEvent(event)) {\n      return;\n    }\n\n    const table = this;\n    const row = event.target.closest('tr[is=\"coral-table-row\"]');\n\n    if (row && table.orderable) {\n      if (row.dragAction && row.dragAction.handle) {\n        this._unwrapDragHandle(row.dragAction.handle);\n      }\n\n      const head = table.head;\n      const body = table.body;\n      const sticky = head && head.sticky;\n      const style = row.getAttribute('style');\n      const index = getIndexOf(row);\n      const oldBefore = row.nextElementSibling;\n      const dragAction = new DragAction(row);\n      const items = getRows([body]);\n      const tableBoundingClientRect = table.getBoundingClientRect();\n      const rowBoundingClientRect = row.getBoundingClientRect();\n\n      if (row === items[0]) {\n        table.classList.add(IS_FIRST_ITEM_DRAGGED);\n      } else if (row === items[items.length - 1]) {\n        table.classList.add(IS_LAST_ITEM_DRAGGED);\n      }\n\n      dragAction.axis = 'vertical';\n      // Handle the scroll in table\n      dragAction.scroll = false;\n      // Specify selection handle directly on the row if none found\n      dragAction.handle = row.querySelector('[coral-table-roworder]');\n\n      // The row placeholder indicating where the dragged element will be dropped\n      const placeholder = row.cloneNode(true);\n      placeholder.classList.add('_coral-Table-row--placeholder');\n\n      // Prepare the row position before inserting its placeholder\n      row.style.top = `${rowBoundingClientRect.top - tableBoundingClientRect.top}px`;\n\n      // Prevent change event from triggering if the cloned node is selected\n      table._preventTriggeringEvents = true;\n      body.insertBefore(placeholder, row.nextElementSibling);\n      window.requestAnimationFrame(() => {\n        table._preventTriggeringEvents = false;\n      });\n\n      // Store the data to avoid re-reading the layout on drag events\n      const dragData = {\n        placeholder: placeholder,\n        index: index,\n        oldBefore: oldBefore,\n        // Backup styles to restore them later\n        style: {\n          row: style\n        }\n      };\n\n      // Required to handle the scrolling of the sticky table on drag events\n      if (sticky) {\n        dragData.sticky = sticky;\n        dragData.tableTop = tableBoundingClientRect.top;\n        dragData.tableSize = tableBoundingClientRect.height;\n        dragData.headSize = parseFloat(table._elements.container.style.marginTop);\n        dragData.dragElementSize = rowBoundingClientRect.height;\n      }\n\n      row.dragAction._dragData = dragData;\n    }\n  }\n\n  /** @private */\n  _onHeaderCellSort(event) {\n    const table = this;\n    const matchedTarget = event.matchedTarget.closest('th');\n\n    // Don't sort if the column was dragged\n    if (!matchedTarget._isDragging) {\n      const column = table._getColumn(matchedTarget);\n      // Only sort if actually sortable and event not defaultPrevented\n      if (column && column.sortable) {\n        event.preventDefault();\n\n        column._sort();\n\n        // Restore focus on the header cell in any case\n        matchedTarget.focus();\n      }\n    }\n  }\n\n  /** @private */\n  _onHeaderCellDragStart(event) {\n    const table = this;\n    const matchedTarget = event.matchedTarget;\n    const dragElement = event.detail.dragElement;\n    const siblingHeaderCellSelector = matchedTarget === dragElement ? 'th[is=\"coral-table-headercell\"]' : 'th[is=\"coral-table-headercell\"] coral-table-headercell-content';\n    const tableBoundingClientRect = table.getBoundingClientRect();\n\n    // Store the data to be used on drag events\n    dragElement.dragAction._dragData = {\n      draggedColumnIndex: getIndexOf(matchedTarget),\n      tableLeft: tableBoundingClientRect.left,\n      tableSize: tableBoundingClientRect.width,\n      dragElementSize: matchedTarget.getBoundingClientRect().width,\n      tableScrollWidth: table._elements.container.scrollWidth\n    };\n\n    getSiblingsOf(matchedTarget, siblingHeaderCellSelector, 'prevAll').forEach((item) => {\n      item.classList.add(IS_BEFORE_CLASS);\n    });\n\n    getSiblingsOf(matchedTarget, siblingHeaderCellSelector, 'nextAll').forEach((item) => {\n      item.classList.add(IS_AFTER_CLASS);\n    });\n  }\n\n  /** @private */\n  _onHeaderCellDrag(event) {\n    const table = this;\n    const container = table._elements.container;\n    const matchedTarget = event.matchedTarget;\n    const dragElement = event.detail.dragElement;\n    const dragData = dragElement.dragAction._dragData;\n    const row = matchedTarget.parentElement;\n    const isHeaderCellDragged = matchedTarget === dragElement;\n    const containerScrollLeft = container.scrollLeft;\n    const documentScrollLeft = document.body.scrollLeft;\n\n    // Prevent sorting on header cell click if the header cell is being dragged\n    matchedTarget._isDragging = true;\n\n    // Scroll left/right if table edge is reached\n    const position = dragElement.getBoundingClientRect().left - dragData.tableLeft;\n    const leftScrollLimit = 0;\n    const rightScrollLimit = dragData.tableSize - dragData.dragElementSize;\n    const scrollOffset = 10;\n\n    if (position < leftScrollLimit) {\n      container.scrollLeft -= scrollOffset;\n    }\n    // 2nd condition is required to avoid increasing the container scroll width\n    else if (position > rightScrollLimit && containerScrollLeft + dragData.tableSize < dragData.tableScrollWidth) {\n      container.scrollLeft += scrollOffset;\n    }\n\n    // Position sibling header cells based on the dragged element\n    getHeaderCells(row).forEach((headerCell) => {\n      const draggedHeaderCell = isHeaderCellDragged ? headerCell : headerCell.content;\n\n      if (!draggedHeaderCell.classList.contains(IS_DRAGGING_CLASS)) {\n        const offsetLeft = draggedHeaderCell.getBoundingClientRect().left + documentScrollLeft;\n        const isAfter = event.detail.pageX < offsetLeft + draggedHeaderCell.offsetWidth / 3;\n\n        draggedHeaderCell.classList.toggle(IS_AFTER_CLASS, isAfter);\n        draggedHeaderCell.classList.toggle(IS_BEFORE_CLASS, !isAfter);\n\n        const columnIndex = getIndexOf(headerCell);\n        const dragElementIndex = getIndexOf(matchedTarget);\n\n        // Place headercell after\n        if (draggedHeaderCell.classList.contains(IS_AFTER_CLASS)) {\n          if (columnIndex < dragElementIndex) {\n            // Position the header cells based on their siblings position\n            if (isHeaderCellDragged) {\n              const nextHeaderCellWidth = draggedHeaderCell.clientWidth;\n              draggedHeaderCell.style.left = `${nextHeaderCellWidth}px`;\n            } else {\n              const nextHeaderCell = getSiblingsOf(headerCell, 'th[is=\"coral-table-headercell\"]', 'next');\n              const nextHeaderCellLeftOffset = nextHeaderCell.getBoundingClientRect().left + documentScrollLeft;\n              draggedHeaderCell.style.left = `${nextHeaderCellLeftOffset + containerScrollLeft}px`;\n            }\n          } else {\n            draggedHeaderCell.style.left = '';\n          }\n        }\n\n        // Place headerCell before\n        if (draggedHeaderCell.classList.contains(IS_BEFORE_CLASS)) {\n          if (columnIndex > dragElementIndex) {\n            const prev = getSiblingsOf(headerCell, 'th[is=\"coral-table-headercell\"]', 'prev');\n\n            // Position the header cells based on their siblings position\n            if (isHeaderCellDragged) {\n              const beforeHeaderCellWidth = prev.clientWidth;\n              draggedHeaderCell.style.left = `${-1 * (beforeHeaderCellWidth)}px`;\n            } else {\n              const beforeHeaderCellLeftOffset = prev.getBoundingClientRect().left + documentScrollLeft;\n              draggedHeaderCell.style.left = `${beforeHeaderCellLeftOffset + containerScrollLeft}px`;\n            }\n          } else {\n            draggedHeaderCell.style.left = '';\n          }\n        }\n      }\n    });\n  }\n\n  /** @private */\n  _onHeaderCellDragEnd(event) {\n    const table = this;\n    const matchedTarget = event.matchedTarget;\n    const dragElement = event.detail.dragElement;\n    const dragData = dragElement.dragAction._dragData;\n    const column = table._getColumn(matchedTarget);\n    const headRows = getRows([table.head]);\n    const isHeaderCellDragged = matchedTarget === dragElement;\n    const row = matchedTarget.parentElement;\n\n    // Select all cells in table body and foot given the index\n    const getCellsByIndex = (cellIndex) => {\n      const cellElements = [];\n      const rows = getRows([table.body, table.foot]);\n      rows.forEach((rowElement) => {\n        const cell = getCellByIndex(rowElement, cellIndex);\n        if (cell) {\n          cellElements.push(cell);\n        }\n      });\n      return cellElements;\n    };\n\n    const cells = getCellsByIndex(getIndexOf(matchedTarget));\n    let before = null;\n    let after = null;\n\n    // Siblings are either header cell or header cell content based on the current sticky state\n    if (isHeaderCellDragged) {\n      before = row.querySelector(`th[is=\"coral-table-headercell\"].${IS_AFTER_CLASS}`);\n\n      after = row.querySelectorAll(`th[is=\"coral-table-headercell\"].${IS_BEFORE_CLASS}`);\n      after = after.length ? after[after.length - 1] : null;\n    } else {\n      before = row.querySelector(`th[is=\"coral-table-headercell\"] > coral-table-headercell-content.${IS_AFTER_CLASS}`);\n      before = before ? before.parentNode : null;\n\n      after = row.querySelectorAll(`th[is=\"coral-table-headercell\"] > coral-table-headercell-content.${IS_BEFORE_CLASS}`);\n      after = after.length ? after[after.length - 1].parentNode : null;\n    }\n\n    // Did header cell order change ?\n    const swapped = !(before && before.previousElementSibling === matchedTarget || after && after.nextElementSibling === matchedTarget);\n\n    // Switch whole columns based on the new position of the dragged element\n    if (swapped) {\n      const beforeColumn = before ? table._getColumn(before) : null;\n\n      // Trigger the event on table\n      const beforeEvent = table.trigger('coral-table:beforecolumndrag', {\n        column: column,\n        before: beforeColumn\n      });\n\n      const oldBefore = column.nextElementSibling;\n\n      if (!beforeEvent.defaultPrevented) {\n        // Insert the headercell at the new position\n        if (before) {\n          const beforeIndex = getIndexOf(before);\n          const beforeCells = getCellsByIndex(beforeIndex);\n          cells.forEach((cell, i) => {\n            cell.parentNode.insertBefore(cell, beforeCells[i]);\n          });\n\n          // Sync <coral-table-column> by reordering it too\n          const beforeCol = getColumns(table.columns)[beforeIndex];\n          if (beforeCol && column) {\n            table.columns.insertBefore(column, beforeCol);\n          }\n\n          row.insertBefore(matchedTarget, before);\n        }\n        if (after) {\n          const afterIndex = getIndexOf(after);\n          const afterCells = getCellsByIndex(afterIndex);\n          cells.forEach((cell, i) => {\n            cell.parentNode.insertBefore(cell, afterCells[i].nextElementSibling);\n          });\n\n          // Sync <coral-table-column> by reordering it too\n          const afterCol = getColumns(table.columns)[afterIndex];\n          if (afterCol && column) {\n            table.columns.insertBefore(column, afterCol.nextElementSibling);\n          }\n\n          row.insertBefore(matchedTarget, after.nextElementSibling);\n        }\n\n        // Trigger the order event if the column position changed\n        if (dragData.draggedColumnIndex !== getIndexOf(matchedTarget)) {\n          const newBefore = getColumns(table.columns)[getIndexOf(column) + 1];\n          table.trigger('coral-table:columndrag', {\n            column: column,\n            oldBefore: oldBefore,\n            before: newBefore || null\n          });\n        }\n      }\n    }\n\n    // Restoring default header cells styling\n    headRows.forEach((rowElement) => {\n      getHeaderCells(rowElement).forEach((headerCell) => {\n        headerCell = isHeaderCellDragged ? headerCell : headerCell.content;\n        headerCell.classList.remove(IS_AFTER_CLASS);\n        headerCell.classList.remove(IS_BEFORE_CLASS);\n        headerCell.style.left = '';\n      });\n    });\n\n    // Trigger a relayout\n    table._resetLayout();\n\n    window.requestAnimationFrame(() => {\n      // Allows sorting again after dragging completed\n      matchedTarget._isDragging = undefined;\n      // Refocus the dragged element manually\n      table._toggleElementTabIndex(dragElement, null, true);\n    });\n  }\n\n  /** @private */\n  _onCellSelect(event) {\n    const cell = event.target.closest('td[is=\"coral-table-cell\"]');\n\n    if (cell) {\n      cell.selected = !cell.selected;\n    }\n  }\n\n  /** @private */\n  _onRowSelect(event) {\n    const table = this;\n    const row = event.target.closest('tr[is=\"coral-table-row\"]');\n\n    if (row) {\n      // Ignore selection if the row is locked\n      if (table.lockable && row.locked) {\n        return;\n      }\n\n      // Restore text-selection\n      table.classList.remove(IS_UNSELECTABLE);\n\n      // Prevent row selection when it's the selection handle and the target is an input\n      if (table.selectable && (Keys.filterInputs(event) || !row.hasAttribute('coral-table-rowselect'))) {\n        // Pressing space scrolls the sticky table to the bottom if scrollable\n        if (event.keyCode === KEY_SPACE) {\n          event.preventDefault();\n        }\n\n        if (event.shiftKey) {\n          let lastSelectedItem = table._lastSelectedItems.items[table._lastSelectedItems.items.length - 1];\n          const lastSelectedDirection = table._lastSelectedItems.direction;\n\n          // If no selected items, by default set the first item as last selected item\n          if (!table.selectedItem) {\n            const rows = table._getSelectableItems();\n            if (rows.length) {\n              lastSelectedItem = rows[0];\n              lastSelectedItem.set('selected', true, true);\n            }\n          }\n\n          // Don't continue if table has no items or if the last selected item is the clicked item\n          if (lastSelectedItem && getIndexOf(row) !== getIndexOf(lastSelectedItem)) {\n            // Range selection direction\n            const before = getIndexOf(row) < getIndexOf(lastSelectedItem);\n            const rangeQuery = before ? 'prevUntil' : 'nextUntil';\n\n            // Store direction\n            table._lastSelectedItems.direction = before ? 'up' : 'down';\n\n            if (!row.selected) {\n              // Store selection range\n              const selectionRange = getSiblingsOf(lastSelectedItem, 'tr[is=\"coral-table-row\"]:not([selected])', rangeQuery);\n              selectionRange[before ? 'push' : 'unshift'](lastSelectedItem);\n\n              // Direction change\n              if (!before && lastSelectedDirection === 'up' || before && lastSelectedDirection === 'down') {\n                selectionRange.forEach((item) => {\n                  item.set('selected', false, true);\n                });\n              }\n\n              // Select item\n              const selectionRangeRow = selectionRange[before ? 0 : selectionRange.length - 1];\n              selectionRangeRow.set('selected', true, true);\n              getSiblingsOf(selectionRangeRow, row, rangeQuery).forEach((item) => {\n                item.set('selected', true, true);\n              });\n            } else {\n              const selection = getSiblingsOf(lastSelectedItem, row, rangeQuery);\n\n              // If some items are not selected\n              if (selection.some((item) => !item.hasAttribute('selected'))) {\n                // Select all items in between\n                selection.forEach((item) => {\n                  item.set('selected', true, true);\n                });\n\n                // Deselect selected item right before/after the selection range\n                getSiblingsOf(row, 'tr[is=\"coral-table-row\"]:not([selected])', rangeQuery).forEach((item) => {\n                  item.set('selected', false, true);\n                });\n              } else {\n                // Deselect items\n                selection[before ? 'push' : 'unshift'](lastSelectedItem);\n                selection.forEach((item) => {\n                  item.set('selected', false, true);\n                });\n              }\n            }\n          }\n        } else {\n          // Remove direction if simple click without shift key pressed\n          table._lastSelectedItems.direction = null;\n        }\n\n        // Select the row that was clicked and keep the row selected if shift key was pressed\n        row.selected = event.shiftKey ? true : !row.selected;\n\n        // Don't focus the row if the target isn't the row and focusable\n        table._focusItem(row, event.target === event.matchedTarget || event.target.tabIndex < 0);\n      }\n    }\n  }\n\n  /** @private */\n  _onRowLock(event) {\n    const table = this;\n\n    if (table.lockable) {\n      const row = event.target.closest('tr[is=\"coral-table-row\"]');\n      if (row) {\n        event.preventDefault();\n        event.stopPropagation();\n        row.locked = !row.locked;\n\n        // Refocus the locked/unlocked item manually\n        window.requestAnimationFrame(() => {\n          table._focusItem(row, true);\n        });\n      }\n    }\n  }\n\n  /** @private */\n  _onRowDown(event) {\n    const table = this;\n\n    // Prevent text-selection\n    if (table.selectedItem && event.shiftKey) {\n      table.classList.add(IS_UNSELECTABLE);\n\n      // @polyfill IE\n      // Store text selection feature\n      const onSelectStart = document.onselectstart;\n      // Kill text selection feature\n      document.onselectstart = () => false;\n      // Restore text selection feature\n      window.requestAnimationFrame(() => {\n        document.onselectstart = onSelectStart;\n      });\n    }\n  }\n\n  /** @private */\n  _onRowDragStart(event) {\n    const table = this;\n    const head = table.head;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const dragData = dragElement.dragAction._dragData;\n\n    dragData.style.cells = [];\n    getCells(dragElement).forEach((cell) => {\n      // Backup styles to restore them later\n      dragData.style.cells.push(cell.getAttribute('style'));\n      // Cells will shrink otherwise\n      cell.style.width = window.getComputedStyle(cell).width;\n    });\n\n    if (head && !head.sticky) {\n      // @polyfill ie11\n      // Element that scrolls the document.\n      const scrollingElement = document.scrollingElement || document.documentElement;\n      dragElement.style.top = `${dragElement.getBoundingClientRect().top + scrollingElement.scrollTop}px`;\n    }\n    dragElement.style.position = 'absolute';\n\n    // Setting drop zones allows to listen for coral-dragaction:dragover event\n    dragElement.dragAction.dropZone = body.querySelectorAll(`tr[is=\"coral-table-row\"]:not(.${IS_DRAGGING_CLASS})`);\n\n    // We cannot rely on :focus since the row is being moved in the dom while dnd\n    dragElement.classList.add('is-focused');\n  }\n\n  /** @private */\n  _onRowDrag(event) {\n    const table = this;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const dragData = dragElement.dragAction._dragData;\n    const firstRow = getRows([body])[0];\n\n    // Insert the placeholder at the top\n    if (dragElement.getBoundingClientRect().top <= firstRow.getBoundingClientRect().top) {\n      table._preventTriggeringEvents = true;\n      body.insertBefore(dragData.placeholder, firstRow);\n      window.requestAnimationFrame(() => {\n        table._preventTriggeringEvents = false;\n      });\n    }\n\n    // Scroll up/down if table edge is reached\n    if (dragData.sticky) {\n      const dragElementTop = dragElement.getBoundingClientRect().top;\n      const position = dragElementTop - dragData.tableTop - dragData.headSize;\n      const topScrollLimit = 0;\n      const bottomScrollLimit = dragData.tableSize - dragData.dragElementSize - dragData.headSize;\n      const scrollOffset = 10;\n\n      // Handle the scrollbar position based on the dragged element position.\n      // nextFrame is required else Chrome wouldn't take scrollTop changes in account when dragging the first row down\n      window.requestAnimationFrame(() => {\n        if (position < topScrollLimit) {\n          table._elements.container.scrollTop -= scrollOffset;\n        } else if (position > bottomScrollLimit) {\n          table._elements.container.scrollTop += scrollOffset;\n        }\n      });\n    }\n  }\n\n  /** @private */\n  _onRowDragOver(event) {\n    const table = this;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const dropElement = event.detail.dropElement;\n    const dragData = dragElement.dragAction._dragData;\n\n    // Swap the placeholder\n    if (dragElement.getBoundingClientRect().top >= dropElement.getBoundingClientRect().top) {\n      table._preventTriggeringEvents = true;\n      body.insertBefore(dragData.placeholder, dropElement.nextElementSibling);\n      window.requestAnimationFrame(() => {\n        table._preventTriggeringEvents = false;\n      });\n    }\n  }\n\n  /** @private */\n  _onRowDragEnd(event) {\n    const table = this;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const dragAction = event.detail.dragElement.dragAction;\n\n    const dragData = dragAction._dragData;\n    const before = dragData.placeholder ? dragData.placeholder.nextElementSibling : null;\n\n    // Clean up\n    table.classList.remove(IS_FIRST_ITEM_DRAGGED);\n    table.classList.remove(IS_LAST_ITEM_DRAGGED);\n\n    if (dragData.placeholder && dragData.placeholder.parentNode) {\n      dragData.placeholder.parentNode.removeChild(dragData.placeholder);\n    }\n    dragAction.destroy();\n\n    // Restore specific styling\n    dragElement.setAttribute('style', dragData.style.row || '');\n    getCells(dragElement).forEach((cell, i) => {\n      cell.setAttribute('style', dragData.style.cells[i] || '');\n    });\n\n    // Trigger the event on table\n    const beforeEvent = table.trigger('coral-table:beforeroworder', {\n      row: dragElement,\n      before: before\n    });\n\n    if (!beforeEvent.defaultPrevented) {\n      // Did row order change ?\n      const rows = getRows([body]).filter((item) => item !== dragElement);\n\n      if (dragData.index !== rows.indexOf(dragData.placeholder)) {\n        // Insert the row at the new position and prevent change event from triggering\n        table._preventTriggeringEvents = true;\n        body.insertBefore(dragElement, before);\n        window.requestAnimationFrame(() => {\n          table._preventTriggeringEvents = false;\n        });\n\n        // Trigger the order event if the row position changed\n        table.trigger('coral-table:roworder', {\n          row: dragElement,\n          oldBefore: dragData.oldBefore,\n          before: before\n        });\n      }\n    }\n\n    // Refocus the dragged element manually\n    window.requestAnimationFrame(() => {\n      dragElement.classList.remove('is-focused');\n      table._focusItem(dragElement, true);\n    });\n  }\n\n  /** @private */\n  _wrapDragHandle(handle, callback = () => {}) {\n    if(!handle.closest('span[role=\"application\"]')) {\n      const span = document.createElement('span');\n      span.setAttribute('role', 'application');\n      span.setAttribute('aria-label', i18n.get('reordering'));\n      handle.parentNode.insertBefore(span, handle);\n      span.appendChild(handle);\n      handle.selected = true;\n      handle.setAttribute('aria-pressed', 'true');\n      window.requestAnimationFrame(() => callback());\n    }\n  }\n\n  /** @private */\n  _unwrapDragHandle(handle, callback = () => {}) {\n    const span = handle && handle.closest('span[role=\"application\"]');\n\n    if (handle) {\n      handle.selected = false;\n      handle.removeAttribute('aria-pressed');\n      handle.removeAttribute('aria-describedby');\n    }\n    window.requestAnimationFrame(() => {\n      if (span) {\n        span.parentNode.insertBefore(handle, span);\n        span.remove();\n      }\n      callback();\n    });\n  }\n\n  /** @private */\n  _onKeyboardDrag(event) {\n    const table = this;\n    const row = event.target.closest('tr[is=\"coral-table-row\"]');\n\n    if (row && table.orderable) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (row.dragAction && row.dragAction.isKeyboardDragging) {\n        return;\n      }\n\n      const style = row.getAttribute('style');\n      const index = getIndexOf(row);\n      const oldBefore = row.nextElementSibling;\n      const dragAction = new DragAction(row);\n\n      dragAction.axis = 'vertical';\n\n      // Handle the scroll in table\n      dragAction.scroll = false;\n\n      // Specify selection handle directly on the row if none found\n      const handle = row.querySelector('[coral-table-roworder]');\n      dragAction.handle = handle;\n\n      // Wrap the drag handle button in a span with role=\"application\",\n      // to force Windows screen readers into forms mode while dragging.\n      if (event.target === handle) {\n        this._wrapDragHandle(handle, () => handle.focus());\n      }\n\n      // The row placeholder indicating where the dragged element will be dropped\n      const placeholder = row.cloneNode(true);\n      placeholder.classList.add('_coral-Table-row--placeholder');\n\n      // Store the data to avoid re-reading the layout on drag events\n      const dragData = {\n        placeholder: placeholder,\n        index: index,\n        oldBefore: oldBefore,\n        // Backup styles to restore them later\n        style: {\n          row: style\n        }\n      };\n      row.dragAction._dragData = dragData;\n    }\n  }\n\n  _onDragHandleClick(event) {\n    const row = event.target.closest('tr[is=\"coral-table-row\"]');\n    if (!row.dragAction) {\n      this._onKeyboardDrag(event);\n      row.dragAction._isKeyboardDrag = true;\n    } else if (row.dragAction._isKeyboardDrag) {\n      row.dragAction._isKeyboardDrag = undefined;\n    }\n  }\n\n  /** @private */\n  _onRowDragOnKeySpace(event) {\n    event.preventDefault();\n\n    const dragElement = event.detail.dragElement;\n    const dragData = dragElement.dragAction._dragData;\n\n    if (dragElement.dragAction._isKeyboardDrag) {\n      return;\n    }\n\n    dragData.style.cells = [];\n    getCells(dragElement).forEach((cell) => {\n      // Backup styles to restore them later\n      dragData.style.cells.push(cell.getAttribute('style'));\n      // Cells will shrink otherwise\n      cell.style.width = window.getComputedStyle(cell).width;\n    });\n  }\n\n  /** @private */\n  _onRowDragOverOnKeyArrowDown(event) {\n    const table = this;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const items = getRows([body]);\n    const index = getIndexOf(dragElement);\n    const dragData = dragElement.dragAction._dragData;\n    const handle = dragElement.dragAction.handle;\n    const rowHeader = dragElement.rowHeader;\n\n    event.preventDefault();\n\n    // We cannot rely on :focus since the row is being moved in the dom while dnd\n    dragElement.classList.add('is-focused');\n\n    if (dragElement === items[items.length - 1]) {\n      for (let position = 0; position < items.length - 1; position++) {\n        body.appendChild(items[position]);\n      }\n      body.insertBefore(items[0], items[items.length - 2].nextElementSibling);\n    } else {\n      body.insertBefore(items[index + 1], items[index]);\n    }\n\n    // Restore specific styling\n    dragElement.setAttribute('style', dragData.style.row || '');\n    getCells(dragElement).forEach((cell, i) => {\n      if (dragData.style.cells) {\n        cell.setAttribute('style', dragData.style.cells[i] || '');\n      }\n    });\n\n    if (handle) {\n      handle.focus();\n      this._announceLiveRegion((rowHeader ? rowHeader.textContent + ' ' : '') + i18n.get('reordered to row {0}', [getIndexOf(dragElement) + 1]), 'assertive');\n    }\n\n    dragElement.scrollIntoView({block: 'nearest'});\n  }\n\n  /** @private */\n  _onRowDragOverOnKeyArrowUp(event) {\n    const table = this;\n    const body = table.body;\n    const dragElement = event.detail.dragElement;\n    const items = getRows([body]);\n    const index = getIndexOf(dragElement);\n    const dragData = dragElement.dragAction._dragData;\n    const handle = dragElement.dragAction.handle;\n    const rowHeader = dragElement.rowHeader;\n\n    event.preventDefault();\n\n    // We cannot rely on :focus since the row is being moved in the dom while dnd\n    dragElement.classList.add('is-focused');\n\n    if (dragElement === items[0]) {\n      for (let position = 0; position < items.length - 2; position++) {\n        body.insertBefore(items[position + 1], items[0]);\n      }\n      body.insertBefore(items[items.length - 1], items[1]);\n    } else {\n      body.insertBefore(items[index - 1], items[index].nextElementSibling);\n    }\n\n    // Restore specific styling\n    dragElement.setAttribute('style', dragData.style.row || '');\n    getCells(dragElement).forEach((cell, i) => {\n      if (dragData.style.cells) {\n        cell.setAttribute('style', dragData.style.cells[i] || '');\n      }\n    });\n\n    if (handle) {\n      handle.focus();\n      this._announceLiveRegion((rowHeader ? rowHeader.textContent + ' ' : '') + i18n.get('reordered to row {0}', [getIndexOf(dragElement) + 1]), 'assertive');\n    }\n\n    dragElement.scrollIntoView({block: 'nearest'});\n  }\n\n  /** @private */\n  _onRowDragOverOnKeyEnter(event) {\n    const table = this;\n    const dragElement = event.detail.dragElement;\n    const dragAction = dragElement.dragAction;\n    const dragData = dragAction._dragData;\n    const handle = dragAction.handle;\n\n    if (dragAction._isKeyboardDrag) {\n      dragAction._isKeyboardDrag = undefined;\n      return;\n    }\n\n    // Trigger the event on table\n    const beforeEvent = table.trigger('coral-table:beforeroworder', {\n      row: dragElement,\n      before: dragData.oldBefore\n    });\n\n    if (!beforeEvent.defaultPrevented && dragData.oldBefore !== dragElement.nextElementSibling) {\n      // Trigger the order event if the row position changed\n      table.trigger('coral-table:roworder', {\n        row: dragElement,\n        oldBefore: dragData.oldBefore,\n        before: dragElement.nextElementSibling\n      });\n    }\n\n    dragAction.destroy();\n\n    const isFocusWithinDragElement = dragElement.contains(document.activeElement) || dragElement === document.activeElement;\n    const isFocusOnHandle = handle && handle === document.activeElement;\n\n    // Refocus the dragged element manually\n    const callback = () => {\n      dragElement.classList.remove('is-focused');\n      if (isFocusWithinDragElement) {\n        table._focusItem(dragElement, true);\n      }\n      if (isFocusOnHandle) {\n        handle.focus();\n      }\n    };\n\n    this._unwrapDragHandle(handle, callback);\n  }\n\n  /** @private */\n  _onRowMultipleChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const row = event.target;\n\n    // Deselect all except last\n    if (!row.multiple) {\n      const selectedItems = row.selectedItems;\n      table._preventTriggeringEvents = true;\n      selectedItems.forEach((cell, i) => {\n        cell.selected = i === selectedItems.length - 1;\n      });\n\n      window.requestAnimationFrame(() => {\n        table._preventTriggeringEvents = false;\n\n        table.trigger('coral-table:rowchange', {\n          oldSelection: selectedItems,\n          selection: row.selectedItems,\n          row: row\n        });\n      });\n    }\n  }\n\n  /** @private */\n  _onBeforeRowSelectionChanged(event) {\n    event.stopImmediatePropagation();\n\n    // In single selection, if the added item is selected, the rest should be deselected\n    const selectedItem = this.selectedItem;\n    if (!this.multiple && selectedItem && !event.target.selected) {\n      selectedItem.set('selected', false, true);\n      this._removeLastSelectedItem(selectedItem);\n    }\n  }\n\n  /** @private */\n  _syncSelectAllHandle(selectedItems, items) {\n    if (items.length && selectedItems.length === items.length) {\n      this._setSelectAllHandleState('checked');\n    } else if (!selectedItems.length) {\n      this._setSelectAllHandleState('unchecked');\n    } else {\n      this._setSelectAllHandleState('indeterminate');\n    }\n  }\n\n  /** @private */\n  _setSelectAllHandleState(state) {\n    const handle = this.querySelector('[coral-table-select]');\n\n    if (handle) {\n\n      // If the handle is a checkbox but lacks a label, label it with \"Select All\".\n      if (handle.tagName === 'CORAL-CHECKBOX') {\n        if (!handle.labelled) {\n          handle.setAttribute('labelled', i18n.get('Select All'));\n        }\n        if (!handle.title) {\n          handle.setAttribute('title', i18n.get('Select All'));\n        }\n      }\n\n      if (state === 'checked') {\n        handle.removeAttribute('indeterminate');\n        handle.setAttribute('checked', '');\n      } else if (state === 'unchecked') {\n        handle.removeAttribute('indeterminate');\n        handle.removeAttribute('checked');\n      } else if (state === 'indeterminate') {\n        handle.setAttribute('indeterminate', '');\n      }\n    }\n  }\n\n  /** @private */\n  _onRowSelectionChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._triggerChangeEvent();\n\n    const table = this;\n    const body = table.body;\n    const row = event.target;\n\n    // Synchronise the table select handle\n    if (body && body.contains(row)) {\n      const selection = table.selectedItems;\n      const rows = table._getSelectableItems();\n\n      // Sync select all handle\n      table._syncSelectAllHandle(selection, rows);\n\n      // Store or remove the row reference\n      table[row.selected ? '_addLastSelectedItem' : '_removeLastSelectedItem'](row);\n\n      // Store selected items range\n      const lastSelectedItem = table._lastSelectedItems.items[table._lastSelectedItems.items.length - 1];\n      const next = table._lastSelectedItems.direction === 'down';\n      if (row.selected && lastSelectedItem && lastSelectedItem.selected && getSiblingsOf(lastSelectedItem, 'tr[is=\"coral-table-row\"][selected]', next ? 'next' : 'prev')) {\n        getSiblingsOf(lastSelectedItem, 'tr[is=\"coral-table-row\"]:not([selected])', next ? 'nextUntil' : 'prevUntil').forEach((item) => {\n          table._addLastSelectedItem(item);\n        });\n      }\n    }\n  }\n\n  _onRowLockedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const body = this.body;\n    const row = event.target;\n\n    if (body && body.contains(row)) {\n      if (row.locked) {\n        // Store the row index as reference to place it back if unlocked and its selection state\n        row._rowIndex = getIndexOf(row);\n\n        // Insert row at first position of its tbody\n        table._preventTriggeringEvents = true;\n        body.insertBefore(row, getRows([body])[0]);\n        window.requestAnimationFrame(() => {\n          table._preventTriggeringEvents = false;\n        });\n\n        // Trigger event on table\n        table.trigger('coral-table:rowlock', {row});\n      } else {\n        // Put the row back to its initial position\n        if (row._rowIndex >= 0) {\n          const beforeRow = getRows([body])[row._rowIndex];\n          if (beforeRow) {\n            // Insert row at its initial position\n            table._preventTriggeringEvents = true;\n            body.insertBefore(row, beforeRow.nextElementSibling);\n            window.requestAnimationFrame(() => {\n              table._preventTriggeringEvents = false;\n            });\n          }\n        }\n\n        // Trigger event on table\n        table.trigger('coral-table:rowunlock', {row});\n      }\n    }\n  }\n\n  _onHeadContentChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const head = table.head;\n    const addedNodes = event.detail.addedNodes;\n\n    for (let i = 0 ; i < addedNodes.length ; i++) {\n      const node = addedNodes[i];\n\n      // Sync header cell whether sticky or not\n      if (isTableHeaderCell(node)) {\n        table._toggleStickyHeaderCell(node, head.sticky);\n      }\n    }\n  }\n\n  /** @private */\n  _onBodyContentChanged(event) {\n    if (event.stopImmediatePropagation) {\n      event.stopImmediatePropagation();\n    }\n\n    const table = this;\n    const addedNodes = event.detail.addedNodes;\n    const removedNodes = event.detail.removedNodes;\n    let addedNode = null;\n    const selectItem = (item) => {\n      item.selected = item === addedNode;\n    };\n    let changed = false;\n\n    // Sync added nodes\n    for (let i = 0 ; i < addedNodes.length ; i++) {\n      addedNode = addedNodes[i];\n\n      // Sync row state with table properties\n      if (isTableRow(addedNode)) {\n        changed = true;\n\n        addedNode._toggleSelectable(table.selectable);\n        addedNode._toggleOrderable(table.orderable);\n        addedNode._toggleLockable(table.lockable);\n\n        // @compat\n        this._toggleSelectionCheckbox(addedNode);\n\n        const selectedItems = table.selectedItems;\n        if (addedNode.selected) {\n          // In single selection, if the added item is selected, the rest should be deselected\n          if (!table.multiple && selectedItems.length > 1) {\n            selectedItems.forEach(selectItem);\n          }\n\n          table._triggerChangeEvent();\n        }\n\n        // Cells are selectable too\n        if (addedNode.selectable) {\n          addedNode.trigger('coral-table-row:_contentchanged', {\n            addedNodes: getContentCells(addedNode),\n            removedNodes: []\n          });\n        }\n\n        // Trigger collection event\n        if (!table._preventTriggeringEvents) {\n          table.trigger('coral-collection:add', {\n            item: addedNode\n          });\n        }\n\n        // a11y\n        table._toggleFocusable();\n      }\n    }\n\n    // Sync removed nodes\n    for (let k = 0 ; k < removedNodes.length ; k++) {\n      const removedNode = removedNodes[k];\n\n      if (isTableRow(removedNode)) {\n        changed = true;\n\n        // If the focusable item is removed, the first item becomes the new focusable item\n        if (removedNode.getAttribute('tabindex') === '0') {\n          const firstItem = getRows([table.body])[0];\n          if (firstItem) {\n            table._focusItem(firstItem);\n          }\n        }\n\n        if (removedNode.selected) {\n          table._triggerChangeEvent();\n        }\n\n        // Sync _lastSelectedItems array\n        const removedItemIndex = table._lastSelectedItems.items.indexOf(removedNode);\n        if (removedItemIndex !== -1) {\n          table._lastSelectedItems.items = table._lastSelectedItems.items.splice(removedItemIndex, 1);\n        }\n\n        // Trigger collection event\n        if (!table._preventTriggeringEvents) {\n          table.trigger('coral-collection:remove', {\n            item: removedNode\n          });\n        }\n      }\n    }\n\n    if (changed) {\n      const items = this._getSelectableItems();\n      // Sync select all handle if any.\n      table._syncSelectAllHandle(table.selectedItems, items);\n      // Disable table features if no items.\n      table._toggleInteractivity(items.length === 0);\n    }\n  }\n\n  /** @private */\n  _onBodyEmpty(event) {\n    event.stopImmediatePropagation();\n    this._toggleInteractivity(true);\n  }\n\n  /** @private */\n  _onRowChange(event) {\n    event.stopImmediatePropagation();\n\n    if (!this._preventTriggeringEvents) {\n      this.trigger('coral-table:rowchange', {\n        oldSelection: event.detail.oldSelection,\n        selection: event.detail.selection,\n        row: event.target\n      });\n    }\n  }\n\n  /** @private */\n  _onRowContentChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const row = event.target;\n    const addedNodes = event.detail.addedNodes;\n    let addedNode = null;\n    const removedNodes = event.detail.removedNodes;\n    const selectItem = (item) => {\n      item.selected = item === addedNode;\n    };\n\n    // Sync added nodes\n    for (let i = 0 ; i < addedNodes.length ; i++) {\n      addedNode = addedNodes[i];\n\n      // Sync row state with table properties\n      if (isTableCell(addedNode)) {\n        addedNode._toggleSelectable(row.selectable);\n\n        const selectedItems = row.selectedItems;\n        if (addedNode.selected) {\n          // In single selection, if the added item is selected, the rest should be deselected\n          if (!row.multiple && selectedItems.length > 1) {\n            selectedItems.forEach(selectItem);\n          }\n\n          row._triggerChangeEvent();\n        }\n\n        // Trigger collection event\n        if (!table._preventTriggeringEvents) {\n          row.trigger('coral-collection:add', {\n            item: addedNode\n          });\n        }\n      }\n      // Add appropriate scope depending on whether headercell is in THEAD or TBODY\n      else if (isTableHeaderCell(addedNode)) {\n        table._setHeaderCellScope(addedNode, row.parentNode);\n      }\n    }\n\n    // Sync removed nodes\n    for (let k = 0 ; k < removedNodes.length ; k++) {\n      const removedNode = removedNodes[k];\n\n      if (isTableCell(removedNode)) {\n        if (removedNode.selected) {\n          row._triggerChangeEvent();\n        }\n\n        // Trigger collection event\n        if (!table._preventTriggeringEvents) {\n          row.trigger('coral-collection:remove', {\n            item: removedNode\n          });\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _toggleInteractivity(disable) {\n    const table = this;\n    const selectAll = table.querySelector('[coral-table-select]');\n\n    if (selectAll) {\n      selectAll.disabled = disable;\n    }\n\n    table.classList.toggle(IS_DISABLED, disable);\n  }\n\n  _onAlignmentChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._resetAlignmentColumns();\n  }\n\n  /** @private */\n  _onFixedWidthChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const head = table.head;\n    const column = event.target;\n\n    if (head) {\n      const headRows = getRows([head]);\n      const columnIndex = getIndexOf(event.target);\n\n      headRows.forEach((row) => {\n        const headerCell = getCellByIndex(row, columnIndex);\n        if (headerCell && headerCell.tagName === 'TH') {\n          headerCell[column.fixedWidth ? 'setAttribute' : 'removeAttribute']('fixedwidth', '');\n        }\n      });\n    }\n\n    table._resetLayout();\n  }\n\n  /** @private */\n  _onColumnOrderableChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const head = this.head;\n    const column = event.target;\n    const headerCell = table._getColumnHeaderCell(column);\n\n    if (headerCell) {\n      // Move the drag handle\n      table._toggleDragActionHandle(headerCell, head && head.sticky);\n\n      table._resetLayout();\n    }\n  }\n\n  /** @private */\n  _onColumnSortableChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const head = this.head;\n    const column = event.target;\n    const headerCell = table._getColumnHeaderCell(column);\n\n    if (headerCell) {\n      // For icons (chevron up/down) styling\n      headerCell[column.sortable ? 'setAttribute' : 'removeAttribute']('sortable', '');\n\n      // Toggle tab index. Sortable headercells are focusable.\n      table._toggleHeaderCellTabIndex(headerCell, head && head.sticky);\n\n      table._resetLayout();\n    }\n  }\n\n  _onColumnSortableDirectionChanged(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const column = event.target;\n    const sortableDirection = TableColumn.sortableDirection;\n\n    // Hide coral-table-roworder handles if table is sorted\n    table.classList.toggle(IS_SORTED, table._isSorted());\n\n    const headerCell = table._getColumnHeaderCell(column);\n    if (headerCell) {\n      // For icons (chevron up/down) styling\n      headerCell.setAttribute('sortabledirection', column.sortableDirection);\n      headerCell.setAttribute('aria-sort', column.sortableDirection === sortableDirection.DEFAULT ? 'none' : column.sortableDirection);\n\n      if (column.sortableDirection === sortableDirection.DEFAULT) {\n        this._announceLiveRegion();\n      } else {\n        const textContent = headerCell.content.textContent.trim();\n        if (textContent.length) {\n          // Set live region to true so that sort description string will be announced.\n          this._announceLiveRegion(i18n.get(`sorted by column {0} in ${column.sortableDirection} order`, textContent));\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _announceLiveRegion(text, politeness = 'polite') {\n\n    if (this._liveRegionTimeout) {\n      window.clearTimeout(this._liveRegionTimeout);\n    }\n\n    if (!text || !text.length) {\n      this._elements.liveRegion.innerText = '';\n      return;\n    }\n\n    // Set live region to true so that text string will be announced.\n    this._elements.liveRegion.setAttribute('aria-live', politeness);\n    this._elements.liveRegion.removeAttribute('aria-hidden');\n    if (this._isSorted()) {\n      this._elements.liveRegion.innerText = text;\n    } else {\n      this._liveRegionTimeout = window.setTimeout(() => this._elements.liveRegion.innerText = text, 100);\n    }\n\n    // @a11y wait 2.5 seconds to give screen reader enough time to announce the live region before silencing the it.\n    window.setTimeout(() => {\n      this._elements.liveRegion.setAttribute('aria-live', 'off');\n      this._elements.liveRegion.setAttribute('aria-hidden', 'true');\n      if (!this._isSorted()) {\n        this._elements.liveRegion.innerText = '';\n      }\n    }, 2500);\n  }\n\n  _onColumnHiddenChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._resetHiddenColumns(true);\n  }\n\n  _onBeforeColumnSort(event) {\n    event.stopImmediatePropagation();\n\n    const table = this;\n    const column = event.target;\n    const newSortableDirection = event.detail.newSortableDirection;\n\n    const beforeEvent = table.trigger('coral-table:beforecolumnsort', {\n      column: column,\n      direction: newSortableDirection\n    });\n\n    if (!beforeEvent.defaultPrevented) {\n      column.sortableDirection = newSortableDirection;\n    }\n  }\n\n  _onColumnSort(event) {\n    event.stopImmediatePropagation();\n\n    // Don't sort yet\n    if (!this._allowSorting) {\n      return;\n    }\n\n    const table = this;\n    const body = table.body;\n    const column = event.target;\n    const columnIndex = getIndexOf(column);\n    const colHeaderCell = table._getColumnHeaderCell(column);\n    const onInitialization = event.detail.onInitialization;\n    const sortableDirection = event.detail.sortableDirection;\n    const sortableType = event.detail.sortableType;\n\n    const rows = getRows([body]);\n    const cells = [];\n\n    // Prevent change event from triggering when sorting\n    if (table) {\n      table._preventTriggeringEvents = true;\n    }\n\n    // Store a reference of the default row index for default sortable direction\n    rows.forEach((row, i) => {\n      if (typeof row._defaultRowIndex === 'undefined') {\n        row._defaultRowIndex = i;\n      }\n\n      const cell = getCellByIndex(row, columnIndex);\n      if (cell) {\n        cells.push(cell);\n      }\n    });\n\n    if (column.sortableDirection === sortableDirection.ASCENDING) {\n      // Remove sortable direction on sibling columns\n      getSiblingsOf(column, 'col[is=\"coral-table-column\"]').forEach((col) => {\n        col._preventSort = true;\n        col.setAttribute('sortabledirection', sortableDirection.DEFAULT);\n        col._preventSort = false;\n      });\n\n      if (colHeaderCell) {\n        // For icons (chevron up/down) styling\n        getSiblingsOf(colHeaderCell, 'th[is=\"coral-table-headercell\"]').forEach((headerCell) => {\n          headerCell.setAttribute('sortabledirection', sortableDirection.DEFAULT);\n          headerCell.setAttribute('aria-sort', 'none');\n        });\n      }\n\n      // Use cell value to sort and fallback if not specified\n      cells.sort((a, b) => {\n        if (column.sortableType === sortableType.ALPHANUMERIC) {\n          const aText = a.value ? a.value : a.textContent;\n          const bText = b.value ? b.value : b.textContent;\n          return aText.localeCompare(bText);\n        } else if (column.sortableType === sortableType.NUMBER) {\n          // Remove all spaces and replace commas with dots for decimal values\n          const aNumber = parseFloat(a.value ? a.value : a.textContent.replace(/\\s+/g, '').replace(/,/g, '.'));\n          const bNumber = parseFloat(b.value ? b.value : b.textContent.replace(/\\s+/g, '').replace(/,/g, '.'));\n          return aNumber > bNumber ? 1 : -1;\n        } else if (column.sortableType === sortableType.DATE) {\n          const aDate = a.value ? new Date(parseInt(a.value, 10)) : new Date(a.textContent);\n          const bDate = b.value ? new Date(parseInt(b.value, 10)) : new Date(b.textContent);\n          return aDate > bDate ? 1 : -1;\n        }\n      });\n\n      // Only sort if not custom sorting\n      if (column.sortableType !== sortableType.CUSTOM) {\n        if (body) {\n          // Insert the row at the new position if actually sorted\n          cells.forEach((cell) => {\n            const row = cell.parentElement;\n            // Prevent locked row to be sorted\n            if (!row.locked) {\n              body.appendChild(row);\n            }\n          });\n        }\n\n        // Trigger on table\n        table.trigger('coral-table:columnsort', {column});\n      }\n\n      // Table is in a sorted state. Disable orderable actions\n      rows.forEach((row) => {\n        if (row.dragAction) {\n          row.dragAction.destroy();\n        }\n      });\n    } else if (column.sortableDirection === sortableDirection.DESCENDING) {\n      getSiblingsOf(column, 'col[is=\"coral-table-column\"]').forEach((col) => {\n        col._preventSort = true;\n        col.setAttribute('sortabledirection', sortableDirection.DEFAULT);\n        col._preventSort = false;\n      });\n\n      if (colHeaderCell) {\n        getSiblingsOf(colHeaderCell, 'th[is=\"coral-table-headercell\"]').forEach((headerCell) => {\n          headerCell.setAttribute('sortabledirection', sortableDirection.DEFAULT);\n          headerCell.setAttribute('aria-sort', 'none');\n        });\n      }\n\n      cells.sort((a, b) => {\n        if (column.sortableType === sortableType.ALPHANUMERIC) {\n          const aText = a.value ? a.value : a.textContent;\n          const bText = b.value ? b.value : b.textContent;\n          return bText.localeCompare(aText);\n        } else if (column.sortableType === sortableType.NUMBER) {\n          // Remove all spaces and replace commas with dots for decimal values\n          const aNumber = parseFloat(a.value ? a.value : a.textContent.replace(/\\s+/g, '').replace(/,/g, '.'));\n          const bNumber = parseFloat(b.value ? b.value : b.textContent.replace(/\\s+/g, '').replace(/,/g, '.'));\n          return aNumber < bNumber ? 1 : -1;\n        } else if (column.sortableType === sortableType.DATE) {\n          const aDate = a.value ? new Date(parseInt(a.value, 10)) : new Date(a.textContent);\n          const bDate = b.value ? new Date(parseInt(b.value, 10)) : new Date(b.textContent);\n          return aDate < bDate ? 1 : -1;\n        }\n      });\n\n      // Only sort if not custom sorting\n      if (column.sortableType !== sortableType.CUSTOM) {\n        if (body) {\n          // Insert the row at the new position if actually sorted\n          cells.forEach((cell) => {\n            const row = cell.parentElement;\n            // Prevent locked row to be sorted\n            if (!row.locked) {\n              body.appendChild(row);\n            }\n          });\n        }\n\n        // Trigger on table\n        table.trigger('coral-table:columnsort', {column});\n      }\n\n      // Table is in a sorted state. Disable orderable actions\n      rows.forEach((row) => {\n        if (row.dragAction) {\n          row.dragAction.destroy();\n        }\n      });\n    } else if (column.sortableDirection === sortableDirection.DEFAULT && !onInitialization) {\n      // Only sort if not custom sorting\n      if (column.sortableType !== sortableType.CUSTOM) {\n        // Put rows back to their initial position\n        rows.sort((a, b) => a._defaultRowIndex > b._defaultRowIndex ? 1 : -1);\n\n        rows.forEach((row) => {\n          // Prevent locked row to be sorted\n          if (body && !row.locked) {\n            body.appendChild(row);\n          }\n        });\n\n        // Trigger on table\n        table.trigger('coral-table:columnsort', {column});\n      }\n    }\n\n    // Allow triggering change events again after sorting\n    window.requestAnimationFrame(() => {\n      // a11y initialize column sort aria-describedby\n      if (onInitialization && column.sortableDirection !== sortableDirection.DEFAULT) {\n        const textContent = colHeaderCell.content.textContent.trim();\n        if (textContent.length) {\n          this._elements.liveRegion.innerText = i18n.get(`sorted by column {0} in ${column.sortableDirection} order`, textContent);\n        }\n      }\n\n      table._preventTriggeringEvents = false;\n    });\n  }\n\n  _onHeadStickyChanged(event) {\n    event.stopImmediatePropagation();\n\n    // a11y\n    this._toggleFocusable();\n\n    const table = this;\n    const head = event.target;\n\n    // Wait next frame before reading and changing header cell layout\n    window.requestAnimationFrame(() => {\n      // Defines the head height\n      const tableHeight = head.sticky ? `${head.getBoundingClientRect().height}px` : null;\n      table._resetContainerLayout(tableHeight, table._elements.container.style.height);\n\n      getRows([head]).forEach((row) => {\n        getHeaderCells(row).forEach((headerCell) => {\n          table._toggleStickyHeaderCell(headerCell, head.sticky);\n        });\n      });\n\n      // Make sure sticky styling is applied\n      table.classList.toggle(`${CLASSNAME}--sticky`, head.sticky);\n\n      // Layout sticky head\n      table._preventResetLayout = false;\n      table._resetLayout();\n    });\n  }\n\n  /** @private */\n  _getColumnHeaderCell(column) {\n    const table = this;\n    const head = table.head;\n    let headerCell = null;\n\n    if (head) {\n      const headRows = getRows([head]);\n      const columnIndex = getIndexOf(column);\n      if (headRows.length) {\n        headerCell = getCellByIndex(headRows[headRows.length - 1], columnIndex);\n        headerCell = headerCell && headerCell.tagName === 'TH' ? headerCell : null;\n      }\n    }\n\n    return headerCell;\n  }\n\n  /** @private */\n  _getColumn(headerCell) {\n    // Get the corresponding column\n    return getColumns(this.columns)[getIndexOf(headerCell)] || null;\n  }\n\n  /** @private */\n  _toggleStickyHeaderCell(headerCell, sticky) {\n    // Set the size\n    this._layoutStickyCell(headerCell, sticky);\n\n    // Define DragAction on the sticky cell instead of the headercell\n    this._toggleDragActionHandle(headerCell, sticky);\n\n    // Toggle tab index. Sortable headercells are focusable.\n    this._toggleHeaderCellTabIndex(headerCell, sticky);\n  }\n\n  _layoutStickyCell(headerCell, sticky) {\n    if (sticky) {\n      const computedStyle = window.getComputedStyle(headerCell);\n\n      // Don't allow the column to shrink less than its minimum allowed\n      if (!headerCell.style.minWidth) {\n        let hasVisibleChildNodes = false;\n        // In most cases, there's text content\n        if (headerCell.textContent.trim().length) {\n          hasVisibleChildNodes = true;\n        }\n        // Verify if there are any visible nodes without text content which could take layout space\n        else {\n          const headerCellChildren = headerCell.content.children;\n          for (let i = 0 ; i < headerCellChildren.length && !hasVisibleChildNodes ; i++) {\n            if (headerCellChildren[0].offsetParent) {\n              hasVisibleChildNodes = true;\n            }\n          }\n        }\n\n        if (hasVisibleChildNodes) {\n          const width = headerCell.content.getBoundingClientRect().width;\n          // Don't set the width if the header cell is hidden\n          if (width > 0) {\n            headerCell.style.minWidth = `${width}px`;\n          }\n        }\n      }\n\n      const cellWidth = parseFloat(computedStyle.width);\n      const cellPadding = parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight);\n      const borderRightWidth = parseFloat(computedStyle.borderRightWidth);\n\n      // Reflect headercell size on sticky cell\n      headerCell.content.style.width = `${cellWidth + cellPadding + borderRightWidth}px`;\n    } else {\n      // Restore headercell style\n      headerCell.style.minWidth = '';\n      headerCell.content.style.width = '';\n      headerCell.content.style.height = '';\n      headerCell.content.style.top = '';\n      headerCell.content.style.marginLeft = '';\n      headerCell.content.style.paddingTop = '';\n    }\n  }\n\n  /** @private */\n  _toggleDragActionHandle(headerCell, sticky) {\n    const column = this._getColumn(headerCell);\n\n    if (headerCell.dragAction) {\n      headerCell.dragAction.destroy();\n    }\n    if (headerCell.content.dragAction) {\n      headerCell.content.dragAction.destroy();\n    }\n\n    if (column && column.orderable) {\n      const dragAction = new DragAction(sticky ? headerCell.content : headerCell);\n      dragAction.axis = 'horizontal';\n      // Handle the scroll in table\n      dragAction.scroll = false;\n      headerCell.setAttribute('orderable', '');\n    } else {\n      headerCell.removeAttribute('orderable');\n    }\n  }\n\n  /** @private */\n  _toggleFocusable() {\n    const firstItem = getRows([this.body])[0];\n    if (!firstItem) {\n      return;\n    }\n\n    const focusableItem = this._getFocusableItem();\n    if (this.selectable || this.lockable || this.orderable || (this.head && this.head.sticky)) {\n      // First item is focusable by default but don't remove the tabindex of the existing focusable item\n      if (!focusableItem) {\n        this._toggleElementTabIndex(firstItem);\n      }\n    } else if (focusableItem) {\n      // Basic table is not focusable\n      focusableItem.removeAttribute('tabindex');\n    }\n  }\n\n  /** @private */\n  _toggleElementTabIndex(element, oldFocusable, forceFocus) {\n    if (oldFocusable) {\n      oldFocusable.removeAttribute('tabindex');\n    }\n\n    element.setAttribute('tabindex', '0');\n    if (forceFocus) {\n      element.focus();\n    }\n  }\n\n  /** @private */\n  _toggleHeaderCellTabIndex(headerCell, sticky) {\n    const column = this._getColumn(headerCell);\n    const sortable = column && (column.sortable || column.orderable);\n    headerCell.content[sortable ? 'setAttribute' : 'removeAttribute']('tabindex', '0');\n    headerCell.content[sortable ? 'setAttribute' : 'removeAttribute']('role', 'button');\n  }\n\n  /** @private */\n  _isSorted() {\n    let column = null;\n    const isSorted = getColumns(this.columns).some((col) => {\n      column = col;\n      return col.sortableDirection !== TableColumn.sortableDirection.DEFAULT;\n    });\n\n    return isSorted ? column : false;\n  }\n\n  /** @private */\n  _focusEdgeItem(event, first) {\n    const items = getRows([this.body]);\n    if (items.length) {\n      event.preventDefault();\n\n      let item = this._getFocusableItem();\n      if (item) {\n        item.removeAttribute('tabindex');\n      }\n\n      item = items[first ? 0 : items.length - 1];\n      item.setAttribute('tabindex', '0');\n      item.focus();\n    }\n  }\n\n  /** @private */\n  _focusSiblingItem(event, next) {\n    const item = this._getFocusableItem();\n    if (item) {\n      event.preventDefault();\n\n      const siblingItem = getSiblingsOf(item, 'tr[is=\"coral-table-row\"]', next ? 'next' : 'prev');\n      if (siblingItem) {\n        item.removeAttribute('tabindex');\n        siblingItem.setAttribute('tabindex', '0');\n        siblingItem.focus();\n      }\n    }\n  }\n\n  /** @private */\n  _selectSiblingItem(next) {\n    if (this.selectable && this.multiple) {\n      const selectedItems = this.selectedItems;\n      let lastSelectedItem = this._lastSelectedItems.items[this._lastSelectedItems.items.length - 1];\n\n      if (selectedItems.length) {\n        // Prevent selection if we reached the edge\n        if (next && lastSelectedItem.matches(':last-of-type') || !next && lastSelectedItem.matches(':first-of-type')) {\n          return;\n        }\n\n        // Target sibling item\n        const sibling = getSiblingsOf(lastSelectedItem, 'tr[is=\"coral-table-row\"]', next ? 'next' : 'prev');\n        if (!sibling.hasAttribute('selected')) {\n          lastSelectedItem = sibling;\n        }\n\n        // Store last selection\n        this._lastSelectedItems.direction = next ? 'down' : 'up';\n\n        // Toggle selection\n        lastSelectedItem.selected = !lastSelectedItem.selected;\n      } else if (getRows([this.body]).length) {\n        const focusableItem = this._getFocusableItem();\n\n        // Store last selection\n        this._lastSelectedItems.direction = next ? 'down' : 'up';\n\n        // Select focusable item by default if no items selected\n        focusableItem.selected = true;\n      }\n    }\n\n    // Focus last selected item\n    window.requestAnimationFrame(() => {\n      const itemToFocus = this._lastSelectedItems.items[this._lastSelectedItems.items.length - 1];\n      if (itemToFocus) {\n        this._focusItem(itemToFocus, true);\n      }\n    });\n  }\n\n  /** @private */\n  _getFocusableItem() {\n    return this.body && this.body.querySelector('tr[is=\"coral-table-row\"][tabindex=\"0\"]');\n  }\n\n  /** @private */\n  _getFocusableHeaderCell() {\n    return this.head && this.head.querySelector('th[is=\"coral-table-headercell\"][tabindex=\"0\"], th[is=\"coral-table-headercell\"] > coral-table-headercell-content[tabindex=\"0\"]');\n  }\n\n  /** @private */\n  _addLastSelectedItem(item) {\n    if (this._lastSelectedItems.items.indexOf(item) === -1) {\n      this._lastSelectedItems.items.push(item);\n    } else {\n      // Push it at the end\n      this._removeLastSelectedItem(item);\n      this._addLastSelectedItem(item);\n    }\n  }\n\n  /** @private */\n  _removeLastSelectedItem(item) {\n    this._lastSelectedItems.items.splice(this._lastSelectedItems.items.indexOf(item), 1);\n  }\n\n  /** @private */\n  _focusItem(item, forceFocus) {\n    this._toggleElementTabIndex(item, this._getFocusableItem(), forceFocus);\n  }\n\n  /** @private */\n  _onFocusFirstItem(event) {\n    this._focusEdgeItem(event, true);\n  }\n\n  /** @private */\n  _onFocusLastItem(event) {\n    this._focusEdgeItem(event, false);\n  }\n\n  /** @private */\n  _onFocusNextItem(event) {\n    this._focusSiblingItem(event, true);\n  }\n\n  /** @private */\n  _onFocusPreviousItem(event) {\n    this._focusSiblingItem(event, false);\n  }\n\n  /** @private */\n  _onSelectNextItem() {\n    this._selectSiblingItem(true);\n  }\n\n  /** @private */\n  _onSelectPreviousItem() {\n    this._selectSiblingItem(false);\n  }\n\n  /**\n   * Call the layout method of table component\n   *\n   * @param {Boolean} forced\n   * If true call the layout method immediately, else wait for timeout\n   */\n  resetLayout(forced) {\n    forced = transform.boolean(forced);\n    if (forced === true) {\n      this._doResetLayout();\n      this._preventResetLayout = false;\n    } else {\n      this._resetLayout();\n    }\n  }\n\n  /** @private */\n  _doResetLayout() {\n    this.classList.add(IS_LAYOUTING);\n    this._resizeStickyHead();\n    this._resizeContainer();\n    this.classList.remove(IS_LAYOUTING);\n  }\n\n  /** @private */\n  _resetLayout() {\n    if (this._preventResetLayout) {\n      return;\n    }\n\n    // Debounce\n    if (this._timeout !== null) {\n      window.clearTimeout(this._timeout);\n    }\n\n    this._timeout = window.setTimeout(() => {\n      this._timeout = null;\n      this._doResetLayout();\n      // Mark table as ready\n      this.classList.add(IS_READY);\n    }, this._wait);\n  }\n\n  /** @private */\n  _resizeStickyHead() {\n    const table = this;\n    const head = table.head;\n    if (head && head.sticky) {\n      getRows([head]).forEach((row) => {\n        getHeaderCells(row).forEach((headerCell) => {\n          table._layoutStickyCell(headerCell, true);\n        });\n      });\n    }\n  }\n\n  /** @private */\n  _resizeContainer() {\n    const table = this;\n    const head = table.head;\n\n    if (head && head.sticky) {\n      let calculatedHeadSize = 0;\n      let previousRowHeight = 0;\n\n      // Reset head layout\n      getRows([head]).forEach((row, i) => {\n        const headerCells = getHeaderCells(row);\n\n        if (headerCells.length) {\n          const computedStyle = window.getComputedStyle(headerCells[0].content);\n          let rowHeight = 0;\n\n          const stickyHeaderCellMinHeight = parseFloat(computedStyle.minHeight);\n          // Divider 'row' or 'cell'  adds a border top\n          const borderTop = parseFloat(computedStyle.borderTopWidth);\n\n          headerCells.forEach((headerCell) => {\n            // Reset to default\n            headerCell.content.style.height = '';\n            // The highest header cell defines the row height\n            rowHeight = Math.max(rowHeight, headerCell.content.getBoundingClientRect().height);\n          });\n\n          // Add the row height to the table head height\n          calculatedHeadSize += rowHeight;\n\n          headerCells.forEach((headerCell) => {\n            // Expand the header cell height to the row height\n            if (rowHeight - borderTop !== stickyHeaderCellMinHeight) {\n              headerCell.content.style.height = `${rowHeight}px`;\n            }\n\n            // Vertically align text in sticky cell by getting the label height\n            if (headerCell.content.textContent.trim().length && !headerCell.content.querySelector('coral-checkbox[coral-table-select]')) {\n              const stickyHeaderCellHeight = headerCell.content.getBoundingClientRect().height;\n              const span = document.createElement('span');\n\n              // Prevents a recursive table relayout that is triggered from changing the header cell content\n              table._preventResetLayout = true;\n\n              while (headerCell.content.firstChild) {\n                span.appendChild(headerCell.content.firstChild);\n              }\n              headerCell.content.appendChild(span);\n\n              const labelHeight = span.getBoundingClientRect().height;\n              const paddingTop = (stickyHeaderCellHeight - labelHeight) / 2;\n\n              while (span.firstChild) {\n                headerCell.content.appendChild(span.firstChild);\n              }\n              headerCell.content.removeChild(span);\n\n              headerCell.content.style.paddingTop = `${paddingTop}px`;\n\n              window.requestAnimationFrame(() => {\n                table._preventResetLayout = false;\n              });\n            }\n\n            // Position the sticky cell\n            previousRowHeight = previousRowHeight || rowHeight;\n            headerCell.content.style.top = `${i > 0 ? previousRowHeight * i + borderTop * (i - 1) : 0}px`;\n          });\n        }\n      });\n\n      const containerComputedStyle = window.getComputedStyle(this._elements.container);\n      const borderTopWidth = parseFloat(containerComputedStyle.borderTopWidth);\n      const borderBottomWidth = parseFloat(containerComputedStyle.borderBottomWidth);\n\n      const containerBorderSize = borderTopWidth + borderBottomWidth;\n      const containerMarginTop = `${calculatedHeadSize}px`;\n      const containerHeight = `calc(100% - ${calculatedHeadSize + containerBorderSize}px)`;\n      this._resetContainerLayout(containerMarginTop, containerHeight);\n    } else {\n      this._resetContainerLayout();\n    }\n  }\n\n  /** @private */\n  _resetContainerLayout(marginTop, height) {\n    this._elements.container.style.marginTop = marginTop || '';\n    this._elements.container.style.height = height || '';\n  }\n\n  /** @private */\n  _resetHiddenColumns(resetLayout) {\n    this.id = this.id || commons.getUID();\n\n    // Delete styles\n    this._elements.hiddenStyle.innerHTML = '';\n\n    // Render styles for each column\n    getColumns(this.columns).forEach((column) => {\n      if (column.hidden) {\n        const columnIndex = getIndexOf(column) + 1;\n\n        this._elements.hiddenStyle.innerHTML += `\n           #${this.id} ._coral-Table-cell:nth-child(${columnIndex}),\n           #${this.id} ._coral-Table-headerCell:nth-child(${columnIndex}) {\n             display: none;\n           }\n        `;\n      }\n    });\n\n    if (resetLayout) {\n      this._resetLayout();\n    }\n  }\n\n  _resetAlignmentColumns() {\n    this.id = this.id || commons.getUID();\n\n    // Delete styles\n    this._elements.alignmentStyle.innerHTML = '';\n\n    getColumns(this.columns).forEach((column) => {\n      const columnAlignment = column.alignment;\n      const columnIndex = getIndexOf(column) + 1;\n\n      this._elements.alignmentStyle.innerHTML += `\n         #${this.id} ._coral-Table-cell:nth-child(${columnIndex}),\n         #${this.id} ._coral-Table-headerCell:nth-child(${columnIndex}) {\n           text-align: ${columnAlignment};\n         }\n      `;\n    });\n  }\n\n  /** @private */\n  _onScroll() {\n    const table = this;\n    const head = table.head;\n\n    // Ignore if only vertical scroll\n    const scrollLeft = table._elements.container.scrollLeft;\n    if (table._lastScrollLeft === scrollLeft) {\n      return;\n    }\n    table._lastScrollLeft = scrollLeft;\n\n    if (head && head.sticky) {\n      // Trigger a reflow that will reposition the sticky cells for FF only.\n      head.style.margin = '1px';\n\n      window.requestAnimationFrame(() => {\n        head.style.margin = '';\n\n        // In other browsers e.g Chrome or IE, we need to adjust the position of the sticky cells manually\n        if (!table._preventLayoutStickyCellOnScroll) {\n          const firstHeaderCell = head.querySelector('tr[is=\"coral-table-row\"] th[is=\"coral-table-headercell\"]');\n\n          if (firstHeaderCell) {\n            // Verify if the sticky cells need to be adjusted. If the first one didn't move, we can assume that they\n            // all need to be adjusted. By default, the left offset is 1px because of the table border.\n            if (table._layoutStickyCellOnScroll || firstHeaderCell.content.offsetLeft === 1) {\n              table._layoutStickyCellOnScroll = true;\n\n              getRows([head]).forEach((row) => {\n                getHeaderCells(row).forEach((headerCell) => {\n                  const paddingLeft = parseFloat(window.getComputedStyle(headerCell).paddingLeft);\n                  headerCell.content.style.marginLeft = `-${scrollLeft + paddingLeft}px`;\n                });\n              });\n            } else {\n              // We don't need to layout the sticky cells manually\n              table._preventLayoutStickyCellOnScroll = true;\n            }\n          }\n        }\n      });\n    }\n  }\n\n  // @compat\n  _toggleSelectionCheckbox(row) {\n    const cells = getContentCells(row);\n    const renderCheckbox = (cell, process) => {\n      // Support cloneNode\n      cell._checkbox = cell._checkbox || cell.querySelector('coral-checkbox');\n\n      // Render checkbox if none\n      if (!cell._checkbox) {\n        cell._checkbox = new Checkbox();\n      }\n\n      process(cell._checkbox);\n\n      // Add checkbox\n      cell.insertBefore(cell._checkbox, cell.firstChild);\n    };\n\n    cells.forEach((cell, i) => {\n      const isRowSelect = i === 0 && cell.hasAttribute('coral-table-rowselect');\n      const isCellSelect = cell.hasAttribute('coral-table-cellselect') || cell.querySelector('coral-checkbox[coral-table-cellselect]');\n\n      if (isRowSelect || isCellSelect) {\n        let handle;\n        if (isRowSelect) {\n          handle = 'coral-table-rowselect';\n        }\n        if (isCellSelect) {\n          handle = 'coral-table-cellselect';\n        }\n\n        renderCheckbox(cell, (checkbox) => {\n          // Define selection handle\n          if (isRowSelect) {\n            cell.classList.add('_coral-Table-cell--check');\n            cell.removeAttribute(handle);\n            checkbox.setAttribute(handle, '');\n          } else {\n            cell.setAttribute(handle, '');\n            checkbox.removeAttribute(handle);\n          }\n\n          // Sync selection\n          const isSelected = (isRowSelect ? row : cell).hasAttribute('selected');\n          checkbox[isSelected ? 'setAttribute' : 'removeAttribute']('checked', '');\n        });\n      }\n    });\n  }\n\n  /** @private */\n  _setHeaderCellScope(headerCell, tableSection) {\n    // Add appropriate scope depending on whether header cell is in THEAD or TBODY\n    const scope = tableSection.nodeName === 'THEAD' || tableSection.nodeName === 'TFOOT' ? 'col' : 'row';\n    if (scope === 'col') {\n      headerCell.setAttribute('role', 'columnheader');\n    } else {\n      headerCell.setAttribute('role', 'rowheader');\n    }\n    headerCell.setAttribute('scope', scope);\n\n    if(headerCell.hasAttribute('sortable') && headerCell.content){\n      headerCell.content.setAttribute('role', 'button');\n    }\n  }\n\n  /**  @private */\n  _handleMutations(mutations) {\n    mutations.forEach((mutation) => {\n      // Sync added nodes\n      for (let k = 0 ; k < mutation.addedNodes.length ; k++) {\n        const addedNode = mutation.addedNodes[k];\n\n        if (isTableBody(addedNode)) {\n          this._onBodyContentChanged({\n            target: addedNode,\n            detail: {\n              addedNodes: getRows([addedNode]),\n              removedNodes: []\n            }\n          });\n        }\n      }\n\n      // Sync removed nodes\n      for (let k = 0 ; k < mutation.removedNodes.length ; k++) {\n        const removedNode = mutation.removedNodes[k];\n\n        if (isTableBody(removedNode)) {\n          // Always make sure there's a body content zone\n          if (!this.body) {\n            this.body = new TableBody();\n          }\n\n          this._onBodyContentChanged({\n            target: removedNode,\n            detail: {\n              addedNodes: [],\n              removedNodes: getRows([removedNode])\n            }\n          });\n        }\n      }\n    });\n\n    this._resetLayout();\n  }\n\n  _getSelectableItems() {\n    return this.items._getSelectableItems().filter(item => !item.querySelector('[coral-table-rowselect][disabled]'));\n  }\n\n  _toggleObserver(enable) {\n    this._observer = this._observer || new MutationObserver(this._handleMutations.bind(this));\n\n    if (enable) {\n      this._observer.observe(this, {\n        childList: true,\n        subtree: true\n      });\n    } else {\n      this._observer.disconnect();\n    }\n  }\n\n  get _contentZones() {\n    return {\n      tbody: 'body',\n      thead: 'head',\n      tfoot: 'foot',\n      colgroup: 'columns'\n    };\n  }\n\n  /**\n   Returns {@link Table} variants.\n\n   @return {TableVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /**\n   Returns divider options for {@link TableHead}, {@link TableBody} and {@link TableFoot}.\n\n   @return {TableSectionDividerEnum}\n   */\n  static get divider() {\n    return divider;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      labelledby: 'labelledBy'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'selectable', 'orderable', 'labelled', 'labelledby', 'multiple', 'lockable']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Wrapper should have role=\"presentation\" because it wraps another table\n    this.setAttribute('role', 'presentation');\n\n    // Default reflected attribute\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    const head = this._elements.head;\n    const body = this._elements.body;\n    const foot = this._elements.foot;\n    const columns = this._elements.columns;\n\n    // Disable observer while rendering template\n    this._toggleObserver(false);\n    this._elements.head.setAttribute('_observe', 'off');\n    this._elements.body.setAttribute('_observe', 'off');\n\n    // Render template\n    const frag = document.createDocumentFragment();\n    frag.appendChild(this._elements.container);\n    frag.appendChild(this._elements.liveRegion);\n\n    // cloneNode support\n    const wrapper = this.querySelector('._coral-Table-wrapper-container');\n    if (wrapper) {\n      wrapper.remove();\n    }\n\n    let liveRegion = this.querySelector('._coral-Table-liveRegion');\n    if (liveRegion) {\n      liveRegion.remove();\n    }\n\n    // Append frag\n    this.appendChild(frag);\n\n    // Call content zone inserts\n    this.head = head;\n    this.body = body;\n    this.foot = foot;\n    this.columns = columns;\n\n    // Set header cell scope\n    getRows([this._elements.table]).forEach((row) => {\n      getHeaderCells(row).forEach((headerCell) => {\n        this._setHeaderCellScope(headerCell, row.parentNode);\n      });\n    });\n\n    // With a thead and tfoot,\n    if (this.head && this.foot) {\n      const headRows = getRows([this.head]);\n      const footRows = getRows([this.foot]);\n      // if the number of rows in the thead and tfoot match\n      if (headRows.length === footRows.length) {\n        let redundantFooter = true;\n        // and the textContent of each thead header cell matches the textContent of each tfoot header cell in the same column\n        headRows.forEach((row, rowIndex) => getHeaderCells(row).forEach((headerCell, cellIndex) => {\n          const footerCell = getHeaderCells(footRows[rowIndex])[cellIndex];\n          if (!footerCell || headerCell.textContent.trim() !== footerCell.textContent.trim()) {\n            redundantFooter = false;\n          }\n        }));\n        // the tfoot is redundant and should be hidden to prevent double or triple voicing of table headers.\n        if (redundantFooter) {\n          this.foot.setAttribute('aria-hidden', 'true');\n        }\n      }\n    }\n\n    // Detect table size changes\n    commons.addResizeListener(this, this._resetLayout);\n\n    // Disable table features if no items.\n    const items = this._getSelectableItems();\n    this._toggleInteractivity(items.length === 0);\n\n    // Sync selection state\n    if (this.selectable) {\n      const selectedItems = this.selectedItems;\n\n      // Sync select all handle if any\n      this._syncSelectAllHandle(selectedItems, items);\n\n      // Sync used collections\n      if (selectedItems.length) {\n        this._oldSelection = selectedItems;\n        this._lastSelectedItems.items = selectedItems;\n      }\n    }\n\n    // Sync sorted\n    this._allowSorting = true;\n    const column = this._isSorted();\n    if (column) {\n      column._doSort && column._doSort(true);\n    }\n\n    // @compat\n    if (this.body) {\n      const rows = getRows([this.body]);\n      // Use the first column as selection column\n      rows.forEach(row => this._toggleSelectionCheckbox(row));\n    }\n\n    // Enable observer again\n    this._toggleObserver(true);\n\n    // Mark table as ready\n    if (!this.head || this.head && !this.head.hasAttribute('sticky')) {\n      this.classList.add(IS_READY);\n    }\n  }\n\n  /**\n   Triggered before a {@link Table} column gets sorted by user interaction. Can be used to cancel column sorting and define\n   custom sorting.\n\n   @typedef {CustomEvent} coral-table:beforecolumnsort\n\n   @property {TableColumn} detail.column\n   The column to be sorted.\n   @property {String} detail.direction\n   The requested sorting direction for the column.\n   */\n\n  /**\n   Triggered when a {@link Table} column is sorted.\n\n   @typedef {CustomEvent} coral-table:columnsort\n\n   @param {TableColumn} detail.column\n   The sorted column.\n   */\n\n  /**\n   Triggered before a {@link Table} column is dragged. Can be used to cancel column dragging.\n\n   @typedef {CustomEvent} coral-table:beforecolumndrag\n\n   @property {TableColumn} detail.column\n   The dragged column.\n   @property {TableColumn} detail.before\n   The column will be inserted before this sibling column.\n   If <code>null</code>, the column is inserted at the end.\n   */\n\n  /**\n   Triggered when a {@link Table} column is dragged.\n\n   @typedef {CustomEvent} coral-table:columndrag\n\n   @property {TableColumn} detail.column\n   The dragged column.\n   @property {TableColumn} detail.oldBefore\n   The column next sibling before the swap.\n   If <code>null</code>, the column was the last item.\n   @property {TableColumn} detail.before\n   The column is inserted before this sibling column.\n   If <code>null</code>, the column is inserted at the end.\n   */\n\n  /**\n   Triggered before a {@link Table} row is ordered. Can be used to cancel row ordering.\n\n   @typedef {CustomEvent} coral-table:beforeroworder\n\n   @property {TableRow} detail.row\n   The row to be ordered.\n   @property {TableRow} detail.before\n   The row will be inserted before this sibling row.\n   If <code>null</code>, the row is inserted at the end.\n   */\n\n  /**\n   Triggered when a {@link Table} row is ordered.\n\n   @typedef {CustomEvent} coral-table:roworder\n\n   @property {TableRow} detail.row\n   The ordered row.\n   @property {TableRow} detail.oldBefore\n   The row next sibling before the swap.\n   If <code>null</code>, the row was the last item.\n   @param {TableRow} detail.before\n   The row is inserted before this sibling row.\n   If <code>null</code>, the row is inserted at the end.\n   */\n\n  /**\n   Triggered when a {@linked Table} row is locked.\n\n   @typedef {CustomEvent} coral-table:rowlock\n\n   @property {TableRow} detail.row\n   The locked row.\n   */\n\n  /**\n   Triggered when {@link Table} a row is locked.\n\n   @typedef {CustomEvent} coral-table:rowunlock\n\n   @property {TableRow} detail.row\n   The unlocked row.\n   */\n\n  /**\n   Triggered when a {@link Table} row selection changed.\n\n   @typedef {CustomEvent} coral-table:rowchange\n\n   @property {Array.<TableCell>} detail.oldSelection\n   The old item selection. When {@link TableRow#multiple}, it includes an Array.\n   @property {Array.<TableCell>} detail.selection\n   The item selection. When {@link Coral.Table.Row#multiple}, it includes an Array.\n   @property {TableRow} detail.row\n   The targeted row.\n   */\n\n  /**\n   Triggered when the {@link Table} selection changed.\n\n   @typedef {CustomEvent} coral-table:change\n\n   @property {Array.<TableRow>} detail.oldSelection\n   The old item selection. When {@link Table#multiple}, it includes an Array.\n   @property {Array.<TableRow>} detail.selection\n   The item selection. When {@link Table#multiple}, it includes an Array.\n   */\n});\n\nexport default Table;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/Table.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 1976,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 43,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1977,
    "kind": "typedef",
    "name": "TableVariantEnum",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~TableVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Table} variants",
    "lineNumber": 57,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default table."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A quiet table with transparent borders and background."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LIST",
        "description": "Not supported. Falls back to DEFAULT."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TableVariantEnum"
    }
  },
  {
    "__docId__": 1978,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1979,
    "kind": "variable",
    "name": "IS_DISABLED",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_DISABLED",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 68,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1980,
    "kind": "variable",
    "name": "IS_SORTED",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_SORTED",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 69,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1981,
    "kind": "variable",
    "name": "IS_UNSELECTABLE",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_UNSELECTABLE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 70,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1982,
    "kind": "variable",
    "name": "IS_FIRST_ITEM_DRAGGED",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_FIRST_ITEM_DRAGGED",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 71,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1983,
    "kind": "variable",
    "name": "IS_LAST_ITEM_DRAGGED",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_LAST_ITEM_DRAGGED",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 72,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1984,
    "kind": "variable",
    "name": "IS_DRAGGING_CLASS",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_DRAGGING_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 73,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1985,
    "kind": "variable",
    "name": "IS_BEFORE_CLASS",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_BEFORE_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 74,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1986,
    "kind": "variable",
    "name": "IS_AFTER_CLASS",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_AFTER_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 75,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1987,
    "kind": "variable",
    "name": "IS_LAYOUTING",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_LAYOUTING",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 76,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1988,
    "kind": "variable",
    "name": "IS_READY",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~IS_READY",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 77,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1989,
    "kind": "variable",
    "name": "KEY_SPACE",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~KEY_SPACE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 78,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 1990,
    "kind": "variable",
    "name": "Table",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~Table",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table component is a container component to display and manipulate data in two dimensions.\nTo define table actions on specific elements, handles can be used.\nA handle is given a special attribute :\n- <code>[coral-table-select]</code>. Select/unselect all table items.\n- <code>[coral-table-rowselect]</code>. Select/unselect the table item.\n- <code>[coral-table-roworder]</code>. Drag to order the table item.\n- <code>[coral-table-rowlock]</code>. Lock/unlock the table item.",
    "lineNumber": 94,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table component is a container component to display and manipulate data in two dimensions.\nTo define table actions on specific elements, handles can be used.\nA handle is given a special attribute :\n- <code>[coral-table-select]</code>. Select/unselect all table items.\n- <code>[coral-table-rowselect]</code>. Select/unselect the table item.\n- <code>[coral-table-roworder]</code>. Drag to order the table item.\n- <code>[coral-table-rowlock]</code>. Lock/unlock the table item."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "table"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<table is=\"coral-table\"></table>",
      "<caption>JS constructor</caption>\nnew Coral.Table();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 1991,
    "kind": "typedef",
    "name": "coral-table:beforecolumnsort",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:beforecolumnsort",
    "access": "public",
    "description": "Triggered before a {@link Table} column gets sorted by user interaction. Can be used to cancel column sorting and define\ncustom sorting.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The column to be sorted."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.direction",
        "description": "The requested sorting direction for the column."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:beforecolumnsort"
    }
  },
  {
    "__docId__": 1992,
    "kind": "typedef",
    "name": "coral-table:columnsort",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:columnsort",
    "access": "public",
    "description": "Triggered when a {@link Table} column is sorted.",
    "params": [
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The sorted column."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:columnsort"
    }
  },
  {
    "__docId__": 1993,
    "kind": "typedef",
    "name": "coral-table:beforecolumndrag",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:beforecolumndrag",
    "access": "public",
    "description": "Triggered before a {@link Table} column is dragged. Can be used to cancel column dragging.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The dragged column."
      },
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "The column will be inserted before this sibling column.\nIf <code>null</code>, the column is inserted at the end."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:beforecolumndrag"
    }
  },
  {
    "__docId__": 1994,
    "kind": "typedef",
    "name": "coral-table:columndrag",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:columndrag",
    "access": "public",
    "description": "Triggered when a {@link Table} column is dragged.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.column",
        "description": "The dragged column."
      },
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldBefore",
        "description": "The column next sibling before the swap.\nIf <code>null</code>, the column was the last item."
      },
      {
        "nullable": null,
        "types": [
          "TableColumn"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "The column is inserted before this sibling column.\nIf <code>null</code>, the column is inserted at the end."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:columndrag"
    }
  },
  {
    "__docId__": 1995,
    "kind": "typedef",
    "name": "coral-table:beforeroworder",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:beforeroworder",
    "access": "public",
    "description": "Triggered before a {@link Table} row is ordered. Can be used to cancel row ordering.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.row",
        "description": "The row to be ordered."
      },
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "The row will be inserted before this sibling row.\nIf <code>null</code>, the row is inserted at the end."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:beforeroworder"
    }
  },
  {
    "__docId__": 1996,
    "kind": "typedef",
    "name": "coral-table:roworder",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:roworder",
    "access": "public",
    "description": "Triggered when a {@link Table} row is ordered.",
    "params": [
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.before",
        "description": "The row is inserted before this sibling row.\nIf <code>null</code>, the row is inserted at the end."
      }
    ],
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.row",
        "description": "The ordered row."
      },
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldBefore",
        "description": "The row next sibling before the swap.\nIf <code>null</code>, the row was the last item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:roworder"
    }
  },
  {
    "__docId__": 1997,
    "kind": "typedef",
    "name": "coral-table:rowlock",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:rowlock",
    "access": "public",
    "description": "Triggered when a {@linked Table} row is locked.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.row",
        "description": "The locked row."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:rowlock"
    }
  },
  {
    "__docId__": 1998,
    "kind": "typedef",
    "name": "coral-table:rowunlock",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:rowunlock",
    "access": "public",
    "description": "Triggered when {@link Table} a row is locked.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.row",
        "description": "The unlocked row."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:rowunlock"
    }
  },
  {
    "__docId__": 1999,
    "kind": "typedef",
    "name": "coral-table:rowchange",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:rowchange",
    "access": "public",
    "description": "Triggered when a {@link Table} row selection changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Array.<TableCell>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The old item selection. When {@link TableRow#multiple}, it includes an Array."
      },
      {
        "nullable": null,
        "types": [
          "Array.<TableCell>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The item selection. When {@link Coral.Table.Row#multiple}, it includes an Array."
      },
      {
        "nullable": null,
        "types": [
          "TableRow"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.row",
        "description": "The targeted row."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:rowchange"
    }
  },
  {
    "__docId__": 2000,
    "kind": "typedef",
    "name": "coral-table:change",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/Table.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/Table.js~coral-table:change",
    "access": "public",
    "description": "Triggered when the {@link Table} selection changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Array.<TableRow>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The old item selection. When {@link Table#multiple}, it includes an Array."
      },
      {
        "nullable": null,
        "types": [
          "Array.<TableRow>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The item selection. When {@link Table#multiple}, it includes an Array."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table:change"
    }
  },
  {
    "__docId__": 2001,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseTableSection from './BaseTableSection';\nimport {getRows} from './TableUtil';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-body';\n\n/**\n @class Coral.Table.Body\n @classdesc A Table body component\n @htmltag coral-table-body\n @htmlbasetag tbody\n @extends {HTMLTableSectionElement}\n @extends {BaseComponent}\n @extends {BaseTableSection}\n */\nconst TableBody = Decorator(class extends BaseTableSection(BaseComponent(HTMLTableSectionElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._toggleObserver(true);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    if (getRows([this]).length === 0) {\n      this.trigger('coral-table-body:_empty');\n    }\n  }\n\n  /**\n   Triggered when the {@link TableBody} content changed.\n\n   @typedef {CustomEvent} coral-table-body:_contentchanged\n\n   @private\n   */\n\n  /**\n   Triggered when the {@link TableBody} is initialized without rows.\n\n   @typedef {CustomEvent} coral-table-body:_empty\n\n   @private\n   */\n});\n\nexport default TableBody;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2002,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableBody.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2003,
    "kind": "variable",
    "name": "TableBody",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableBody.js~TableBody",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table body component",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Body"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table body component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-body"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "tbody"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableSectionElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseTableSection}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<tbody is=\"coral-table-body\"></tbody>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Body();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2004,
    "kind": "typedef",
    "name": "coral-table-body:_contentchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableBody.js~coral-table-body:_contentchanged",
    "access": "private",
    "description": "Triggered when the {@link TableBody} content changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-body:_contentchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2005,
    "kind": "typedef",
    "name": "coral-table-body:_empty",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableBody.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableBody.js~coral-table-body:_empty",
    "access": "private",
    "description": "Triggered when the {@link TableBody} is initialized without rows.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-body:_empty"
    },
    "ignore": true
  },
  {
    "__docId__": 2006,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {commons, transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-cell';\n\n/**\n @class Coral.Table.Cell\n @classdesc A Table cell component\n @htmltag coral-table-cell\n @htmlbasetag td\n @extends {HTMLTableCellElement}\n @extends {BaseComponent}\n */\nconst TableCell = Decorator(class extends BaseComponent(HTMLTableCellElement) {\n  // @compat\n  get content() {\n    return this;\n  }\n\n  set content(value) {\n    // Support configs\n    if (typeof value === 'object') {\n      for (const prop in value) {\n        /** @ignore */\n        this[prop] = value[prop];\n      }\n    }\n  }\n\n  /**\n   Whether the table cell is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    // Prevent selection if disabled\n    if (this.hasAttribute('coral-table-cellselect') && this.hasAttribute('disabled') ||\n      this.querySelector('[coral-table-cellselect][disabled]')) {\n      return;\n    }\n\n    this.trigger('coral-table-cell:_beforeselectedchanged');\n\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.trigger('coral-table-cell:_selectedchanged');\n\n    this._syncAriaSelectedState();\n    this._syncSelectHandle();\n  }\n\n  /**\n   The cell's value. It is used to compare cells during a column sort. If not set, the sorting will be performed on the\n   cell content. The content will be parse accordingly based on the column's <code>sortabletype</code> property.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return this.getAttribute('value') || '';\n  }\n\n  set value(value) {\n    this.setAttribute('value', transform.string(value));\n  }\n\n  /** @private */\n  _setHandle(handle) {\n    requestAnimationFrame(() => {\n      // Specify handle directly on the cell if none found\n      if (!this.querySelector(`[${handle}]`)) {\n        this.setAttribute(handle, '');\n      }\n      this._syncAriaSelectedState();\n      this._syncSelectHandle();\n    });\n  }\n\n  /** @private */\n  _getHandle(handle) {\n    return this.hasAttribute(handle) ? this : this.querySelector(`[${handle}]`);\n  }\n\n  /** @private */\n  _toggleSelectable(selectable) {\n    if (selectable) {\n      this._setHandle('coral-table-cellselect');\n    } else {\n      // Remove the handle\n      this.removeAttribute('coral-table-cellselect');\n\n      // Clear selection\n      this.selected = false;\n    }\n\n    this._syncAriaSelectedState();\n  }\n\n  /** @private */\n  _syncAriaSelectedState() {\n    this.classList.toggle('is-selected', this.selected);\n    if (this._getHandle('coral-table-cellselect')) {\n      this.setAttribute('aria-selected', this.selected);\n    } else {\n      this.removeAttribute('aria-selected');\n    }\n  }\n\n  /** @private */\n  _syncSelectHandle() {\n    // Check/uncheck the select handle\n    const selectHandle = this.querySelector('coral-checkbox');\n    if (selectHandle) {\n      selectHandle[this.selected ? 'setAttribute' : 'removeAttribute']('checked', '');\n    }\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', '_selectable']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_selectable') {\n      this._toggleSelectable(value !== null);\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this.id = this.id || commons.getUID();\n  }\n\n  /**\n   Triggered before {@link TableCell#selected} is changed.\n\n   @typedef {CustomEvent} coral-table-cell:_beforeselectedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableCell#selected} changed.\n\n   @typedef {CustomEvent} coral-table-cell:_selectedchanged\n\n   @private\n   */\n});\n\nexport default TableCell;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2007,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableCell.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2008,
    "kind": "variable",
    "name": "TableCell",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableCell.js~TableCell",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table cell component",
    "lineNumber": 27,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Cell"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table cell component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-cell"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "td"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableCellElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<td is=\"coral-table-cell\"></td>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Cell();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2009,
    "kind": "typedef",
    "name": "coral-table-cell:_beforeselectedchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableCell.js~coral-table-cell:_beforeselectedchanged",
    "access": "private",
    "description": "Triggered before {@link TableCell#selected} is changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-cell:_beforeselectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2010,
    "kind": "typedef",
    "name": "coral-table-cell:_selectedchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableCell.js~coral-table-cell:_selectedchanged",
    "access": "private",
    "description": "Triggered when {@link TableCell#selected} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-cell:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2011,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {alignment} from './TableUtil';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-column';\n\n/**\n Enumeration for {@link TableColumn} sortable direction options.\n\n @typedef {Object} TableColumnSortableDirectionEnum\n\n @property {String} DEFAULT\n Default. No sorting applied.\n @property {String} ASCENDING\n Ascending sort.\n @property {String} DESCENDING\n Descending sort.\n */\nconst sortableDirection = {\n  DEFAULT: 'default',\n  ASCENDING: 'ascending',\n  DESCENDING: 'descending'\n};\n\n/**\n Enumeration for {@link TableColumn} sortable type options.\n\n @typedef {Object} TableColumnSortableTypeEnum\n\n @property {String} ALPHANUMERIC\n Alphanumeric type. If sorting is based on {@link TableCell#value}, use {String}.\n @property {String} NUMBER\n Number type. If sorting is based on {@link TableCell#value}, use {Number}.\n @property {String} DATE\n Date type. If sorting is based on {@link TableCell#value}, use {Date} in milliseconds.\n @property {String} CUSTOM\n Custom type. Sorting is based on user defined sorting.\n */\nconst sortableType = {\n  ALPHANUMERIC: 'alphanumeric',\n  NUMBER: 'number',\n  DATE: 'date',\n  CUSTOM: 'custom'\n};\n\n/**\n @class Coral.Table.Column\n @classdesc A Table column component\n @htmltag coral-table-column\n @htmlbasetag col\n @extends {HTMLTableColElement}\n @extends {BaseComponent}\n */\nconst TableColumn = Decorator(class extends BaseComponent(HTMLTableColElement) {\n  /**\n   The column cells alignment. The alignment should take the {@link i18n} configuration into account.\n\n   @type {String}\n   @default TableColumnAlignmentEnum.LEFT\n   @htmlattribute alignment\n   @htmlattributereflected\n   */\n  get alignment() {\n    return this._alignment || alignment.LEFT;\n  }\n\n  set alignment(value) {\n    const oldValue = this._alignment;\n\n    value = transform.string(value).toLowerCase();\n    this._alignment = validate.enumeration(alignment)(value) && value || alignment.LEFT;\n    this._reflectAttribute('alignment', this._alignment);\n\n    // Don't trigger on initialization if alignment is LEFT to improve performance\n    if (!(typeof oldValue === 'undefined' && this._alignment === alignment.LEFT)) {\n      window.requestAnimationFrame(() => {\n        this.trigger('coral-table-column:_alignmentchanged');\n      });\n    }\n  }\n\n  /**\n   Whether the column has a fixed width.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute fixedwidth\n   @htmlattributereflected\n   */\n  get fixedWidth() {\n    return this._fixedWidth || false;\n  }\n\n  set fixedWidth(value) {\n    this._fixedWidth = transform.booleanAttr(value);\n    this._reflectAttribute('fixedwidth', this._fixedWidth);\n\n    window.requestAnimationFrame(() => {\n      this.trigger('coral-table-column:_fixedwidthchanged');\n    });\n  }\n\n  /**\n   Whether the column is hidden.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute hidden\n   @htmlattributereflected\n   */\n  get hidden() {\n    return this._hidden || false;\n  }\n\n  set hidden(value) {\n    this._hidden = transform.booleanAttr(value);\n    this._reflectAttribute('hidden', this._hidden);\n\n    window.requestAnimationFrame(() => {\n      this.trigger('coral-table-column:_hiddenchanged');\n    });\n  }\n\n  /**\n   Whether the table column is orderable.\n   Note that this does not affect the underlying data, only presentation.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute orderable\n   @htmlattributereflected\n   */\n  get orderable() {\n    return this._orderable || false;\n  }\n\n  set orderable(value) {\n    this._orderable = transform.booleanAttr(value);\n    this._reflectAttribute('orderable', this._orderable);\n\n    window.requestAnimationFrame(() => {\n      this.trigger('coral-table-column:_orderablechanged');\n    });\n  }\n\n  /**\n   Whether the column is sortable by user interaction.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute sortable\n   @htmlattributereflected\n   */\n  get sortable() {\n    return this._sortable || false;\n  }\n\n  set sortable(value) {\n    this._sortable = transform.booleanAttr(value);\n    this._reflectAttribute('sortable', this._sortable);\n\n    window.requestAnimationFrame(() => {\n      this.trigger('coral-table-column:_sortablechanged');\n    });\n  }\n\n  /**\n   The sorting type. See {@link TableColumnSortableTypeEnum}. If setting to <code>custom</code>, columns won't sort\n   based on the default table sorting.\n   Instead, a custom sorting can be performed when triggered by user interaction. This can be defined by listening to\n   the {@link coral-table:beforecolumnsort} event.\n\n   @type {String}\n   @default TableColumnSortableTypeEnum.ALPHANUMERIC\n   @htmlattribute sortabletype\n   @htmlattributereflected\n   */\n  get sortableType() {\n    return this._sortableType || sortableType.ALPHANUMERIC;\n  }\n\n  set sortableType(value) {\n    value = transform.string(value).toLowerCase();\n    this._sortableType = validate.enumeration(sortableType)(value) && value || sortableType.ALPHANUMERIC;\n    this._reflectAttribute('sortabletype', this._sortableType);\n  }\n\n  /**\n   The sorting direction. Sorts the column cells based on {@link TableCell#value}.\n   If not present, the sort is based on the cell text content. See {@link TableColumnSortableDirectionEnum}.\n\n   @type {String}\n   @default TableColumnSortableDirectionEnum.DEFAULT\n   @htmlattribute sortabledirection\n   @htmlattributereflected\n   */\n  get sortableDirection() {\n    return this._sortableDirection || sortableDirection.DEFAULT;\n  }\n\n  set sortableDirection(value) {\n    value = transform.string(value).toLowerCase();\n    this._sortableDirection = validate.enumeration(sortableDirection)(value) && value || sortableDirection.DEFAULT;\n    this._reflectAttribute('sortabledirection', this._sortableDirection);\n\n    // Prevent sorting if unnecessary\n    if (!this._preventSort) {\n      this._doSort();\n\n      window.requestAnimationFrame(() => {\n        this.trigger('coral-table-column:_sortabledirectionchanged');\n      });\n    }\n  }\n\n  /** @private */\n  _sort() {\n    let newSortableDirection;\n    if (this.sortableDirection === sortableDirection.DEFAULT) {\n      newSortableDirection = sortableDirection.ASCENDING;\n    } else if (this.sortableDirection === sortableDirection.ASCENDING) {\n      newSortableDirection = sortableDirection.DESCENDING;\n    } else if (this.sortableDirection === sortableDirection.DESCENDING) {\n      newSortableDirection = sortableDirection.DEFAULT;\n    }\n\n    this.trigger('coral-table-column:_beforecolumnsort', {newSortableDirection});\n  }\n\n  /** @private */\n  _doSort(onInitialization) {\n    this.trigger('coral-table-column:_sort', {onInitialization, sortableDirection, sortableType});\n  }\n\n  /**\n   Returns {@link TableColumn} sortable direction options.\n\n   @return {TableColumnSortableDirectionEnum}\n   */\n  static get sortableDirection() {\n    return sortableDirection;\n  }\n\n  /**\n   Returns {@link TableColumn} sortable type options.\n\n   @return {TableColumnSortableTypeEnum}\n   */\n  static get sortableType() {\n    return sortableType;\n  }\n\n  /**\n   Returns {@link TableColumn} alignment options.\n\n   @return {TableColumnAlignmentEnum}\n   */\n  static get alignment() {\n    return alignment;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      fixedwidth: 'fixedWidth',\n      sortabletype: 'sortableType',\n      sortabledirection: 'sortableDirection'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'fixedwidth',\n      'hidden',\n      'alignment',\n      'orderable',\n      'sortable',\n      'sortabletype',\n      'sortabledirection',\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._sortableType) {\n      this.sortableType = sortableType.ALPHANUMERIC;\n    }\n    if (!this._sortableDirection) {\n      this.sortableDirection = sortableDirection.DEFAULT;\n    }\n    if (!this._alignment) {\n      this.alignment = alignment.LEFT;\n    }\n  }\n\n  /**\n   Triggered when {@link TableColumn#alignment} changed.\n\n   @typedef {CustomEvent} coral-table-column:_alignmentchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#fixedWidth} changed.\n\n   @typedef {CustomEvent} coral-table-column:_fixedwidthchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#orderable} changed.\n\n   @typedef {CustomEvent} coral-table-column:_orderablechanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#sortable} changed.\n\n   @typedef {CustomEvent} coral-table-column:_sortablechanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#sortableDirection} changed.\n\n   @typedef {CustomEvent} coral-table-column:_sortabledirectionchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#hidden} changed.\n\n   @typedef {CustomEvent} coral-table-column:_hiddenchanged\n\n   @private\n   */\n\n  /**\n   Triggered before {@link TableColumn#sortableDirection} changed.\n\n   @typedef {CustomEvent} coral-table-column:_beforecolumnsort\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableColumn#sortableDirection} changed.\n\n   @typedef {CustomEvent} coral-table-column:_sort\n\n   @private\n   */\n});\n\nexport default TableColumn;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2012,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2013,
    "kind": "typedef",
    "name": "TableColumnSortableDirectionEnum",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~TableColumnSortableDirectionEnum",
    "access": "public",
    "description": "Enumeration for {@link TableColumn} sortable direction options.",
    "lineNumber": 32,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "Default. No sorting applied."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ASCENDING",
        "description": "Ascending sort."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DESCENDING",
        "description": "Descending sort."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TableColumnSortableDirectionEnum"
    }
  },
  {
    "__docId__": 2014,
    "kind": "typedef",
    "name": "TableColumnSortableTypeEnum",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~TableColumnSortableTypeEnum",
    "access": "public",
    "description": "Enumeration for {@link TableColumn} sortable type options.",
    "lineNumber": 52,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ALPHANUMERIC",
        "description": "Alphanumeric type. If sorting is based on {@link TableCell#value}, use {String}."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NUMBER",
        "description": "Number type. If sorting is based on {@link TableCell#value}, use {Number}."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DATE",
        "description": "Date type. If sorting is based on {@link TableCell#value}, use {Date} in milliseconds."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CUSTOM",
        "description": "Custom type. Sorting is based on user defined sorting."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TableColumnSortableTypeEnum"
    }
  },
  {
    "__docId__": 2015,
    "kind": "variable",
    "name": "TableColumn",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~TableColumn",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table column component",
    "lineNumber": 67,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Column"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table column component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-column"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "col"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableColElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<col is=\"coral-table-column\"></col>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Column();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2016,
    "kind": "typedef",
    "name": "coral-table-column:_alignmentchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_alignmentchanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#alignment} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_alignmentchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2017,
    "kind": "typedef",
    "name": "coral-table-column:_fixedwidthchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_fixedwidthchanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#fixedWidth} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_fixedwidthchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2018,
    "kind": "typedef",
    "name": "coral-table-column:_orderablechanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_orderablechanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#orderable} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_orderablechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2019,
    "kind": "typedef",
    "name": "coral-table-column:_sortablechanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_sortablechanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#sortable} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_sortablechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2020,
    "kind": "typedef",
    "name": "coral-table-column:_sortabledirectionchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_sortabledirectionchanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#sortableDirection} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_sortabledirectionchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2021,
    "kind": "typedef",
    "name": "coral-table-column:_hiddenchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_hiddenchanged",
    "access": "private",
    "description": "Triggered when {@link TableColumn#hidden} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_hiddenchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2022,
    "kind": "typedef",
    "name": "coral-table-column:_beforecolumnsort",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_beforecolumnsort",
    "access": "private",
    "description": "Triggered before {@link TableColumn#sortableDirection} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_beforecolumnsort"
    },
    "ignore": true
  },
  {
    "__docId__": 2023,
    "kind": "typedef",
    "name": "coral-table-column:_sort",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableColumn.js~coral-table-column:_sort",
    "access": "private",
    "description": "Triggered when {@link TableColumn#sortableDirection} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-column:_sort"
    },
    "ignore": true
  },
  {
    "__docId__": 2024,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableFoot.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseTableSection from './BaseTableSection';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-foot';\n\n/**\n @class Coral.Table.Foot\n @classdesc A Table foot component\n @htmltag coral-table-foot\n @htmlbasetag tfoot\n @extends {HTMLTableSectionElement}\n @extends {BaseComponent}\n @extends {BaseTableSection}\n */\nconst TableFoot = Decorator(class extends BaseTableSection(BaseComponent(HTMLTableSectionElement)) {\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n});\n\nexport default TableFoot;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableFoot.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2025,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableFoot.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableFoot.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2026,
    "kind": "variable",
    "name": "TableFoot",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableFoot.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableFoot.js~TableFoot",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table foot component",
    "lineNumber": 28,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Foot"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table foot component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-foot"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "tfoot"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableSectionElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseTableSection}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<tfoot is=\"coral-table-foot\"></tfoot>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Foot();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2027,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport BaseTableSection from './BaseTableSection';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-head';\n\n/**\n @class Coral.Table.Head\n @classdesc A Table head component\n @htmltag coral-table-head\n @htmlbasetag thead\n @extends {HTMLTableSectionElement}\n @extends {BaseComponent}\n @extends {BaseTableSection}\n */\nconst TableHead = Decorator(class extends BaseTableSection(BaseComponent(HTMLTableSectionElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._toggleObserver(true);\n  }\n\n  /**\n   Whether the table head is sticky. The table content becomes automatically scrollable if the table wrapper height\n   is smaller than its content.\n   Table exposes the <code>coral-table-scroll</code> attribute that allows in sticky mode to define the table\n   scrolling container max-height. This is particularly useful if the table contains dynamic content.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute sticky\n   @htmlattributereflected\n   */\n  get sticky() {\n    return this._sticky || false;\n  }\n\n  set sticky(value) {\n    this._sticky = transform.booleanAttr(value);\n    this._reflectAttribute('sticky', this._sticky);\n\n    // Delay execution for better performance\n    window.requestAnimationFrame(() => {\n      this.trigger('coral-table-head:_stickychanged');\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['sticky']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n  }\n\n  /**\n   Triggered when the {@link TableHead} content changed.\n\n   @typedef {CustomEvent} coral-table-head:_contentchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableHead#sticky} changed.\n\n   @typedef {CustomEvent} coral-table-head:_stickychanged\n\n   @private\n   */\n});\n\nexport default TableHead;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2028,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHead.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2029,
    "kind": "variable",
    "name": "TableHead",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHead.js~TableHead",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table head component",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Head"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table head component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-head"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "thead"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableSectionElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseTableSection}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<thead is=\"coral-table-head\"></thead>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Head();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2030,
    "kind": "typedef",
    "name": "coral-table-head:_contentchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHead.js~coral-table-head:_contentchanged",
    "access": "private",
    "description": "Triggered when the {@link TableHead} content changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-head:_contentchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2031,
    "kind": "typedef",
    "name": "coral-table-head:_stickychanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHead.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHead.js~coral-table-head:_stickychanged",
    "access": "private",
    "description": "Triggered when {@link TableHead#sticky} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-head:_stickychanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2032,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-headerCell';\n\n/**\n @class Coral.Table.HeaderCell\n @classdesc A Table header cell component\n @htmltag coral-table-headercell\n @htmlbasetag th\n @extends {HTMLTableCellElement}\n @extends {BaseComponent}\n */\nconst TableHeaderCell = Decorator(class extends BaseComponent(HTMLTableCellElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      content: this.querySelector('coral-table-headercell-content') || document.createElement('coral-table-headercell-content')\n    };\n\n    // Watch for content changes in sticky header cell\n    this._stickyCellObserver = new MutationObserver(this._handleMutations.bind(this));\n    this._stickyCellObserver.observe(this._elements.content, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The header cell's content.\n\n   @type {TableHeaderCellContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-table-headercell-content',\n      insert: function (content) {\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /** @private */\n  _handleMutations() {\n    this.trigger('coral-table-headercell:_contentchanged');\n  }\n\n  get _contentZones() {\n    return {'coral-table-headercell-content': 'content'};\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Fetch or create the content zone element\n    const content = this._elements.content;\n\n    if (!content.parentNode) {\n      // Move component children into the content\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Assign the content zone so the insert function will be called\n    this.content = content;\n  }\n\n  /**\n   Triggered when the {@link TableHeaderCell} content changed.\n\n   @typedef {CustomEvent} coral-table-headercell:_contentchanged\n\n   @private\n   */\n});\n\nexport default TableHeaderCell;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2033,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2034,
    "kind": "variable",
    "name": "TableHeaderCell",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js~TableHeaderCell",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table header cell component",
    "lineNumber": 26,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.HeaderCell"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table header cell component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-headercell"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "th"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableCellElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<th is=\"coral-table-headercell\"></th>",
      "<caption>JS constructor</caption>\nnew Coral.Table.HeaderCell();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2035,
    "kind": "typedef",
    "name": "coral-table-headercell:_contentchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCell.js~coral-table-headercell:_contentchanged",
    "access": "private",
    "description": "Triggered when the {@link TableHeaderCell} content changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-headercell:_contentchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2036,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCellContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Table.HeaderCell.Content\n @classdesc The Table HeaderCell content\n @htmltag coral-table-headercell-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-table-headercell-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableHeaderCellContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2037,
    "kind": "function",
    "name": "TableHeaderCellContent",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCellContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableHeaderCellContent.js~TableHeaderCellContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "The Table HeaderCell content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.HeaderCell.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Table HeaderCell content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-headercell-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-table-headercell-content></coral-table-headercell-content>",
      "<caption>JS constructor</caption>\nnew Coral.Table.HeaderCell.Content();"
    ],
    "see": [
      "../examples/#table"
    ],
    "params": []
  },
  {
    "__docId__": 2038,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport accessibilityState from '../templates/accessibilityState';\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, commons, i18n} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Table-row';\n\n/**\n @class Coral.Table.Row\n @classdesc A Table row component\n @htmltag coral-table-row\n @htmlbasetag tr\n @extends {HTMLTableRowElement}\n @extends {BaseComponent}\n */\nconst TableRow = Decorator(class extends BaseComponent(HTMLTableRowElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    accessibilityState.call(this._elements, {commons});\n\n    // Required for coral-table-row:change event\n    this._oldSelection = [];\n\n    // Events\n    this._delegateEvents({\n      // Private\n      'coral-table-cell:_beforeselectedchanged': '_onBeforeCellSelectionChanged',\n      'coral-table-cell:_selectedchanged': '_onCellSelectionChanged'\n    });\n\n    // Initialize content MO\n    this._observer = new MutationObserver(this._handleMutations.bind(this));\n    this._observer.observe(this, {\n      childList: true\n    });\n  }\n\n  /**\n   Whether the table row is locked.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute locked\n   @htmlattributereflected\n   */\n  get locked() {\n    return this._locked || false;\n  }\n\n  set locked(value) {\n    this._locked = transform.booleanAttr(value);\n    this._reflectAttribute('locked', this._locked);\n\n    this.trigger('coral-table-row:_lockedchanged');\n  }\n\n  /**\n   Whether the table row is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    // Prevent selection if disabled\n    if (this.hasAttribute('coral-table-rowselect') && this.hasAttribute('disabled') ||\n      this.querySelector('[coral-table-rowselect][disabled]')) {\n      return;\n    }\n\n    this.trigger('coral-table-row:_beforeselectedchanged');\n\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this.trigger('coral-table-row:_selectedchanged');\n    this._syncSelectHandle();\n    this._syncAriaLabelledby();\n    this._syncAriaSelectedState();\n  }\n\n  /**\n   Whether the items are selectable.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selectable\n   @htmlattributereflected\n   */\n  get selectable() {\n    return this._selectable || false;\n  }\n\n  set selectable(value) {\n    this._selectable = transform.booleanAttr(value);\n    this._reflectAttribute('selectable', this._selectable);\n\n    this.items.getAll().forEach((cell) => {\n      cell[this._selectable ? 'setAttribute' : 'removeAttribute']('_selectable', '');\n    });\n  }\n\n  /**\n   Whether multiple items can be selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this.trigger('coral-table-row:_multiplechanged');\n  }\n\n  /**\n   Returns an Array containing the selected items.\n\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Returns the first selected item of the row. The value <code>null</code> is returned if no element is\n   selected.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getFirstSelected();\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemBaseTagName: 'td',\n        itemTagName: 'coral-table-cell'\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   * The row header element for the row.\n   * @type {HTMLElement}\n   * @readonly\n   */\n  get rowHeader ()  {\n    return this.items.getAll().filter(cell => {\n      return (cell.getAttribute('role') === 'rowheader' ||\n        (cell.tagName === 'TH' && cell.getAttribute('scope') === 'row'));\n    })[0];\n  }\n\n  _triggerChangeEvent() {\n    const selectedItems = this.selectedItems;\n    this.trigger('coral-table-row:_change', {\n      oldSelection: this._oldSelection,\n      selection: selectedItems\n    });\n    this._oldSelection = selectedItems;\n  }\n\n  /** @private */\n  _onCellSelectionChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _onBeforeCellSelectionChanged(event) {\n    event.stopImmediatePropagation();\n\n    // In single selection, if the added item is selected, the rest should be deselected\n    const selectedItem = this.selectedItem;\n    if (!this.multiple && selectedItem && !event.target.selected) {\n      selectedItem.set('selected', false, true);\n    }\n  }\n\n  /** @private */\n  _syncAriaSelectedState() {\n    this.classList.toggle('is-selected', this.selected);\n    const selectHandle = this.querySelector('[coral-table-rowselect]');\n\n    // @a11y Only update aria-selected if the table row can be selected\n    if (!(this.hasAttribute('coral-table-rowselect') || selectHandle)) {\n      this.removeAttribute('aria-selected');\n      return;\n    }\n\n    const rowOrderHandle = this.querySelector('[coral-table-roworder]');\n    const rowLockHandle = this.querySelector('[coral-table-rowlock]');\n    const rowRemoveHandle = this.querySelector('[coral-row-remove]');\n    const accessibilityState = this._elements.accessibilityState;\n\n    const resetAccessibilityState = () => {\n      // @a11y remove aria-live\n      this.removeAttribute('aria-live');\n      this.removeAttribute('aria-atomic');\n      this.removeAttribute('aria-relevant');\n\n      // @a11y Unhide the selectHandle, so that it will be resume being announced by assistive\n      // technology\n      if (selectHandle && selectHandle.tagName === 'CORAL-CHECKBOX') {\n        selectHandle.removeAttribute('aria-hidden');\n      }\n\n      // @a11y Unhide the coral-table-roworder handle, so that it will be resume being announced by\n      // assistive technology\n      if (rowOrderHandle) {\n        rowOrderHandle.removeAttribute('aria-hidden');\n      }\n\n      // @a11y Unhide the coral-table-rowlock handle, so that it will be resume being announced by\n      // assistive technology\n      if (rowLockHandle) {\n        rowLockHandle.removeAttribute('aria-hidden');\n      }\n\n      // @a11y Unhide the coral-row-remove handle, so that it will be resume being announced by\n      // assistive technology\n      if (rowRemoveHandle) {\n        rowRemoveHandle.removeAttribute('aria-hidden');\n      }\n\n      if (accessibilityState) {\n        // @a11y Hide the _accessibilityState from assistive technology, so that it can not be read\n        // using a screen reader separately from the row it helps label\n        accessibilityState.setAttribute('aria-hidden', 'true');\n\n        // @a11y If the item is not selected, remove ', unchecked' to decrease verbosity.\n        if (!this.selected) {\n          accessibilityState.innerHTML = '';\n        }\n      }\n    };\n\n    // @a11y set aria-selected\n    this.setAttribute('aria-selected', this.selected);\n\n    if (this._ariaLiveOnTimeout || this._ariaLiveOffTimeout) {\n      clearTimeout(this._ariaLiveOnTimeout);\n      clearTimeout(this._ariaLiveOffTimeout);\n    }\n\n    // @ally If _accessibilityState has been added to a cell within the row,\n    if (accessibilityState) {\n      resetAccessibilityState();\n      this._ariaLiveOnTimeout = setTimeout(() => {\n\n        // @a11y and the row or one of its descendants has focus,\n        if (this === document.activeElement || this.contains(document.activeElement)) {\n\n          // @a11y Hide the \"Select\" checkbox so that it does not get announced with the state change.\n          if (selectHandle && selectHandle.tagName === 'CORAL-CHECKBOX') {\n            selectHandle.setAttribute('aria-hidden', 'true');\n          }\n\n          // @a11y Hide the coral-table-roworder handle so that it does not get announced with the\n          // state change.\n          if (rowOrderHandle) {\n            rowOrderHandle.setAttribute('aria-hidden', 'true');\n          }\n\n          // @a11y Hide the coral-table-rowlock handle so that it does not get announced with the state\n          // change.\n          if (rowLockHandle) {\n            rowLockHandle.setAttribute('aria-hidden', 'true');\n          }\n\n          // @a11y Hide the coral-row-remove handle so that it does not get announced with the state\n          // change.\n          if (rowRemoveHandle) {\n            rowRemoveHandle.setAttribute('aria-hidden', 'true');\n          }\n\n          // @a11y The ChromeVox screenreader, used on Chromebook, announces the state change and\n          // should not need aria-live, otherwise it double-voices the row.\n          if (!window.cvox) {\n            // @a11y Unhide the _accessibilityState so that it will get announced with the state change.\n            accessibilityState.removeAttribute('aria-hidden');\n\n            // @ally use aria-live to announce the state change\n            this.setAttribute('aria-live', 'assertive');\n\n            // @ally use aria-atomic=\"true\" to announce the entire row\n            this.setAttribute('aria-atomic', 'true');\n          }\n\n          this._ariaLiveOnTimeout = setTimeout(() => {\n            // @ally Set the _accessibilityState text to read either \", checked\" or \", unchecked\",\n            // which should trigger a live region announcement.\n            accessibilityState.innerHTML = i18n.get(this.selected ? ', checked' : ', unchecked');\n\n            // @ally wait 250ms for row to announce\n            this._ariaLiveOffTimeout = setTimeout(resetAccessibilityState, 250);\n          }, 20);\n        }\n      }, 20);\n\n      if (!(this === document.activeElement || this.contains(document.activeElement))) {\n        accessibilityState.innerHTML = i18n.get(this.selected ? ', checked' : '');\n      }\n    }\n  }\n\n  /** @private */\n  _syncAriaLabelledby() {\n    // @a11y if the row is not selectable, remove accessibilityState\n    if (!(this.hasAttribute('coral-table-rowselect') || this.querySelector('[coral-table-rowselect]'))) {\n      if (this._elements.accessibilityState.parentNode) {\n        this.removeAttribute('aria-labelledby');\n        this._elements.accessibilityState = this._elements.accessibilityState.parentNode.removeChild(this._elements.accessibilityState);\n      }\n      return;\n    }\n\n    // @a11y get a list of ids for cells\n    const cells = this.items.getAll().filter(cell => {\n      // @a11y exclude cells for coral-table-roworder, coral-table-rowlock or coral-row-remove\n      return (\n        cell.id &&\n        !(\n          cell.hasAttribute('coral-table-roworder') || cell.querySelector('[coral-table-roworder]') ||\n          cell.hasAttribute('coral-table-rowlock') || cell.querySelector('[coral-table-rowlock]') ||\n          cell.hasAttribute('coral-row-remove') || cell.querySelector('[coral-table-remove]')\n        )\n      );\n    });\n\n    const rowHeaders = cells.filter(cell => {\n      return (cell.getAttribute('role') === 'rowheader' ||\n        (cell.tagName === 'TH' && cell.getAttribute('scope') === 'row'));\n    });\n\n    let cellForAccessibilityState;\n    const ids = cells.map(cell => {\n      const handle = cell.querySelector('[coral-table-rowselect]');\n      if (handle) {\n\n        cellForAccessibilityState = cell;\n\n        // @a11y otherwise, if the selectHandle is a coral-checkbox,\n        if (handle && handle.tagName === 'CORAL-CHECKBOX' && handle._elements) {\n          // @a11y if the row is selected, don't add the coral-table-rowselect to accessibility name\n          if (this.selected) {\n            return;\n          }\n          // otherwise, include the checkbox input labelled \"Select\" in the accessibility name\n          return handle._elements.input && handle._elements.input.id;\n        }\n      }\n\n      // @a11y include row headers, or if no row header is defined,\n      // all other cells in the row, in the accessibility name\n      if (rowHeaders.length === 0 || rowHeaders.indexOf(cell) !== -1) {\n        return cell.id;\n      }\n    });\n\n    // @a11y If an _accessibilityState has not been defined within one of the cells, add to the last\n    // cell\n    if (!cellForAccessibilityState && cells.length) {\n      cellForAccessibilityState = cells[cells.length - 1];\n    }\n\n    if (cellForAccessibilityState) {\n      cellForAccessibilityState.appendChild(this._elements.accessibilityState);\n    }\n\n    // @a11y Once defined,\n    if (this._elements.accessibilityState.parentNode) {\n      // @a11y add the _accessibilityState \", checked\" or \", unchecked\" as the last item in the\n      // accessibility name\n      ids.push(this._elements.accessibilityState.id);\n    }\n\n    // @a11y Update the aria-labelledby attribute for the row.\n    this.setAttribute('aria-labelledby', ids.join(' '));\n  }\n\n  /** @private */\n  _syncSelectHandle() {\n    // Check/uncheck the select handle\n    const selectHandle = this.querySelector('[coral-table-rowselect]');\n    if (selectHandle) {\n      if (typeof selectHandle.indeterminate !== 'undefined') {\n        selectHandle.indeterminate = false;\n      }\n\n      selectHandle[this.selected ? 'setAttribute' : 'removeAttribute']('checked', '');\n\n      // @a11y If the handle is a checkbox but lacks a label, label it with \"Select\".\n      if (selectHandle.tagName === 'CORAL-CHECKBOX') {\n        if (!selectHandle.labelled) {\n          selectHandle.labelled = i18n.get('Select');\n        }\n\n        // @a11y provide a more explicit label for the checkbox than just \"Select\"\n        if (this.hasAttribute('aria-labelledby')) {\n          // Wait for the next frame to ensure the selectHandle has initialized _elements object.\n          window.requestAnimationFrame(() => {\n            let ids = this.getAttribute('aria-labelledby')\n              .split(/\\s+/g)\n              .filter(id => selectHandle._elements.id !== id && this._elements.accessibilityState.id !== id)\n              .join(' ');\n            selectHandle.labelledBy = selectHandle._elements.id + ' ' + ids;\n          });\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _toggleSelectable(selectable) {\n    if (selectable) {\n      this._setHandle('coral-table-rowselect');\n    } else {\n      // Clear selection but leave the handle if any\n      this.set('selected', false, true);\n    }\n\n    // Sync the aria-labelledby attribute to include the _accessibilityState\n    this._syncAriaLabelledby();\n  }\n\n  /** @private */\n  _toggleOrderable(orderable) {\n    if (orderable) {\n      this._setHandle('coral-table-roworder', 0);\n    }\n    // Remove DragAction instance\n    else if (this.dragAction) {\n      this.dragAction.destroy();\n    }\n  }\n\n  /** @private */\n  _toggleLockable(lockable) {\n    if (lockable) {\n      this._setHandle('coral-table-rowlock');\n    }\n  }\n\n  _setHandleAndSync(handle) {\n    // Specify handle directly on the row if none found\n    if (!this.querySelector(`[${handle}]`)) {\n      this.setAttribute(handle, '');\n    }\n    this._syncSelectHandle();\n    this._syncAriaLabelledby();\n    this._syncAriaSelectedState();\n  }\n\n  /** @private */\n  _setHandle(handle, timeout) {\n    if(typeof timeout === \"number\") {\n      setTimeout(() => {\n        this._setHandleAndSync(handle);\n      }, timeout);\n    } else {\n      requestAnimationFrame(() => {\n        this._setHandleAndSync(handle);\n      });\n    }\n  }\n\n  /** @private */\n  _handleMutations(mutations) {\n    mutations.forEach((mutation) => {\n      // Sync added nodes\n      this.trigger('coral-table-row:_contentchanged', {\n        addedNodes: mutation.addedNodes,\n        removedNodes: mutation.removedNodes\n      });\n      this._syncAriaLabelledby();\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['locked', 'selected', 'multiple', 'selectable', '_selectable', '_orderable', '_lockable']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === '_selectable') {\n      this._toggleSelectable(value !== null);\n    } else if (name === '_orderable') {\n      this._toggleOrderable(value !== null);\n    } else if (name === '_lockable') {\n      this._toggleLockable(value !== null);\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n    this._syncAriaLabelledby();\n  }\n\n  /**\n   Triggered before {@link TableRow#selected} is changed.\n\n   @typedef {CustomEvent} coral-table-row:_beforeselectedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableRow#selected} changed.\n\n   @typedef {CustomEvent} coral-table-row:_selectedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableRow#locked} changed.\n\n   @typedef {CustomEvent} coral-table-row:_lockedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TableRow#multiple} changed.\n\n   @typedef {CustomEvent} coral-table-row:_multiplechanged\n\n   @private\n   */\n\n  /**\n   Triggered when the {@link TableRow} selection changed.\n\n   @typedef {CustomEvent} coral-table-row:_change\n\n   @property {Array.<TableCell>} detail.oldSelection\n   The old item selection. When {@link TableRow#multiple}, it includes an Array.\n   @property {Array.<TableCell>} event.detail.selection\n   The item selection. When {@link TableRow#multiple}, it includes an Array.\n\n   @private\n   */\n});\n\nexport default TableRow;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2039,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2040,
    "kind": "variable",
    "name": "TableRow",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~TableRow",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Table}",
    "description": "A Table row component",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Table.Row"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Table row component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-table-row"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "tr"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTableRowElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<tr is=\"coral-table-row\"></tr>",
      "<caption>JS constructor</caption>\nnew Coral.Table.Row();"
    ],
    "see": [
      "../examples/#table"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2041,
    "kind": "typedef",
    "name": "coral-table-row:_beforeselectedchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~coral-table-row:_beforeselectedchanged",
    "access": "private",
    "description": "Triggered before {@link TableRow#selected} is changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-row:_beforeselectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2042,
    "kind": "typedef",
    "name": "coral-table-row:_selectedchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~coral-table-row:_selectedchanged",
    "access": "private",
    "description": "Triggered when {@link TableRow#selected} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-row:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2043,
    "kind": "typedef",
    "name": "coral-table-row:_lockedchanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~coral-table-row:_lockedchanged",
    "access": "private",
    "description": "Triggered when {@link TableRow#locked} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-row:_lockedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2044,
    "kind": "typedef",
    "name": "coral-table-row:_multiplechanged",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~coral-table-row:_multiplechanged",
    "access": "private",
    "description": "Triggered when {@link TableRow#multiple} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-row:_multiplechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2045,
    "kind": "typedef",
    "name": "coral-table-row:_change",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableRow.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableRow.js~coral-table-row:_change",
    "access": "private",
    "description": "Triggered when the {@link TableRow} selection changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Array.<TableCell>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The old item selection. When {@link TableRow#multiple}, it includes an Array."
      },
      {
        "nullable": null,
        "types": [
          "Array.<TableCell>"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.selection",
        "description": "The item selection. When {@link TableRow#multiple}, it includes an Array."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-table-row:_change"
    },
    "ignore": true
  },
  {
    "__docId__": 2046,
    "kind": "file",
    "name": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/** @ignore */\nconst isTableHeaderCell = node => node.nodeName === 'TH' && node.getAttribute('is') === 'coral-table-headercell';\n\n/** @ignore */\nconst isTableCell = node => node.nodeName === 'TD' && node.getAttribute('is') === 'coral-table-cell';\n\n/** @ignore */\nconst isTableRow = node => node.nodeName === 'TR' && node.getAttribute('is') === 'coral-table-row';\n\n/** @ignore */\nconst isTableBody = node => node.nodeName === 'TBODY' && node.getAttribute('is') === 'coral-table-body';\n\n/** @ignore */\nconst getIndexOf = (el) => {\n  const parent = el.parentNode;\n  if (!parent) {\n    return -1;\n  }\n\n  return Array.prototype.indexOf.call(parent.children, el);\n};\n\n/** @ignore */\nconst getSiblingsOf = (el, selector, type) => {\n  const stack = [];\n\n  // Returns siblings of el\n  if (!type) {\n    ['previousElementSibling', 'nextElementSibling'].forEach((direction) => {\n      let sibling = el;\n      while (sibling[direction]) {\n        sibling = sibling[direction];\n        if (sibling.matches(selector)) {\n          stack.push(sibling);\n        }\n      }\n    });\n  } else {\n    const direction = type.indexOf('next') === 0 ? 'nextElementSibling' : 'previousElementSibling';\n\n    // All following siblings of el up to but not including the element matched by the selector\n    if (type.indexOf('Until') !== -1) {\n      const matches = function () {\n        if (typeof selector === 'string') {\n          return el[direction].matches(selector);\n        }\n\n        return el[direction] === selector;\n      };\n\n      while (el[direction] && !matches()) {\n        stack.push(el = el[direction]);\n      }\n    }\n    // All following siblings of el filtered by a selector.\n    else if (type.indexOf('All') !== -1) {\n      while (el[direction]) {\n        el = el[direction];\n        if (el.matches(selector)) {\n          stack.push(el);\n        }\n      }\n    }\n    // Returns the sibling only if it matches that selector.\n    else {\n      const sibling = el[direction];\n      return sibling && sibling.matches(selector) ? sibling : null;\n    }\n  }\n\n  return stack;\n};\n\n/** @ignore */\nconst listToArray = (list) => {\n  const res = [];\n  for (let i = 0, listCount = res.length = list.length ; i < listCount ; i++) {\n    res[i] = list[i];\n  }\n  return res;\n};\n\n/** @ignore */\nconst getColumns = (colgroup) => listToArray(colgroup.querySelectorAll('col[is=\"coral-table-column\"]'));\n\n/** @ignore */\nconst getRows = (sections) => {\n  let rows = [];\n\n  sections.forEach((section) => {\n    if (section) {\n      rows = rows.concat(listToArray(section.querySelectorAll('tr[is=\"coral-table-row\"]')));\n    }\n  });\n\n  return rows;\n};\n\n/** @ignore */\nconst getCells = (row) => listToArray(row.querySelectorAll('td[is=\"coral-table-cell\"], th[is=\"coral-table-headercell\"]'));\n\n/** @ignore */\nconst getContentCells = (row) => listToArray(row.querySelectorAll('td[is=\"coral-table-cell\"]'));\n\n/** @ignore */\nconst getHeaderCells = (row) => listToArray(row.querySelectorAll('th[is=\"coral-table-headercell\"]'));\n\n/** @ignore */\nconst getCellByIndex = (row, index) => getCells(row).filter(cell => getIndexOf(cell) === index)[0] || null;\n\n/**\n Enumeration for {@link TableHead}, {@link TableBody} and {@link TableFoot} divider values.\n\n @typedef {Object} TableSectionDividerEnum\n\n @property {String} NONE\n No divider.\n @property {String} ROW\n Row divider.\n @property {String} COLUMN\n Column divider.\n @property {String} CELL\n Row and Column divider.\n */\nconst divider = {\n  NONE: 'none',\n  ROW: 'row',\n  COLUMN: 'column',\n  CELL: 'cell'\n};\n\n/**\n Enumeration for {@link TableColumn} alignment options.\n\n @typedef {Object} TableColumnAlignmentEnum\n\n @property {String} LEFT\n Left alignment.\n @property {String} CENTER\n Center alignment.\n @property {String} RIGHT\n Right alignment.\n */\nconst alignment = {\n  LEFT: 'left',\n  CENTER: 'center',\n  RIGHT: 'right'\n};\n\nexport {\n  divider,\n  alignment,\n  getColumns,\n  getCells,\n  getContentCells,\n  getHeaderCells,\n  getCellByIndex,\n  getIndexOf,\n  getSiblingsOf,\n  getRows,\n  isTableHeaderCell,\n  isTableCell,\n  isTableRow,\n  isTableBody\n};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2047,
    "kind": "function",
    "name": "listToArray",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~listToArray",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 87,
    "ignore": true,
    "params": [
      {
        "name": "list",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2048,
    "kind": "typedef",
    "name": "TableSectionDividerEnum",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~TableSectionDividerEnum",
    "access": "public",
    "description": "Enumeration for {@link TableHead}, {@link TableBody} and {@link TableFoot} divider values.",
    "lineNumber": 137,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "NONE",
        "description": "No divider."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ROW",
        "description": "Row divider."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "COLUMN",
        "description": "Column divider."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CELL",
        "description": "Row and Column divider."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TableSectionDividerEnum"
    }
  },
  {
    "__docId__": 2049,
    "kind": "typedef",
    "name": "TableColumnAlignmentEnum",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~TableColumnAlignmentEnum",
    "access": "public",
    "description": "Enumeration for {@link TableColumn} alignment options.",
    "lineNumber": 156,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT",
        "description": "Left alignment."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER",
        "description": "Center alignment."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT",
        "description": "Right alignment."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TableColumnAlignmentEnum"
    }
  },
  {
    "__docId__": 2050,
    "kind": "function",
    "name": "getColumns",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getColumns",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getColumns}",
    "description": null,
    "lineNumber": 96,
    "ignore": true,
    "params": [
      {
        "name": "colgroup",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2051,
    "kind": "function",
    "name": "getCells",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getCells",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getCells}",
    "description": null,
    "lineNumber": 112,
    "ignore": true,
    "params": [
      {
        "name": "row",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2052,
    "kind": "function",
    "name": "getContentCells",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getContentCells",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getContentCells}",
    "description": null,
    "lineNumber": 115,
    "ignore": true,
    "params": [
      {
        "name": "row",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2053,
    "kind": "function",
    "name": "getHeaderCells",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getHeaderCells",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getHeaderCells}",
    "description": null,
    "lineNumber": 118,
    "ignore": true,
    "params": [
      {
        "name": "row",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2054,
    "kind": "function",
    "name": "getCellByIndex",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getCellByIndex",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getCellByIndex}",
    "description": null,
    "lineNumber": 121,
    "ignore": true,
    "params": [
      {
        "name": "row",
        "types": [
          "*"
        ]
      },
      {
        "name": "index",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2055,
    "kind": "function",
    "name": "getIndexOf",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getIndexOf",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getIndexOf}",
    "description": null,
    "lineNumber": 26,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2056,
    "kind": "function",
    "name": "getSiblingsOf",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getSiblingsOf",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getSiblingsOf}",
    "description": null,
    "lineNumber": 36,
    "ignore": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      },
      {
        "name": "selector",
        "types": [
          "*"
        ]
      },
      {
        "name": "type",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2057,
    "kind": "function",
    "name": "getRows",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~getRows",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getRows}",
    "description": null,
    "lineNumber": 99,
    "ignore": true,
    "params": [
      {
        "name": "sections",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2058,
    "kind": "function",
    "name": "isTableHeaderCell",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~isTableHeaderCell",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{isTableHeaderCell}",
    "description": null,
    "lineNumber": 14,
    "ignore": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2059,
    "kind": "function",
    "name": "isTableCell",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~isTableCell",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{isTableCell}",
    "description": null,
    "lineNumber": 17,
    "ignore": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2060,
    "kind": "function",
    "name": "isTableRow",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~isTableRow",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{isTableRow}",
    "description": null,
    "lineNumber": 20,
    "ignore": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2061,
    "kind": "function",
    "name": "isTableBody",
    "memberof": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-table/src/scripts/TableUtil.js~isTableBody",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{isTableBody}",
    "description": null,
    "lineNumber": 23,
    "ignore": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2062,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tablist/src/scripts/Tab.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseLabellable} from '../../../coral-base-labellable';\nimport base from '../templates/base';\nimport {transform, commons} from '../../../coral-utils';\nimport {Icon} from '../../../coral-component-icon';\nimport getTarget from './getTarget';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Tabs-item';\n\n/**\n @class Coral.Tab\n @classdesc A Tab component\n @htmltag coral-tab\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Tab = Decorator(class extends BaseLabellable(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {\n      label: this.querySelector('coral-tab-label') || document.createElement('coral-tab-label'),\n      invalidIcon: this.querySelector('._coral-Tabs-itemInvalidIcon') || this._createInvalidIcon()\n    };\n    base.call(this._elements);\n\n    // Listen for mutations\n    this._observer = new MutationObserver(() => {\n      // Change icon size if the label is empty\n      const icon = this._elements.icon;\n      if (icon) {\n        icon.size = this._elements.label.textContent.trim().length ? Icon.size.EXTRA_SMALL : Icon.size.SMALL;\n      }\n\n      super._toggleIconAriaHidden();\n\n      this.trigger('coral-tab:_sizechanged');\n    });\n\n    // Watch for changes to the label element\n    this._observer.observe(this._elements.label, {\n      childList: true,\n      characterData: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The label of the tab.\n\n   @type {TabLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-tab-label',\n      insert: function (label) {\n        label.classList.add(`${CLASSNAME}Label`);\n        this.appendChild(label);\n\n        this._toggleEllipsis();\n      }\n    });\n  }\n\n  /**\n   Specifies the name of the icon used inside the Tab. See {@link Icon} for valid icon names.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute icon\n   */\n  get icon() {\n    const iconElement = this._elements.icon;\n    return iconElement ? iconElement.icon : '';\n  }\n\n  set icon(value) {\n    const iconElement = this._elements.icon;\n    iconElement.icon = value;\n\n    // removes the icon element from the DOM.\n    if (this.icon === '') {\n      iconElement.remove();\n      this.trigger('coral-tab:_sizechanged');\n    }\n    // adds the icon back since it was blown away by textContent\n    else if (!iconElement.parentElement) {\n      // Change icon size if the label is empty\n      if (!this._elements.label.textContent.trim().length) {\n        iconElement.size = Icon.size.SMALL;\n      }\n\n      super._toggleIconAriaHidden();\n\n      this.insertBefore(iconElement, this.firstChild);\n      this.trigger('coral-tab:_sizechanged');\n    }\n  }\n\n  /**\n   Whether the current Tab is invalid.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute invalid\n   @htmlattributereflected\n   */\n  get invalid() {\n    return this._invalid || false;\n  }\n\n  set invalid(value) {\n    this._invalid = transform.booleanAttr(value);\n    this._reflectAttribute('invalid', this._invalid);\n\n    this.classList.toggle('is-invalid', this._invalid);\n    this.setAttribute('aria-invalid', this._invalid);\n    if (this._invalid) {\n      this._elements.invalidIcon.removeAttribute('hidden');\n    } else {\n      this._elements.invalidIcon.setAttribute('hidden', 'true');\n    }\n  }\n\n  /**\n   Whether this Tab is disabled. When set to true, this will prevent every user interacting with the Tab. If\n   disabled is set to true for a selected Tab it will be deselected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.classList.toggle('is-disabled', this._disabled);\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n\n    if (this._disabled && this.selected) {\n      this.selected = false;\n    }\n\n    if (!this._disabled && !this.selected) {\n      // We inform the parent to verify if this item should be selected because it's the only one left\n      this.trigger('coral-tab:_validateselection');\n    }\n  }\n\n  /**\n   Whether the tab is selected.\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    value = transform.booleanAttr(value);\n\n    if (!value || value && !this.disabled) {\n      this._selected = value;\n      this._reflectAttribute('selected', this.disabled ? false : this._selected);\n\n      this.classList.toggle('is-selected', this._selected);\n      this.setAttribute('tabindex', this._selected ? '0' : '-1');\n      this.setAttribute('aria-selected', this._selected);\n\n      // in case the tab is selected, we need to communicate it to the panels.\n      if (this._selected) {\n        this._selectTarget();\n      }\n      this.trigger('coral-tab:_selectedchanged');\n    }\n  }\n\n  /**\n   The target element that will be selected when this Tab is selected. It accepts a CSS selector or a DOM element.\n   If a CSS Selector is provided, the first matching element will be used.\n\n   @type {?HTMLElement|String}\n   @default null\n   @htmlattribute target\n   */\n  get target() {\n    return typeof this._target === 'string' ? this._target : this._target || null;\n  }\n\n  set target(value) {\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      const realTarget = getTarget(this.target);\n\n      // we add proper accessibility if available\n      if (realTarget) {\n        // creates a 2 way binding for accessibility\n        this.setAttribute('aria-controls', realTarget.id);\n        realTarget.setAttribute('aria-labelledby', this.id);\n\n        // adds role to panel to support accessibility\n        realTarget.setAttribute('role', 'tabpanel');\n      }\n    }\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  _toggleEllipsis() {\n    requestAnimationFrame(() => {\n      this.classList.toggle('is-overflowing', this._elements.label.clientWidth > this.clientWidth);\n    });\n  }\n\n  /**\n   Selects the target item\n\n   @ignore\n   */\n  _selectTarget() {\n    let realTarget = getTarget(this.target);\n    // if the target was define at the tab level, it has precedence over everything\n    if (realTarget) {\n      realTarget.setAttribute('selected', '');\n    }\n    // otherwise, we use the target defined at the tablist level\n    else {\n      const tabList = this.parentNode;\n\n      if (tabList && tabList.target) {\n        realTarget = getTarget(tabList.target);\n\n        if (realTarget) {\n          // we get the position of this tab inside the tablist\n          const currentIndex = tabList.items.getAll().indexOf(this);\n\n          // we select the item with the same index\n          const targetItem = (realTarget.items ? realTarget.items.getAll() : realTarget.children)[currentIndex];\n\n          // we select the item if it exists\n          if (targetItem) {\n            targetItem.setAttribute('selected', '');\n          }\n        }\n      }\n    }\n  }\n\n  _createInvalidIcon() {\n    const iconElement = document.createElement('coral-icon');\n    iconElement.icon = 'alert';\n    iconElement.alt = 'alert';\n    iconElement.size = Icon.size.EXTRA_SMALL;\n    iconElement.setAttribute('aria-hidden', 'true');\n    iconElement.classList.add('_coral-Tabs-itemInvalidIcon');\n    if (!this._invalid) {\n      iconElement.setAttribute('hidden', 'true');\n    }\n    return iconElement;\n  }\n\n  get _contentZones() {\n    return {'coral-tab-label': 'label'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'icon', 'invalid', 'target']);\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Query the tab target once the tab item is inserted in the DOM\n    if (this.selected) {\n      this._selectTarget();\n    }\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'tab');\n\n    // Generate a unique ID for the tab panel if one isn't already present\n    // This will be used for accessibility purposes\n    this.setAttribute('id', this.id || commons.getUID());\n\n    // Create a fragment\n    const frag = document.createDocumentFragment();\n\n    // Render the main template\n    if (this.icon) {\n      frag.appendChild(this._elements.icon);\n    }\n\n    if (this._elements.invalidIcon) {\n      frag.append(this._elements.invalidIcon);\n    }\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      label.parentNode.removeChild(label);\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && child.getAttribute('handle') !== 'icon') {\n        // Add non-template elements to the label\n        label.appendChild(child);\n      } else {\n        this.removeChild(child);\n      }\n    }\n\n    // Add the frag to the component\n    this.appendChild(frag);\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n  }\n});\n\nexport default Tab;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tablist/src/scripts/Tab.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2063,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/Tab.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/Tab.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2064,
    "kind": "variable",
    "name": "Tab",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/Tab.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/Tab.js~Tab",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tab}",
    "description": "A Tab component",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tab"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Tab component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tab"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tab></coral-tab>",
      "<caption>JS constructor</caption>\nnew Coral.Tab();"
    ],
    "see": [
      "../examples/#tablist"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2065,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tablist/src/scripts/TabLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Tab.Label\n @classdesc Tab's label component\n @htmltag coral-tab-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-tab-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tablist/src/scripts/TabLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2066,
    "kind": "function",
    "name": "TabLabel",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabLabel.js~TabLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tab}",
    "description": "Tab's label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tab.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Tab's label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tab-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-tab-label></coral-tab-label>",
      "<caption>JS constructor</caption>\nnew Coral.Tab.Label();"
    ],
    "see": [
      "../examples/#tablist"
    ],
    "params": []
  },
  {
    "__docId__": 2067,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport line from '../templates/line';\nimport getTarget from './getTarget';\n\n/**\n Enumeration for {@link TabList} sizes.\n\n @typedef {Object} TabListSizeEnum\n\n @property {String} SMALL\n A small-sized tablist.\n @property {String} MEDIUM\n A medium-sized tablist. This is the default.\n @property {String} LARGE\n A large-sized tablist.\n */\nconst size = {\n  SMALL: 'S',\n  MEDIUM: 'M',\n  LARGE: 'L'\n};\n\n/**\n Enumeration for {@link TabList} orientations.\n\n @typedef {Object} TabListOrientationEnum\n\n @property {String} HORIZONTAL\n Horizontal TabList, this is the default value.\n @property {String} VERTICAL\n Vertical TabList.\n */\nconst orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical'\n};\n\n// the tablist's base classname\nconst CLASSNAME = '_coral-Tabs';\n\n/**\n @class Coral.TabList\n @classdesc A TabList component holds a collection of tabs.\n @htmltag coral-tablist\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nclass TabList extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Templates\n    this._elements = {};\n    line.call(this._elements);\n\n    // Attach events\n    this._delegateEvents({\n      'click > coral-tab': '_onTabClick',\n      'key:home > coral-tab': '_onHomeKey',\n      'key:end > coral-tab': '_onEndKey',\n      'key:pagedown > coral-tab': '_selectNextItem',\n      'key:right > coral-tab': '_selectNextItem',\n      'key:down > coral-tab': '_selectNextItem',\n      'key:pageup > coral-tab': '_selectPreviousItem',\n      'key:left > coral-tab': '_selectPreviousItem',\n      'key:up > coral-tab': '_selectPreviousItem',\n\n      'global:coral-commons:_webfontactive': '_setLine',\n\n      // private\n      'coral-tab:_selectedchanged': '_onItemSelectedChanged',\n      'coral-tab:_validateselection': '_onValidateSelection',\n      'coral-tab:_sizechanged': '_setLine'\n    });\n\n    // Used for eventing\n    this._oldSelection = null;\n\n    // Debounce timer\n    this._timeout = null;\n    // Debounce wait in milliseconds\n    this._wait = 50;\n\n    this._setLine = this._setLine.bind(this);\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-tab',\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   The selected item in the TabList.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getLastSelected();\n  }\n\n  /**\n   The target component that will be linked to the TabList. It accepts either a CSS selector or a DOM element. If a\n   CSS Selector is provided, the first matching element will be used. Items will be selected based on the index. If\n   both target and {@link Coral.Tab#target} are set, the second will have higher priority.\n\n   @type {?HTMLElement|String}\n   @default null\n   @htmlattribute target\n   */\n  get target() {\n    return typeof this._target === 'string' ? this._target : this._target || null;\n  }\n\n  set target(value) {\n    if (value === null || typeof value === 'string' || value instanceof Node) {\n      this._target = value;\n\n      window.cancelAnimationFrame(this._targetDebouncedId);\n      // we do in case the target was not yet in the DOM\n      this._targetDebouncedId = window.requestAnimationFrame(() => {\n        const realTarget = getTarget(this._target);\n        // we add proper accessibility if available\n        if (realTarget) {\n          const tabItems = this.items.getAll();\n          const panelItems = realTarget.items ? realTarget.items.getAll() : realTarget.children;\n\n          // we need to add a11y to all component, no matter if they can be perfectly paired\n          const maxItems = Math.max(tabItems.length, panelItems.length);\n\n          for (let i = 0 ; i < maxItems ; i++) {\n            let tab = tabItems[i];\n            let panel = panelItems[i];\n\n            // if the tab has its own target, we assume the target component will handle its own accessibility. if the\n            // target is an empty string we simply ignore it\n            if (tab && tab.target && tab.target.trim() !== '') {\n              continue;\n            }\n\n            if (tab && panel) {\n              // sets the required ids\n              tab.id = tab.id || commons.getUID();\n              panel.id = panel.id || commons.getUID();\n\n              // creates a 2 way binding for accessibility\n              tab.setAttribute('aria-controls', panel.id);\n              panel.setAttribute('aria-labelledby', tab.id);\n\n              // adds role to panel to support accessibility\n              panel.setAttribute('role', 'tabpanel');\n            } else if (tab) {\n              // cleans the aria since there is no matching panel\n              tab.removeAttribute('aria-controls');\n            } else {\n              // cleans the aria since there is no matching tab\n              panel.removeAttribute('aria-labelledby');\n            }\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   The size of the TabList. It accepts both lower and upper case sizes. Currently only \"M\" (the default) and \"L\"\n   are available.\n   See {@link TabListSizeEnum}.\n\n   @type {String}\n   @default TabListSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    this._reflectAttribute('size', this._size);\n\n    // Remove all variant classes\n    this.classList.remove(`${CLASSNAME}--compact`, `${CLASSNAME}--quiet`);\n\n    if (this._size === size.SMALL) {\n      this.classList.add(`${CLASSNAME}--compact`);\n    } else if (this._size === size.LARGE) {\n      this.classList.add(`${CLASSNAME}--quiet`);\n    }\n  }\n\n  /**\n   Orientation of the TabList. See {@link TabListOrientationEnum}.\n\n   @type {String}\n   @default TabListOrientationEnum.HORIZONTAL\n   @htmlattribute orientation\n   @htmlattributereflected\n   */\n  get orientation() {\n    return this._orientation || orientation.HORIZONTAL;\n  }\n\n  set orientation(value) {\n    value = transform.string(value).toLowerCase();\n\n    const newValue = typeof this._orientation === 'undefined';\n    this._orientation = validate.enumeration(orientation)(value) && value || orientation.HORIZONTAL;\n    if (newValue) {\n      this._previousOrientation = this._orientation;\n    }\n    this._reflectAttribute('orientation', this._orientation);\n\n    this.classList.toggle(`${CLASSNAME}--vertical`, this._orientation === orientation.VERTICAL);\n    this.classList.toggle(`${CLASSNAME}--horizontal`, this._orientation === orientation.HORIZONTAL);\n\n    this._setLine();\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    if (!this.selectedItem) {\n      item.setAttribute('selected', '');\n    } else {\n      this._validateSelection(item);\n    }\n  }\n\n  /** @private */\n  _onItemRemoved() {\n    if (!this.selectedItem) {\n      this._selectFirstItem();\n    }\n  }\n\n  /** @private */\n  _onTabClick(event) {\n    event.preventDefault();\n\n    const item = event.matchedTarget;\n    this._toggleItemSelectionAndFocus(item);\n\n    this._trackEvent('click', 'coral-tab', event, item);\n  }\n\n  /** @private */\n  _onHomeKey(event) {\n    event.preventDefault();\n\n    const item = this.items._getFirstSelectable();\n    this._toggleItemSelectionAndFocus(item);\n  }\n\n  /** @private */\n  _onEndKey(event) {\n    event.preventDefault();\n\n    const item = this.items._getLastSelectable();\n    this._toggleItemSelectionAndFocus(item);\n  }\n\n  /** @private */\n  _selectNextItem(event) {\n    event.preventDefault();\n\n    const item = this.selectedItem;\n    this._toggleItemSelectionAndFocus(this.items._getNextSelectable(item));\n  }\n\n  /** @private */\n  _selectPreviousItem(event) {\n    event.preventDefault();\n\n    const item = this.selectedItem;\n    this._toggleItemSelectionAndFocus(this.items._getPreviousSelectable(item));\n  }\n\n  /** @private */\n  _toggleItemSelectionAndFocus(item) {\n    if (item && !item.hasAttribute('selected')) {\n      item.setAttribute('selected', '');\n      item.focus();\n    }\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _onValidateSelection(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection();\n  }\n\n  /** @private */\n  _selectFirstItem() {\n    const item = this.items._getFirstSelectable();\n    if (item) {\n      item.setAttribute('selected', '');\n    }\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.items._getAllSelected();\n\n    if (item) {\n      // Deselected item\n      if (!item.hasAttribute('selected') && !selectedItems.length) {\n        const siblingItem = this.items._getNextSelectable(item);\n        // Next selectable item is forced to be selected if selection is cleared\n        if (item !== siblingItem) {\n          siblingItem.setAttribute('selected', '');\n        }\n      }\n      // Selected item\n      else if (item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    } else if (selectedItems.length > 1) {\n      // If multiple items are selected, the last one wins\n      item = selectedItems[selectedItems.length - 1];\n\n      selectedItems.forEach((selectedItem) => {\n        if (selectedItem !== item) {\n          // Don't trigger change events\n          this._preventTriggeringEvents = true;\n          selectedItem.removeAttribute('selected');\n        }\n      });\n\n      // We can trigger change events again\n      this._preventTriggeringEvents = false;\n    }\n    // First selectable item is forced to be selected if no selection at all\n    else if (!selectedItems.length) {\n      this._selectFirstItem();\n    }\n\n    this._setLine();\n\n    this._triggerChangeEvent();\n  }\n\n  _setLine() {\n    window.requestAnimationFrame(() => {\n      const selectedItem = this.selectedItem;\n\n      // Position line under the selected item\n      if (selectedItem) {\n        if (this.orientation === orientation.HORIZONTAL) {\n          const padding = window.parseInt(window.getComputedStyle(selectedItem).paddingLeft);\n          const left = selectedItem.offsetLeft + padding;\n          const width = selectedItem.clientWidth - padding * 2;\n\n          // Orientation changed\n          if (this._previousOrientation !== this.orientation) {\n            this._elements.line.style.height = '';\n          }\n\n          this._elements.line.style.width = `${width}px`;\n          this._elements.line.style.transform = `translate(${left}px, 0)`;\n        } else if (this.orientation === orientation.VERTICAL) {\n          const top = selectedItem.offsetTop;\n          const height = selectedItem.clientHeight;\n\n          // Orientation changed\n          if (this._previousOrientation !== this.orientation) {\n            this._elements.line.style.width = '';\n          }\n\n          this._elements.line.style.height = `${height}px`;\n          this._elements.line.style.transform = `translate(0, ${top}px)`;\n        }\n        this._elements.line.hidden = false;\n      } else {\n        // Hide line if no selected item\n        this._elements.line.hidden = true;\n      }\n      this._previousOrientation = this.orientation;\n    });\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItem = this.selectedItem;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && selectedItem !== oldSelection) {\n      this.trigger('coral-tablist:change', {\n        oldSelection: oldSelection,\n        selection: selectedItem\n      });\n\n      this._oldSelection = selectedItem;\n    }\n  }\n\n  /**\n   Returns {@link TabList} sizes.\n\n   @return {TabListSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link TabList} orientation options.\n\n   @return {TabListOrientationEnum}\n   */\n  static get orientation() {\n    return orientation;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['target', 'size', 'orientation']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // adds the role to support accessibility\n    this.setAttribute('role', 'tablist');\n    this.setAttribute('aria-multiselectable', 'false');\n\n    // Default reflected attributes\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n    if (!this._orientation) {\n      this.orientation = orientation.HORIZONTAL;\n    }\n\n    // Support cloneNode\n    const template = this.querySelector('._coral-Tabs-selectionIndicator');\n    if (template) {\n      template.remove();\n    }\n\n    // Insert tab line\n    this.appendChild(this._elements.line);\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItem;\n\n    // Display line once tabList is shown\n    commons.addResizeListener(this, this._setLine);\n  }\n\n  /**\n   Triggered when the {@link TabList} selected item has changed.\n\n   @typedef {CustomEvent} coral-tablist:change\n\n   @property {Tab} event.detail.oldSelection\n   The prior selected item(s).\n   @property {Tab} event.detail.selection\n   The newly selected item(s).\n   */\n}\n\nexport default TabList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2068,
    "kind": "typedef",
    "name": "TabListSizeEnum",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabListSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link TabList} sizes.",
    "lineNumber": 31,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small-sized tablist."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A medium-sized tablist. This is the default."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "A large-sized tablist."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TabListSizeEnum"
    }
  },
  {
    "__docId__": 2069,
    "kind": "typedef",
    "name": "TabListOrientationEnum",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabListOrientationEnum",
    "access": "public",
    "description": "Enumeration for {@link TabList} orientations.",
    "lineNumber": 47,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Horizontal TabList, this is the default value."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Vertical TabList."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TabListOrientationEnum"
    }
  },
  {
    "__docId__": 2070,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 53,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2071,
    "kind": "class",
    "name": "TabList",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{TabList}",
    "description": "A TabList component holds a collection of tabs.",
    "lineNumber": 62,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.TabList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A TabList component holds a collection of tabs."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tablist"
      }
    ],
    "interface": false,
    "extends": [
      "HTMLElement",
      "BaseComponent"
    ],
    "expressionExtends": "BaseComponent(HTMLElement)",
    "examples": [
      "<caption>Markup</caption>\n<coral-tablist></coral-tablist>",
      "<caption>JS constructor</caption>\nnew Coral.TabList();"
    ],
    "see": [
      "../examples/#tablist"
    ]
  },
  {
    "__docId__": 2072,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 64,
    "ignore": true
  },
  {
    "__docId__": 2073,
    "kind": "member",
    "name": "_elements",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_elements",
    "access": "private",
    "description": null,
    "lineNumber": 68,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 2074,
    "kind": "member",
    "name": "_oldSelection",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_oldSelection",
    "access": "private",
    "description": null,
    "lineNumber": 92,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2075,
    "kind": "member",
    "name": "_timeout",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_timeout",
    "access": "private",
    "description": null,
    "lineNumber": 95,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2076,
    "kind": "member",
    "name": "_wait",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_wait",
    "access": "private",
    "description": null,
    "lineNumber": 97,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "number"
      ]
    }
  },
  {
    "__docId__": 2078,
    "kind": "member",
    "name": "items",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#items",
    "access": "public",
    "description": "The Collection Interface that allows interacting with the items that the component contains.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 111,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "SelectableCollection"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2079,
    "kind": "member",
    "name": "_items",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_items",
    "access": "private",
    "description": null,
    "lineNumber": 114,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2080,
    "kind": "member",
    "name": "selectedItem",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#selectedItem",
    "access": "public",
    "description": "The selected item in the TabList.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 130,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2081,
    "kind": "member",
    "name": "target",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#target",
    "access": "public",
    "description": "The target component that will be linked to the TabList. It accepts either a CSS selector or a DOM element. If a\nCSS Selector is provided, the first matching element will be used. Items will be selected based on the index. If\nboth target and {@link Coral.Tab#target} are set, the second will have higher priority.\n<ul><li><code>null</code> by default.</li></ul>",
    "lineNumber": 143,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "null"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "target"
      }
    ],
    "type": {
      "nullable": true,
      "types": [
        "HTMLElement",
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2083,
    "kind": "member",
    "name": "_target",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_target",
    "access": "private",
    "description": null,
    "lineNumber": 149,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2084,
    "kind": "member",
    "name": "_targetDebouncedId",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_targetDebouncedId",
    "access": "private",
    "description": null,
    "lineNumber": 153,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2085,
    "kind": "member",
    "name": "size",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#size",
    "access": "public",
    "description": "The size of the TabList. It accepts both lower and upper case sizes. Currently only \"M\" (the default) and \"L\"\nare available.\nSee {@link TabListSizeEnum}.\n<ul><li><code>TabListSizeEnum.MEDIUM</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 207,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "TabListSizeEnum.MEDIUM"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "size"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2087,
    "kind": "member",
    "name": "_size",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_size",
    "access": "private",
    "description": null,
    "lineNumber": 213,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2088,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#orientation",
    "access": "public",
    "description": "Orientation of the TabList. See {@link TabListOrientationEnum}.\n<ul><li><code>TabListOrientationEnum.HORIZONTAL</code> by default.</li><li><code>reflected</code></li></ul>",
    "lineNumber": 234,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "TabListOrientationEnum.HORIZONTAL"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "orientation"
      },
      {
        "tagName": "@htmlattributereflected",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2090,
    "kind": "member",
    "name": "_orientation",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_orientation",
    "access": "private",
    "description": null,
    "lineNumber": 242,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2091,
    "kind": "member",
    "name": "_previousOrientation",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_previousOrientation",
    "access": "private",
    "description": null,
    "lineNumber": 244,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2092,
    "kind": "method",
    "name": "_onItemAdded",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onItemAdded",
    "access": "private",
    "description": null,
    "lineNumber": 255,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2093,
    "kind": "method",
    "name": "_onItemRemoved",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onItemRemoved",
    "access": "private",
    "description": null,
    "lineNumber": 264,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2094,
    "kind": "method",
    "name": "_onTabClick",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onTabClick",
    "access": "private",
    "description": null,
    "lineNumber": 271,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2095,
    "kind": "method",
    "name": "_onHomeKey",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onHomeKey",
    "access": "private",
    "description": null,
    "lineNumber": 281,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2096,
    "kind": "method",
    "name": "_onEndKey",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onEndKey",
    "access": "private",
    "description": null,
    "lineNumber": 289,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2097,
    "kind": "method",
    "name": "_selectNextItem",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_selectNextItem",
    "access": "private",
    "description": null,
    "lineNumber": 297,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2098,
    "kind": "method",
    "name": "_selectPreviousItem",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_selectPreviousItem",
    "access": "private",
    "description": null,
    "lineNumber": 305,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2099,
    "kind": "method",
    "name": "_toggleItemSelectionAndFocus",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_toggleItemSelectionAndFocus",
    "access": "private",
    "description": null,
    "lineNumber": 313,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2100,
    "kind": "method",
    "name": "_onItemSelectedChanged",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onItemSelectedChanged",
    "access": "private",
    "description": null,
    "lineNumber": 321,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2101,
    "kind": "method",
    "name": "_onValidateSelection",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_onValidateSelection",
    "access": "private",
    "description": null,
    "lineNumber": 328,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2102,
    "kind": "method",
    "name": "_selectFirstItem",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_selectFirstItem",
    "access": "private",
    "description": null,
    "lineNumber": 335,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2103,
    "kind": "method",
    "name": "_validateSelection",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_validateSelection",
    "access": "private",
    "description": null,
    "lineNumber": 343,
    "ignore": true,
    "params": [
      {
        "name": "item",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2104,
    "kind": "member",
    "name": "_preventTriggeringEvents",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_preventTriggeringEvents",
    "access": "private",
    "description": null,
    "lineNumber": 360,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2108,
    "kind": "method",
    "name": "_setLine",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_setLine",
    "access": "private",
    "description": null,
    "lineNumber": 393,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2110,
    "kind": "method",
    "name": "_triggerChangeEvent",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#_triggerChangeEvent",
    "access": "private",
    "description": null,
    "lineNumber": 433,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2112,
    "kind": "member",
    "name": "size",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList.size",
    "access": "public",
    "description": "Returns {@link TabList} sizes.",
    "lineNumber": 452,
    "return": {
      "nullable": null,
      "types": [
        "TabListSizeEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2113,
    "kind": "member",
    "name": "orientation",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList.orientation",
    "access": "public",
    "description": "Returns {@link TabList} orientation options.",
    "lineNumber": 461,
    "return": {
      "nullable": null,
      "types": [
        "TabListOrientationEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2114,
    "kind": "member",
    "name": "observedAttributes",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList.observedAttributes",
    "access": "public",
    "description": null,
    "lineNumber": 466,
    "ignore": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2115,
    "kind": "method",
    "name": "render",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList#render",
    "access": "public",
    "description": null,
    "lineNumber": 471,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2116,
    "kind": "typedef",
    "name": "coral-tablist:change",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList",
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/TabList.js~TabList.coral-tablist:change",
    "access": "public",
    "description": "Triggered when the {@link TabList} selected item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Tab"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.oldSelection",
        "description": "The prior selected item(s)."
      },
      {
        "nullable": null,
        "types": [
          "Tab"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.selection",
        "description": "The newly selected item(s)."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tablist:change"
    }
  },
  {
    "__docId__": 2122,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tablist/src/scripts/getTarget.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Gets the target panel of the item.\n\n @private\n @param {HTMLElement|String} [targetValue]\n A specific target value to use.\n\n @returns {?HTMLElement}\n */\nexport default function getTarget(targetValue) {\n  if (targetValue instanceof Node) {\n    // Just return the provided Node\n    return targetValue;\n  }\n\n  // Dynamically get the target node based on target\n  let newTarget = null;\n  if (typeof targetValue === 'string' && targetValue.trim() !== '') {\n    newTarget = document.querySelector(targetValue);\n  }\n\n  return newTarget;\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tablist/src/scripts/getTarget.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2123,
    "kind": "function",
    "name": "getTarget",
    "memberof": "coral-spectrum/coral-component-tablist/src/scripts/getTarget.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tablist/src/scripts/getTarget.js~getTarget",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{getTarget}",
    "description": "Gets the target panel of the item.",
    "lineNumber": 22,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{?HTMLElement}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement",
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "targetValue",
        "description": "A specific target value to use."
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 2124,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-panelstack';\nimport '../../../coral-component-tablist';\nimport {commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link TabView} orientations.\n\n @typedef {Object} TabViewOrientationEnum\n\n @property {String} HORIZONTAL\n Tabs on top of the panels. This is the default.\n @property {String} VERTICAL\n Tabs are rendered on the side and match the height of the panels.\n */\n\nconst orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical'\n};\n\n// the tabview's base classname\nconst CLASSNAME = '_coral-TabView';\n\n/**\n @class Coral.TabView\n @classdesc A TabView component is the wrapping container used to create the typical Tabbed pattern.\n This is intended to be used with a {@link TabList} and {@link PanelStack}.\n @htmltag coral-tabview\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst TabView = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone elements\n      tabList: this.querySelector('coral-tablist') || document.createElement('coral-tablist'),\n      panelStack: this.querySelector('coral-panelstack') || document.createElement('coral-panelstack')\n    };\n\n    // Events\n    this._delegateEvents({\n      'coral-tablist:change > coral-tablist': '_onTabListChange',\n      'coral-panelstack:change > coral-panelstack': '_onPanelStackChange',\n      'coral-collection:add > coral-tablist': '_syncTabListAndPanelStack',\n      'coral-collection:remove > coral-tablist': '_syncTabListAndPanelStack',\n      'coral-collection:add > coral-panelstack': '_syncTabListAndPanelStack',\n      'coral-collection:remove > coral-panelstack': '_syncTabListAndPanelStack'\n    });\n  }\n\n  /**\n   The TabView's orientation. See {@link TabViewOrientationEnum}.\n\n   @type {String}\n   @default TabViewOrientationEnum.HORIZONTAL\n   @htmlattribute orientation\n   @htmlattributereflected\n   */\n  get orientation() {\n    return this._elements.tabList.getAttribute('orientation') || orientation.HORIZONTAL;\n  }\n\n  set orientation(value) {\n    // We rely on the tablist orientation enum so don't need to double check enums\n    this._elements.tabList.setAttribute('orientation', value);\n    this._reflectAttribute('orientation', this.orientation);\n\n    this.classList[this.orientation === orientation.VERTICAL ? 'add' : 'remove'](`${CLASSNAME}--vertical`);\n  }\n\n  /**\n   The TabList which handles all the tabs.\n\n   @type {TabList}\n   @contentzone\n   */\n  get tabList() {\n    return this._getContentZone(this._elements.tabList);\n  }\n\n  set tabList(value) {\n    // Support nested coral-tablist\n    if (value instanceof HTMLElement && !value.parentNode || value.parentNode === this) {\n      this._setContentZone('tabList', value, {\n        handle: 'tabList',\n        tagName: 'coral-tablist',\n        insert: function (tabs) {\n          tabs.setAttribute('tracking', 'off');\n          this.insertBefore(tabs, this._elements.panelStack || null);\n        }\n      });\n    }\n  }\n\n  /**\n   The PanelStack which contains all the panels.\n\n   @type {PanelStack}\n   @contentzone\n   */\n  get panelStack() {\n    return this._getContentZone(this._elements.panelStack);\n  }\n\n  set panelStack(value) {\n    // Support nested coral-panelstack\n    if (value instanceof HTMLElement && !value.parentNode || value.parentNode === this) {\n      this._setContentZone('panelStack', value, {\n        handle: 'panelStack',\n        tagName: 'coral-panelstack',\n        insert: function (panels) {\n          this.appendChild(panels);\n          this._onNewPanelStack(panels);\n        }\n      });\n    }\n  }\n\n  /**\n   * This helps in syncing the tablist with new panelstack.\n   * This helpful when panelstack is changed for tabview dynamically. \n   * @param {PanelStack} panels new/updated panelstack\n   */\n  _onNewPanelStack(panels) {\n    const tabs = this._elements.tabList;\n\n    // Bind the tablist and panel stack together, using the panel id\n    panels.id = panels.id || commons.getUID();\n    tabs.setAttribute('target', `#${panels.id}`);\n\n    if(tabs.selectedItem) {\n      tabs.selectedItem.selected = true;\n    }\n  }\n\n  /**\n   Detects a change in the TabList and triggers an event.\n\n   @private\n   */\n  _onTabListChange(event) {\n    this.trigger('coral-tabview:change', {\n      selection: event.detail.selection,\n      oldSelection: event.detail.oldSelection\n    });\n  }\n\n  /** @private */\n  _onPanelStackChange(event) {\n    // everytime the panelstack changes, we verify that the tablist and panelstack are up to date\n    if (event.detail.selection) {\n      const tabSelector = event.detail.selection.getAttribute('aria-labelledby');\n      const tab = document.getElementById(tabSelector);\n\n      // we select the tab if this was not the case\n      if (tab) {\n        if (!tab.hasAttribute('selected')) {\n          tab.setAttribute('selected', '');\n        } else {\n          this._trackEvent('display', 'coral-tab', event, event.detail.selection);\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _syncTabListAndPanelStack() {\n    this._elements.tabList.target = this._elements.tabList.target;\n  }\n\n  get _contentZones() {\n    return {\n      'coral-tablist': 'tabList',\n      'coral-panelstack': 'panelStack'\n    };\n  }\n\n  /**\n   Returns {@link TabView} orientation options.\n\n   @return {TabViewOrientationEnum}\n   */\n  static get orientation() {\n    return orientation;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['orientation']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._orientation) {\n      this.orientation = this.orientation;\n    }\n\n    // Fetch or create the content zone elements\n    const tabs = this._elements.tabList;\n    const panels = this._elements.panelStack;\n\n    // Bind the tablist and panel stack together, using the panel id\n    panels.id = panels.id || commons.getUID();\n    tabs.setAttribute('target', `#${panels.id}`);\n\n    // Assign the content zones.\n    this.panelStack = panels;\n    this.tabList = tabs;\n  }\n\n  /**\n   Triggered when the {@link TabView} selected tab panel item has changed.\n\n   @typedef {CustomEvent} coral-tabview:change\n\n   @property {Tab} event.detail.selection\n   The new selected tab panel item.\n   @param {Tab} event.detail.oldSelection\n   The prior selected tab panel item.\n   */\n});\n\nexport default TabView;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2125,
    "kind": "typedef",
    "name": "TabViewOrientationEnum",
    "memberof": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js~TabViewOrientationEnum",
    "access": "public",
    "description": "Enumeration for {@link TabView} orientations.",
    "lineNumber": 30,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Tabs on top of the panels. This is the default."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Tabs are rendered on the side and match the height of the panels."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TabViewOrientationEnum"
    }
  },
  {
    "__docId__": 2126,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2127,
    "kind": "variable",
    "name": "TabView",
    "memberof": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js~TabView",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{TabView}",
    "description": "A TabView component is the wrapping container used to create the typical Tabbed pattern.\nThis is intended to be used with a {@link TabList} and {@link PanelStack}.",
    "lineNumber": 46,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.TabView"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A TabView component is the wrapping container used to create the typical Tabbed pattern.\nThis is intended to be used with a {@link TabList} and {@link PanelStack}."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tabview"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tabview></coral-tabview>",
      "<caption>JS constructor</caption>\nnew Coral.TabView();"
    ],
    "see": [
      "../examples/#tabview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2128,
    "kind": "typedef",
    "name": "coral-tabview:change",
    "memberof": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tabview/src/scripts/TabView.js~coral-tabview:change",
    "access": "public",
    "description": "Triggered when the {@link TabView} selected tab panel item has changed.",
    "params": [
      {
        "nullable": null,
        "types": [
          "Tab"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.oldSelection",
        "description": "The prior selected tab panel item."
      }
    ],
    "properties": [
      {
        "nullable": null,
        "types": [
          "Tab"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.selection",
        "description": "The new selected tab panel item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tabview:change"
    }
  },
  {
    "__docId__": 2129,
    "kind": "file",
    "name": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport '../../../coral-component-button';\nimport {Icon} from '../../../coral-component-icon';\nimport base from '../templates/base';\nimport {transform, validate, events, i18n, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Tags-item';\nconst LABEL_CLASSNAME = '_coral-Label';\n\n/**\n Enumeration for {@link Tag} sizes. Only colored tags can have different sizes.\n\n @typedef {Object} TagSizeEnum\n\n @property {String} SMALL\n A small sized tag.\n @property {String} MEDIUM\n A default sized tag.\n @property {String} LARGE\n A large sized tag.\n */\nconst size = {\n  SMALL: 'S',\n  MEDIUM: 'M',\n  LARGE: 'L'\n};\n\n/**\n Enumeration for {@link Tag} colors.\n\n @typedef {Object} TagColorEnum\n\n @property {String} DEFAULT\n @property {String} GREY\n @property {String} BLUE\n @property {String} RED\n @property {String} ORANGE\n @property {String} GREEN\n @property {String} YELLOW\n @property {String} SEA_FOAM\n @property {String} FUCHSIA\n @property {String} LIGHT_BLUE\n Not supported. Falls back to BLUE.\n @property {String} PERIWINKLE\n Not supported. Falls back to BLUE.\n @property {String} CYAN\n Not supported. Falls back to BLUE.\n @property {String} PLUM\n Not supported. Falls back to RED.\n @property {String} MAGENTA\n Not supported. Falls back to RED.\n @property {String} TANGERINE\n Not supported. Falls back to ORANGE.\n @property {String} CHARTREUSE\n Not supported. Falls back to GREEN.\n @property {String} KELLY_GREEN\n Not supported. Falls back to GREEN.\n */\nconst color = {\n  DEFAULT: '',\n  GREY: 'grey',\n  BLUE: 'blue',\n  RED: 'red',\n  ORANGE: 'orange',\n  GREEN: 'green',\n  LIGHT_BLUE: 'lightblue',\n  PERIWINKLE: 'periwinkle',\n  PLUM: 'plum',\n  FUCHSIA: 'fuchsia',\n  MAGENTA: 'magenta',\n  TANGERINE: 'tangerine',\n  YELLOW: 'yellow',\n  CHARTREUSE: 'chartreuse',\n  KELLY_GREEN: 'kellygreen',\n  SEA_FOAM: 'seafoam',\n  CYAN: 'cyan'\n};\n\nconst colorMap = {\n  lightblue: 'blue',\n  periwinkle: 'blue',\n  cyan: 'blue',\n  plum: 'red',\n  magenta: 'red',\n  tangerine: 'orange',\n  chartreuse: 'green',\n  kelly_green: 'green'\n};\n\nconst swappedSize = commons.swapKeysAndValues(size);\n\n// builds a string containing all possible color classnames. this will be used to remove classnames when the color\n// changes\nconst ALL_COLOR_CLASSES = [];\nfor (const colorValue in color) {\n  ALL_COLOR_CLASSES.push(`${LABEL_CLASSNAME}--${color[colorValue]}`);\n}\n\n// builds a string containing all possible size classnames. this will be used to remove classnames when the size\n// changes\nconst ALL_SIZE_CLASSES = [];\nfor (const sizeValue in Object.keys(size)) {\n  ALL_SIZE_CLASSES.push(`${LABEL_CLASSNAME}--${sizeValue}`);\n}\n\nconst QUIET_CLASSNAME = `${CLASSNAME}--quiet`;\nconst MULTILINE_CLASSNAME = `${CLASSNAME}--multiline`;\n\n// Store coordinates of a mouse down event to compare against mouseup coordinates.\nlet bullsEye = null;\n\n// Utility method to detect center point of an element.\nconst getOffsetCenter = (element) => {\n  const rect = element.getBoundingClientRect();\n  const body = document.body;\n  const documentElement = document.documentElement;\n  const scrollTop = window.pageYOffset || documentElement.scrollTop || body.scrollTop;\n  const scrollLeft = window.pageXOffset || documentElement.scrollLeft || body.scrollLeft;\n  const clientTop = documentElement.clientTop || body.clientTop || 0;\n  const clientLeft = documentElement.clientLeft || body.clientLeft || 0;\n  const x = rect.left + rect.width / 2 + scrollLeft - clientLeft;\n  const y = rect.top + rect.height / 2 + scrollTop - clientTop;\n  return {\n    x: Math.round(x),\n    y: Math.round(y)\n  };\n};\n\n/**\n @class Coral.Tag\n @classdesc A Tag component\n @htmltag coral-tag\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Tag = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      'click [handle=\"button\"]': '_onRemoveButtonClick',\n      'key:backspace': '_onRemoveButtonClick',\n      'key:delete': '_onRemoveButtonClick'\n    });\n\n    // Prepare templates\n    this._elements = {\n      // Create or fetch the label element.\n      label: this.querySelector('coral-tag-label') || document.createElement('coral-tag-label')\n    };\n    base.call(this._elements, {i18n, Icon});\n  }\n\n  /**\n   The tag's label element.\n\n   @type {TagLabel}\n   @contentzone\n   */\n  get label() {\n    return this._getContentZone(this._elements.label);\n  }\n\n  set label(value) {\n    this._setContentZone('label', value, {\n      handle: 'label',\n      tagName: 'coral-tag-label',\n      insert: function (label) {\n        label.classList.add(`${CLASSNAME}Label`);\n        this.insertBefore(label, this.firstChild);\n        this._updateAriaLabel();\n      }\n    });\n  }\n\n  /**\n   Whether this component can be closed.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute closable\n   @htmlattributereflected\n   */\n  get closable() {\n    return this._closable || false;\n  }\n\n  set closable(value) {\n    this._closable = transform.booleanAttr(value);\n    this._reflectAttribute('closable', this._closable);\n\n    // Only tags are closable\n    this._toggleTagVariant();\n\n    if (this._closable && !this.contains(this._elements.buttonCell)) {\n      // Insert the buttonCell if it was not added to the DOM\n      this.appendChild(this._elements.buttonCell);\n    }\n\n    this._elements.button.hidden = !this._closable;\n    this._elements.button.tabIndex = this._elements.button.hidden ? -1 : 0;\n    this._elements.buttonCell.hidden = !this._closable;\n    this._updateAriaLabel();\n  }\n\n  /**\n   Value of the tag. If not explicitly set, the value of <code>Node.textContent</code> is returned.\n\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return typeof this._value === 'string' ? this._value : this.textContent.replace(/\\s{2,}/g, ' ').trim();\n  }\n\n  set value(value) {\n    let _value = transform.string(value);\n\n    this._value = _value;\n    this._reflectAttribute('value', this._value);\n\n    this.trigger('coral-tag:_valuechanged');\n  }\n\n  /**\n   A quiet tag to differentiate it from default tag.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute quiet\n   @htmlattributereflected\n   */\n  get quiet() {\n    return this._quiet || false;\n  }\n\n  set quiet(value) {\n    this._quiet = transform.booleanAttr(value);\n    this._reflectAttribute('quiet', this._quiet);\n\n    // Only tags are quiet\n    this._toggleTagVariant();\n  }\n\n  /**\n   A multiline tag for block-level layout with multiline text.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute multiline\n   @htmlattributereflected\n   */\n  get multiline() {\n    return this._multiline || false;\n  }\n\n  set multiline(value) {\n    this._multiline = transform.booleanAttr(value);\n    this._reflectAttribute('multiline', this._multiline);\n\n    this.classList.toggle(MULTILINE_CLASSNAME, this._multiline);\n  }\n\n  /**\n   The tag's size. See {@link {TagSizeEnum}. Only colored tags can have different sizes.\n\n   @type {String}\n   @default TagSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = this._host ? size.MEDIUM : transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    this._reflectAttribute('size', this._size);\n\n    this._toggleTagVariant();\n  }\n\n  /**\n   The tags's color. See {@link TagColorEnum}.\n\n   @type {String}\n   @default Coral.Tag.color.DEFAULT\n   @htmlattribute color\n   @htmlattributereflected\n   */\n  get color() {\n    return this._color || color.DEFAULT;\n  }\n\n  set color(value) {\n    value = this._host ? color.DEFAULT : transform.string(value).toLowerCase();\n    this._color = validate.enumeration(color)(value) && value || color.DEFAULT;\n\n    // Map unsupported colors\n    if (Object.keys(colorMap).indexOf(this._color) !== -1) {\n      this._color = colorMap[this._color];\n    }\n\n    this._reflectAttribute('color', this._color);\n\n    this._toggleTagVariant();\n  }\n\n  /**\n   Toggle between Tag and Label styles\n\n   @private\n   */\n  _toggleTagVariant() {\n    const isColored = this.color !== color.DEFAULT;\n\n    // Base\n    this.classList.toggle(CLASSNAME, !isColored);\n    this.classList.toggle(LABEL_CLASSNAME, isColored);\n\n    // Closable\n    this.classList.toggle(`${CLASSNAME}--deletable`, !isColored);\n\n    // Quiet\n    this.classList.toggle(QUIET_CLASSNAME, !isColored && this.quiet);\n\n    // Size\n    this.classList.remove(...ALL_SIZE_CLASSES);\n    this.classList.toggle(`${LABEL_CLASSNAME}--${swappedSize[this.size].toLowerCase()}`, isColored);\n\n    // Color\n    this.classList.remove(...ALL_COLOR_CLASSES);\n    this.classList.toggle(`${LABEL_CLASSNAME}--${this.color}`, isColored);\n  }\n\n  /**\n   Inherited from {@link BaseComponent#trackingElement}.\n   */\n  get trackingElement() {\n    // it uses the name as the first fallback since it is not localized, otherwise it uses the label\n    return typeof this._trackingElement === 'undefined' ?\n      // keep spaces to only 1 max and trim. this mimics native html behaviors\n      this.value || (this.label || this).textContent.replace(/\\s{2,}/g, ' ').trim() :\n      this._trackingElement;\n  }\n\n  set trackingElement(value) {\n    super.trackingElement = value;\n  }\n\n  /** @private */\n  _onRemoveButtonClick(event) {\n    event.preventDefault();\n    if (this.closable && !this._elements.button.disabled) {\n      event.stopPropagation();\n      this.focus();\n\n      const host = this._host;\n      this.remove();\n\n      if (host) {\n        host._onTagButtonClicked(this, event);\n      }\n    }\n  }\n\n  /**\n   Updates the aria-label property from the button and label elements.\n\n   @ignore\n   */\n  _updateAriaLabel() {\n    const button = this._elements.button;\n    const buttonCell = this._elements.buttonCell;\n    const label = this._elements.label;\n\n    // In the edge case that this is a Tag without a TagList,\n    // just treat the Tag as a container element without special labelling.\n    if (this.getAttribute('role') !== 'row') {\n      buttonCell.removeAttribute('role');\n      label.removeAttribute('role');\n      if (this.getAttribute('aria-labelledby') === label.id) {\n        this.removeAttribute('aria-labelledby');\n      }\n      return;\n    }\n\n    buttonCell.setAttribute('role', 'gridcell');\n    label.setAttribute('role', this._closable ? 'rowheader' : 'gridcell');\n\n    const buttonAriaLabel = button.getAttribute('title');\n    const labelTextContent = label.textContent;\n\n    // button should be labelled, \"Remove: labelTextContent\".\n    button.setAttribute('aria-label', `${buttonAriaLabel}: ${labelTextContent}`);\n\n    if (!label.id) {\n      label.id = commons.getUID();\n    }\n    this.setAttribute('aria-labelledby', label.id);\n  }\n\n  get _contentZones() {\n    return {'coral-tag-label': 'label'};\n  }\n\n  /**\n   Returns {@link Tag} sizes.\n\n   @return {TagSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link Tag} colors.\n\n   @return {TagColorEnum}\n   */\n  static get color() {\n    return color;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'closable',\n      'value',\n      'quiet',\n      'multiline',\n      'size',\n      'color',\n      'disabled',\n      'role'\n    ]);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    // This is required by TagList but we don't need to expose disabled publicly as API\n    if (name === 'disabled') {\n      this._elements.button.disabled = value;\n    }\n    // This is required by TagList but we don't need to expose disabled publicly as API\n    else if (name === 'role') {\n      this._updateAriaLabel();\n    } else {\n      super.attributeChangedCallback(name, oldValue, value);\n    }\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Used to inform the tag list that it's added\n    this.trigger('coral-tag:_connected');\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    // Default reflected attributes\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n    if (!this._color) {\n      this.color = color.DEFAULT;\n    }\n\n    const templateHandleNames = ['input', 'button', 'buttonCell'];\n\n    const label = this._elements.label;\n\n    // Remove it so we can process children\n    if (label.parentNode) {\n      this.removeChild(label);\n    }\n\n    // Process remaining elements as necessary\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the label\n        label.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Assign the content zones, moving them into place in the process\n    this.label = label;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    // Used to inform the tag list that it's removed synchronously\n    if (this._host) {\n      this._host._onItemDisconnected(this);\n    }\n  }\n\n  /**\n   Triggered when the {@link Tag} value is changed.\n\n   @typedef {CustomEvent} coral-tag:_valuechanged\n\n   @private\n   */\n\n  /**\n   Triggered when the {@link Tag} is added to the document.\n\n   @typedef {CustomEvent} coral-tag:_connected\n\n   @private\n   */\n});\n\nexport default Tag;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2130,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2131,
    "kind": "variable",
    "name": "LABEL_CLASSNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~LABEL_CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2132,
    "kind": "typedef",
    "name": "TagSizeEnum",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~TagSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Tag} sizes. Only colored tags can have different sizes.",
    "lineNumber": 35,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small sized tag."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A default sized tag."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "A large sized tag."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TagSizeEnum"
    }
  },
  {
    "__docId__": 2133,
    "kind": "typedef",
    "name": "TagColorEnum",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~TagColorEnum",
    "access": "public",
    "description": "Enumeration for {@link Tag} colors.",
    "lineNumber": 72,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "GREY",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "BLUE",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RED",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ORANGE",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "GREEN",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "YELLOW",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SEA_FOAM",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FUCHSIA",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LIGHT_BLUE",
        "description": "Not supported. Falls back to BLUE."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PERIWINKLE",
        "description": "Not supported. Falls back to BLUE."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CYAN",
        "description": "Not supported. Falls back to BLUE."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "PLUM",
        "description": "Not supported. Falls back to RED."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MAGENTA",
        "description": "Not supported. Falls back to RED."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "TANGERINE",
        "description": "Not supported. Falls back to ORANGE."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CHARTREUSE",
        "description": "Not supported. Falls back to GREEN."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "KELLY_GREEN",
        "description": "Not supported. Falls back to GREEN."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TagColorEnum"
    }
  },
  {
    "__docId__": 2134,
    "kind": "variable",
    "name": "colorMap",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~colorMap",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 92,
    "undocument": true,
    "type": {
      "types": [
        "{\"lightblue\": string, \"periwinkle\": string, \"cyan\": string, \"plum\": string, \"magenta\": string, \"tangerine\": string, \"chartreuse\": string, \"kelly_green\": string}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2135,
    "kind": "variable",
    "name": "swappedSize",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~swappedSize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 103,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2136,
    "kind": "variable",
    "name": "ALL_COLOR_CLASSES",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~ALL_COLOR_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 107,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2137,
    "kind": "variable",
    "name": "ALL_SIZE_CLASSES",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~ALL_SIZE_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 114,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2138,
    "kind": "variable",
    "name": "QUIET_CLASSNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~QUIET_CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 119,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2139,
    "kind": "variable",
    "name": "MULTILINE_CLASSNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~MULTILINE_CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 120,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2140,
    "kind": "variable",
    "name": "bullsEye",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~bullsEye",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 123,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2141,
    "kind": "function",
    "name": "getOffsetCenter",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~getOffsetCenter",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 126,
    "undocument": true,
    "params": [
      {
        "name": "element",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "{\"x\": *, \"y\": *}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2142,
    "kind": "variable",
    "name": "Tag",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~Tag",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tag}",
    "description": "A Tag component",
    "lineNumber": 149,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tag"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Tag component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tag"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tag></coral-tag>",
      "<caption>JS constructor</caption>\nnew Coral.Tag();"
    ],
    "see": [
      "../examples/#taglist"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2143,
    "kind": "typedef",
    "name": "coral-tag:_valuechanged",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~coral-tag:_valuechanged",
    "access": "private",
    "description": "Triggered when the {@link Tag} value is changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tag:_valuechanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2144,
    "kind": "typedef",
    "name": "coral-tag:_connected",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/Tag.js~coral-tag:_connected",
    "access": "private",
    "description": "Triggered when the {@link Tag} is added to the document.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tag:_connected"
    },
    "ignore": true
  },
  {
    "__docId__": 2145,
    "kind": "file",
    "name": "coral-spectrum/coral-component-taglist/src/scripts/TagLabel.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Tag.Label\n @classdesc Tag's label component\n @htmltag coral-tag-label\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-tag-label');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-taglist/src/scripts/TagLabel.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2146,
    "kind": "function",
    "name": "TagLabel",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/TagLabel.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/TagLabel.js~TagLabel",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tag}",
    "description": "Tag's label component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tag.Label"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Tag's label component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tag-label"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-tag-label></coral-tag-label>",
      "<caption>JS constructor</caption>\nnew Coral.Tag.Label();"
    ],
    "see": [
      "../examples/#taglist"
    ],
    "params": []
  },
  {
    "__docId__": 2147,
    "kind": "file",
    "name": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport Tag from './Tag';\nimport {Collection} from '../../../coral-collection';\nimport {transform, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Tags';\n// Collection\nconst ITEM_TAGNAME = 'coral-tag';\n\n/**\n Extracts the value from the item in case no explicit value was provided.\n @param {HTMLElement} item\n the item whose value will be extracted.\n @returns {String} the value that will be submitted for this item.\n @private\n */\nconst itemValueFromDOM = function (item) {\n  const attr = item.getAttribute('value');\n  // checking explicitly for null allows to differentiate between non set values and empty strings\n  return attr !== null ? attr : item.textContent.replace(/\\s{2,}/g, ' ').trim();\n};\n\n/**\n @class Coral.TagList\n @classdesc A TagList component is a form field container to manipulate tags.\n @htmltag coral-taglist\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst TagList = Decorator(class extends BaseFormField(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents(commons.extend(this._events, {\n      'capture:focus coral-tag': '_onItemFocus',\n      'capture:blur coral-tag': '_onItemBlur',\n      'key:right coral-tag': '_onNextItemFocus',\n      'key:down coral-tag': '_onNextItemFocus',\n      'key:pagedown coral-tag': '_onNextItemFocus',\n      'key:left coral-tag': '_onPreviousItemFocus',\n      'key:up coral-tag': '_onPreviousItemFocus',\n      'key:pageup coral-tag': '_onPreviousItemFocus',\n      'key:home coral-tag': '_onFirstItemFocus',\n      'key:end coral-tag': '_onLastItemFocus',\n\n      // Accessibility\n      'capture:focus coral-tag:not(.is-disabled)': '_onItemFocusIn',\n      'capture:blur coral-tag:not(.is-disabled)': '_onItemFocusOut',\n\n      // Private\n      'coral-tag:_valuechanged': '_onTagValueChanged',\n      'coral-tag:_connected': '_onTagConnected'\n    }));\n\n    // Pre-define labellable element\n    this._labellableElement = this;\n\n    this._itemToFocusAfterDelete = null;\n  }\n\n  /**\n   Changing the values will redefine the component's items.\n\n   @type {Array.<String>}\n   @emits {change}\n   */\n  get values() {\n    return this.items.getAll().map((item) => item.value);\n  }\n\n  set values(values) {\n    if (Array.isArray(values)) {\n      this.items.clear();\n\n      values.forEach((value) => {\n        const item = new Tag().set({\n          label: {\n            innerHTML: value\n          },\n          value: value\n        });\n\n        this._attachInputToItem(item);\n\n        this.items.add(item);\n      });\n    }\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: ITEM_TAGNAME\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Name used to submit the data in a form.\n   @type {String}\n   @default \"\"\n   @htmlattribute name\n   @htmlattributereflected\n   */\n  get name() {\n    return this._name || '';\n  }\n\n  set name(value) {\n    this._name = transform.string(value);\n    this._reflectAttribute('name', value);\n\n    this.items.getAll().forEach((item) => {\n      if (item._input) {\n        item._input.name = this._name;\n      }\n    });\n  }\n\n  /**\n   This field's current value.\n   @type {String}\n   @default \"\"\n   @htmlattribute value\n   */\n  get value() {\n    const all = this.items.getAll();\n    return all.length ? all[0].value : '';\n  }\n\n  set value(value) {\n    this.items.clear();\n\n    if (value) {\n      const item = new Tag().set({\n        label: {\n          innerHTML: value\n        },\n        value: value\n      });\n\n      this._attachInputToItem(item);\n\n      this.items.add(item);\n    }\n  }\n\n  /**\n   Whether this field is disabled or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this.items.getAll().forEach((item) => {\n      item.classList.toggle('is-disabled', this._disabled);\n      if (item._input) {\n        item._input.disabled = this._disabled;\n      }\n    });\n\n    // a11y\n    this[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n  }\n\n  // JSDoc inherited\n  get invalid() {\n    return super.invalid;\n  }\n\n  set invalid(value) {\n    super.invalid = value;\n\n    this.items.getAll().forEach((item) => {\n      item.classList.toggle('is-invalid', this._invalid);\n    });\n  }\n\n  /**\n   Whether this field is readOnly or not. Indicating that the user cannot modify the value of the control.\n   @type {Boolean}\n   @default false\n   @htmlattribute readonly\n   @htmlattributereflected\n   */\n  get readOnly() {\n    return this._readOnly || false;\n  }\n\n  set readOnly(value) {\n    this._readOnly = transform.booleanAttr(value);\n    this._reflectAttribute('readonly', this._readOnly);\n\n    this.items.getAll().forEach((item) => {\n      item.closable = !this._readOnly;\n    });\n  }\n\n  /**\n   Whether this field is required or not.\n   @type {Boolean}\n   @default false\n   @htmlattribute required\n   @htmlattributereflected\n   */\n  get required() {\n    return this._required || false;\n  }\n\n  set required(value) {\n    this._required = transform.booleanAttr(value);\n    this._reflectAttribute('required', this._required);\n  }\n\n  /** @private */\n  _attachInputToItem(item) {\n    if (!item._input) {\n      item._input = document.createElement('input');\n      item._input.type = 'hidden';\n      // We do this so it is recognized by Coral.Tag and handled if cloned\n      item._input.setAttribute('handle', 'input');\n    }\n\n    const input = item._input;\n\n    input.disabled = this.disabled;\n    input.name = this.name;\n    input.value = item.value;\n\n    if (!item.contains(input)) {\n      item.appendChild(input);\n    }\n  }\n\n  /** @private */\n  _prepareItem(attachedItem) {\n    const items = this.items.getAll();\n\n    // Prevents to add duplicates based on the tag value\n    const duplicate = items.some((tag) => {\n      if (itemValueFromDOM(tag) === itemValueFromDOM(attachedItem) && tag !== attachedItem) {\n        (items.indexOf(tag) < items.indexOf(attachedItem) ? attachedItem : tag).remove();\n        return true;\n      }\n\n      return false;\n    });\n\n    if (duplicate) {\n      return;\n    }\n\n    // create corresponding input field\n    this._attachInputToItem(attachedItem);\n\n    // Set tag defaults\n    attachedItem.setAttribute('color', Tag.color.DEFAULT);\n    attachedItem.setAttribute('size', Tag.size.SMALL);\n\n    // adds the role to support accessibility\n    attachedItem.setAttribute('role', 'row');\n\n    // adds role to parent to support accessibility, if it doesn't already have it\n    if (this.getAttribute('role') === null) {\n      this.setAttribute('role', 'grid');\n    }\n\n    if (!this.disabled) {\n      attachedItem.setAttribute('tabindex', '-1');\n    }\n    attachedItem[this.readOnly ? 'removeAttribute' : 'setAttribute']('closable', '');\n\n    // add tabindex to first item if none existing\n    if (!this.disabled && !this.querySelector(`${ITEM_TAGNAME}[tabindex=\"0\"]`)) {\n      const first = items[0];\n      if (first) {\n        first.setAttribute('tabindex', '0');\n      }\n    }\n\n    // Keep a reference on the host in case the tag gets removed\n    attachedItem._host = this;\n\n    // triggers the Coral.Collection event\n    this.trigger('coral-collection:add', {\n      item: attachedItem\n    });\n  }\n\n  /** @private */\n  _onItemDisconnected(detachedItem) {\n    // Cleans the tag from TagList specific values\n    detachedItem.removeAttribute('role');\n\n    // Removes role from taglist if it has no tag elements\n    if (this.items.length <= 0) {\n      this.removeAttribute('role');\n    }\n\n    detachedItem.removeAttribute('tabindex');\n    detachedItem._host = undefined;\n\n    const parentElement = this.parentElement;\n    if (this.items.length === 0 && parentElement) {\n      // If all tags are removed, call focus method on parent element\n      if (typeof parentElement.focus === 'function') {\n        parentElement.focus();\n      }\n\n      const self = this;\n\n      commons.nextFrame(() => {\n        // if the parentElement did not receive focus or move focus to some other element\n        if (document.activeElement.tagName === 'BODY') {\n          if (this.items.length > 0) {\n            self.items.first().focus();\n          } else {\n            // make the TagList focusable\n            self.tabIndex = -1;\n            self.classList.add('u-coral-screenReaderOnly');\n            self.style.outline = '0';\n            self.innerHTML = ' ';\n            const onBlurFocusManagement = function () {\n              self.removeAttribute('tabindex');\n              self.classList.remove('u-coral-screenReaderOnly');\n              self.style.outline = '';\n              self.innerHTML = '';\n              self._vent.off('blur.focusManagement');\n            };\n            self._vent.on('blur.focusManagement', null, onBlurFocusManagement);\n            if (!parentElement.contains(document.activeElement)) {\n              self.focus();\n            } else {\n              onBlurFocusManagement();\n            }\n          }\n        }\n      });\n    } else if (this._itemToFocusAfterDelete) {\n      this._itemToFocusAfterDelete.focus();\n    }\n\n    // triggers the Coral.Collection event\n    this.trigger('coral-collection:remove', {\n      item: detachedItem\n    });\n  }\n\n  /** @private */\n  _onItemFocus(event) {\n    if (!this.disabled) {\n      this.setAttribute('aria-live', 'polite');\n\n      const tag = event.matchedTarget;\n\n      // add tabindex to first item and remove from previous focused item\n      this.items.getAll().forEach((item) => {\n        if (item !== tag) {\n          item.setAttribute('tabindex', '-1');\n        }\n      });\n      tag.setAttribute('tabindex', '0');\n\n      this._setItemToFocusOnDelete(tag);\n    }\n  }\n\n  /** @private */\n  _onItemBlur(event) {\n    if (!this.disabled) {\n      this.setAttribute('aria-live', 'off');\n\n      const tag = event.matchedTarget;\n\n      this._setItemToFocusOnDelete(tag);\n    }\n  }\n\n  /** @private */\n  _onSiblingItemFocus(event, sibling) {\n    if (!this.disabled) {\n      event.preventDefault();\n\n      let item = event.target[sibling];\n      while (item) {\n        if (item.tagName.toLowerCase() === ITEM_TAGNAME && !item.hidden) {\n          item.focus();\n          break;\n        } else {\n          item = item[sibling];\n        }\n      }\n    }\n  }\n\n  /** @private */\n  _onNextItemFocus(event) {\n    this._onSiblingItemFocus(event, 'nextElementSibling');\n  }\n\n  /** @private */\n  _onPreviousItemFocus(event) {\n    this._onSiblingItemFocus(event, 'previousElementSibling');\n  }\n\n  /** @private */\n  _onFirstItemFocus(event) {\n    event.preventDefault();\n    const length = this.items.length;\n    if (length > 0) {\n      this.items.getAll()[0].focus();\n    }\n  }\n\n  /** @private */\n  _onLastItemFocus(event) {\n    event.preventDefault();\n    const length = this.items.length;\n    if (length > 0) {\n      this.items.getAll()[length - 1].focus();\n    }\n  }\n\n  _onItemFocusIn(event) {\n    event.matchedTarget.classList.add('focus-ring');\n  }\n\n  _onItemFocusOut(event) {\n    event.matchedTarget.classList.remove('focus-ring');\n  }\n\n  /** @private */\n  _onTagButtonClicked(item, event) {\n    this.trigger('change');\n\n    this._trackEvent('remove', 'coral-tag', event, item);\n  }\n\n  /** @private */\n  _onTagValueChanged(event) {\n    event.stopImmediatePropagation();\n\n    const tag = event.target;\n    if (tag._input) {\n      tag._input.value = tag.value;\n    }\n  }\n\n  /** @private */\n  _setItemToFocusOnDelete(tag) {\n    let itemToFocusAfterDelete = tag.nextElementSibling;\n\n    // Next item will be focusable if the focused tag is removed\n    while (itemToFocusAfterDelete) {\n      if (itemToFocusAfterDelete.tagName.toLowerCase() === ITEM_TAGNAME && !itemToFocusAfterDelete.hidden) {\n        this._itemToFocusAfterDelete = itemToFocusAfterDelete;\n        return;\n      }\n\n      itemToFocusAfterDelete = itemToFocusAfterDelete.nextElementSibling;\n    }\n\n    itemToFocusAfterDelete = tag.previousElementSibling;\n    // Previous item will be focusable if the focused tag is removed\n    while (itemToFocusAfterDelete) {\n      if (itemToFocusAfterDelete.tagName.toLowerCase() === ITEM_TAGNAME && !itemToFocusAfterDelete.hidden) {\n        this._itemToFocusAfterDelete = itemToFocusAfterDelete;\n        break;\n      } else {\n        itemToFocusAfterDelete = itemToFocusAfterDelete.previousElementSibling;\n      }\n    }\n\n    window.requestAnimationFrame(() => {\n      if (tag.parentElement !== null && !this.contains(document.activeElement)) {\n        itemToFocusAfterDelete = undefined;\n      }\n    });\n  }\n\n  /** @private */\n  _onTagConnected(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    this._prepareItem(item);\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // reset the values to the initial values\n    this.values = this._initialValues;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'closable',\n      'value',\n      'quiet',\n      'multiline',\n      'size',\n      'color'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // adds the role to support accessibility\n    if (this.items.length > 0) {\n      this.setAttribute('role', 'grid');\n    } else {\n      this.removeAttribute('role');\n    };\n\n    this.setAttribute('aria-live', 'off');\n    this.setAttribute('aria-atomic', 'false');\n    this.setAttribute('aria-relevant', 'additions');\n\n    // Since tagList can have multiple values, we have to store them all to be able to reset them\n    if (this.hasAttribute('value')) {\n      this._initialValues = [this.getAttribute('value')];\n    } else {\n      this._initialValues = this.items.getAll().map((item) => itemValueFromDOM(item));\n    }\n\n    // Prepare items\n    this.items.getAll().forEach((item) => {\n      this._prepareItem(item);\n    });\n  }\n});\n\nexport default TagList;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2148,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2149,
    "kind": "variable",
    "name": "ITEM_TAGNAME",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js~ITEM_TAGNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 22,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2150,
    "kind": "function",
    "name": "itemValueFromDOM",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js~itemValueFromDOM",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Extracts the value from the item in case no explicit value was provided.",
    "lineNumber": 31,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} the value that will be submitted for this item."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "item",
        "description": "the item whose value will be extracted."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "the value that will be submitted for this item."
    },
    "ignore": true
  },
  {
    "__docId__": 2151,
    "kind": "variable",
    "name": "TagList",
    "memberof": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-taglist/src/scripts/TagList.js~TagList",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{TagList}",
    "description": "A TagList component is a form field container to manipulate tags.",
    "lineNumber": 45,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.TagList"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A TagList component is a form field container to manipulate tags."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-taglist"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-taglist></coral-taglist>",
      "<caption>JS constructor</caption>\nnew Coral.TagList();"
    ],
    "see": [
      "../examples/#taglist"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2152,
    "kind": "file",
    "name": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\n// todo ideally there should be a coral-base-textfield to inherit from\nimport '../../../coral-component-textfield';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-Textfield';\n\n/**\n Enumeration for {@link Textarea} variants.\n\n @typedef {Object} TextareaVariantEnum\n\n @property {String} DEFAULT\n A default textarea.\n @property {String} QUIET\n A textarea with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\n// Builds a string containing all possible variant classnames. This will be used to remove classnames when the variant\n// changes\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Textarea\n @classdesc A Textarea component is the default multi-line text form field.\n @htmltag coral-textarea\n @htmlbasetag textarea\n @extends {HTMLTextAreaElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Textarea = Decorator(class extends BaseFormField(BaseComponent(HTMLTextAreaElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(commons.extend(this._events, {\n      input: '_onInput'\n    }));\n  }\n\n  /**\n   The textarea's variant. See {@link TextareaVariantEnum}.\n\n   @type {String}\n   @default TextareaVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    // removes every existing variant\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant !== variant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._variant}`);\n    }\n\n    // Restore the original height\n    if (this._variant === variant.QUIET) {\n      this._defaultHeight = this._defaultHeight || this.style.height;\n    } else {\n      this.style.height = this._defaultHeight;\n      this._defaultHeight = undefined;\n    }\n\n    this._onInput();\n  }\n\n  /**\n   Inherited from {@link BaseFormField#reset}.\n   */\n  reset() {\n    // The textarea uses the textContent to save the old value and not the value attribute\n    /** @ignore */\n    this.value = this.textContent;\n\n    // Reset height if quiet variant\n    this._onInput();\n  }\n\n  /** @private */\n  _onInput() {\n    if (this.variant === variant.QUIET) {\n      requestAnimationFrame(() => {\n        this.style.height = 'auto';\n        this.style.height = `${this.scrollHeight}px`;\n      });\n    }\n  }\n\n  /**\n   Returns {@link Textarea} variants.\n\n   @return {TextareaVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super._nativeObservedAttributes.concat(['variant']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME, `${CLASSNAME}--multiline`);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n  }\n});\n\nexport default Textarea;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2153,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2154,
    "kind": "typedef",
    "name": "TextareaVariantEnum",
    "memberof": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js~TextareaVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Textarea} variants.",
    "lineNumber": 32,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default textarea."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A textarea with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TextareaVariantEnum"
    }
  },
  {
    "__docId__": 2155,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2156,
    "kind": "variable",
    "name": "Textarea",
    "memberof": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textarea/src/scripts/Textarea.js~Textarea",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Textarea}",
    "description": "A Textarea component is the default multi-line text form field.",
    "lineNumber": 53,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Textarea"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Textarea component is the default multi-line text form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-textarea"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "textarea"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLTextAreaElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<textarea is=\"coral-textarea\"></textarea>",
      "<caption>JS constructor</caption>\nnew Coral.Textarea();"
    ],
    "see": [
      "../examples/#textarea"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2157,
    "kind": "file",
    "name": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseFormField} from '../../../coral-base-formfield';\nimport {transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Textfield} variants.\n\n @typedef {Object} TextfieldVariantEnum\n\n @property {String} DEFAULT\n A default textfield.\n @property {String} QUIET\n A textfield with no border or background.\n */\nconst variant = {\n  DEFAULT: 'default',\n  QUIET: 'quiet'\n};\n\n// the textfield's base classname\nconst CLASSNAME = '_coral-Textfield';\n\n// Builds a string containing all possible variant classnames. This will be used to remove classnames when the variant\n// changes\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\n/**\n @class Coral.Textfield\n @classdesc A Textfield component is the default single line text form field.\n @htmltag coral-textfield\n @htmlbasetag input\n @extends {HTMLInputElement}\n @extends {BaseComponent}\n @extends {BaseFormField}\n */\nconst Textfield = Decorator(class extends BaseFormField(BaseComponent(HTMLInputElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents(this._events);\n  }\n\n  /**\n   The textfield's variant. See {@link TextfieldVariantEnum}.\n\n   @type {String}\n   @default TextfieldVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    // removes every existing variant\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    if (this._variant !== variant.DEFAULT) {\n      this.classList.add(`${CLASSNAME}--${this._variant}`);\n    }\n  }\n\n  /**\n   Returns {@link Textfield} variants.\n\n   @return {TextfieldVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super._nativeObservedAttributes.concat(['variant']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n  }\n});\n\nexport default Textfield;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2158,
    "kind": "typedef",
    "name": "TextfieldVariantEnum",
    "memberof": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js~TextfieldVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Textfield} variants.",
    "lineNumber": 28,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default textfield."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "QUIET",
        "description": "A textfield with no border or background."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TextfieldVariantEnum"
    }
  },
  {
    "__docId__": 2159,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 34,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2160,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 38,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2161,
    "kind": "variable",
    "name": "Textfield",
    "memberof": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-textfield/src/scripts/Textfield.js~Textfield",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Textfield}",
    "description": "A Textfield component is the default single line text form field.",
    "lineNumber": 52,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Textfield"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Textfield component is the default single line text form field."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-textfield"
      },
      {
        "tagName": "@htmlbasetag",
        "tagValue": "input"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLInputElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseFormField}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<input is=\"coral-textfield\"></input>",
      "<caption>JS constructor</caption>\nnew Coral.Textfield();"
    ],
    "see": [
      "../examples/#textfield"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2162,
    "kind": "file",
    "name": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {BaseOverlay} from '../../../coral-base-overlay';\nimport {Icon} from '../../../coral-component-icon';\nimport {Button} from '../../../coral-component-button';\nimport base from '../templates/base';\nimport {transform, validate, commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Toast} variants.\n\n @typedef {Object} ToastVariantEnum\n\n @property {String} DEFAULT\n A neutral toast.\n @property {String} ERROR\n A toast to notify that an error has occurred or to warn the user of something important.\n @property {String} SUCCESS\n A toast to notify the user of a successful operation.\n @property {String} INFO\n A toast to notify the user of non-critical information.\n */\nconst variant = {\n  DEFAULT: 'default',\n  ERROR: 'error',\n  SUCCESS: 'success',\n  INFO: 'info'\n};\n\n/**\n Enumeration for {@link Toast} placement values.\n\n @typedef {Object} ToastPlacementEnum\n\n @property {String} LEFT\n A toast anchored to the bottom left of screen.\n @property {String} CENTER\n A toast anchored to the bottom center of screen.\n @property {String} RIGHT\n A toast anchored to the bottom right of screen.\n */\nconst placement = {\n  LEFT: 'left',\n  CENTER: 'center',\n  RIGHT: 'right'\n};\n\nconst CLASSNAME = '_coral-Toast';\n\n// An array of all possible variant\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\nconst PRIORITY_QUEUE = [];\n\nconst queue = (el) => {\n  let priority;\n  const type = transform.string(el.getAttribute('variant')).toLowerCase();\n\n  if (type === variant.ERROR) {\n    priority = el.action ? 1 : 2;\n  } else if (type === variant.SUCCESS) {\n    priority = el.action ? 3 : 6;\n  } else if (type === variant.INFO) {\n    priority = el.action ? 4 : 7;\n  } else {\n    priority = el.action ? 5 : 8;\n  }\n\n  PRIORITY_QUEUE.push({\n    el,\n    priority\n  });\n};\n\nconst unqueue = () => {\n  let next = null;\n  [1, 2, 3, 4, 5, 6, 7, 8].some((priority) => {\n    return PRIORITY_QUEUE.some((item, index) => {\n      if (item.priority === priority) {\n        next = {\n          el: item.el,\n          index\n        };\n\n        return true;\n      }\n    });\n  });\n\n  if (next !== null) {\n    PRIORITY_QUEUE.splice(next.index, 1);\n    next.el.open = true;\n  }\n};\n\n// Used to map icon with variant\nconst capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);\n\n// Restriction filter for action button\nconst isButton = node => (node.nodeName === 'BUTTON' && node.getAttribute('is') === 'coral-button') ||\n  (node.nodeName === 'A' && node.getAttribute('is') === 'coral-anchorbutton');\n\n/**\n @class Coral.Toast\n @classdesc Toasts display brief temporary notifications.\n They are noticeable but do not disrupt the user experience and do not require an action to be taken.\n @htmltag coral-toast\n @extends {HTMLElement}\n @extends {BaseComponent}\n @extends {BaseOverlay}\n */\nconst Toast = Decorator(class extends BaseOverlay(BaseComponent(HTMLElement)) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Debounce wait time in milliseconds\n    this._wait = 50;\n\n    // Override defaults from Overlay\n    this._overlayAnimationTime = this.constructor.FADETIME;\n    this._focusOnShow = this.constructor.focusOnShow.OFF;\n    this._returnFocus = this.constructor.returnFocus.ON;\n\n    // Prepare templates\n    this._elements = {\n      // Fetch or create the content zone element\n      content: this.querySelector('coral-toast-content') || document.createElement('coral-toast-content')\n    };\n    base.call(this._elements);\n\n    this._delegateEvents({\n      'global:resize': '_debounceLayout',\n      'global:key:escape': '_onEscape',\n      'click [coral-close]': '_onCloseClick',\n      'coral-overlay:close': '_onClose'\n    });\n\n    // Layout any time the DOM changes\n    this._observer = new MutationObserver(() => {\n      this._debounceLayout();\n    });\n\n    // Watch for changes\n    this._observer.observe(this, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   Whether the Toast will be dismissed automatically after a certain period. The minimum and default value is 5 seconds.\n   The dismissible behavior can be disabled by setting the value to <code>0</code>.\n   If an actionable toast is set to auto-dismiss, make sure that the action is still accessible elsewhere in the application.\n\n   @type {?Number}\n   @default 5000\n   @htmlattribute autodismiss\n   */\n  get autoDismiss() {\n    return typeof this._autoDismiss === 'number' ? this._autoDismiss : 5000;\n  }\n\n  set autoDismiss(value) {\n    value = transform.number(value);\n    if (value !== null) {\n      value = Math.abs(value);\n\n      // Value can't be set lower than 5secs. 0 is an exception.\n      if (value !== 0 && value < 5000) {\n        commons._log('warn', 'Coral.Toast: the value for autoDismiss has to be 5 seconds minimum.');\n        value = 5000;\n      }\n\n      this._autoDismiss = value;\n    }\n  }\n\n  /**\n   The actionable item marked with <code>[coral-toast-action]</code>.\n   Restricted to {@link Button} or {@link AnchorButton} elements.\n   Actionable toasts should not have a button with a redundant action. For example “dismiss” would be redundant as all\n   toasts already have a close button.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get action() {\n    return this._elements.action || this.querySelector('[coral-toast-action]');\n  }\n\n  set action(el) {\n    if (!el) {\n      return;\n    }\n\n    if (isButton(el)) {\n      this._elements.action = el;\n      el.setAttribute('coral-toast-action', '');\n      el.setAttribute('variant', Button.variant._CUSTOM);\n      el.classList.add('_coral-Button', '_coral-Button--overBackground', '_coral-Button--quiet');\n\n      this._elements.body.appendChild(el);\n    } else {\n      commons._log('warn', 'Coral.Toast: provided action is not a Coral.Button or Coral.AnchorButton.');\n    }\n  }\n\n  /**\n   Inherited from {@link BaseOverlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    // Opening only if element is queued\n    value = transform.booleanAttr(value);\n    if (value && !this._queued) {\n      this._open = value;\n      // Mark it\n      this._queued = true;\n      // Clear timer\n      if (this._dimissTimeout) {\n        clearTimeout(this._dimissTimeout);\n      }\n      // Add it to the queue\n      queue(this);\n\n      requestAnimationFrame(() => {\n        this._reflectAttribute('open', true);\n\n        // If not child of document.body, we have to move it there\n        this._moveToDocumentBody();\n\n        requestAnimationFrame(() => {\n          // Start emptying the queue\n          if (document.querySelectorAll('coral-toast[open]').length === PRIORITY_QUEUE.length) {\n            unqueue();\n          }\n        });\n      });\n\n      return;\n    }\n\n    super.open = value;\n\n    // Ensure we're in the DOM\n    if (this.open) {\n      // Position the element\n      this._position();\n\n      // Handles what to focus based on focusOnShow\n      this._handleFocus();\n\n      // Use raf to wait for autoDismiss value to be set\n      requestAnimationFrame(() => {\n        // Only dismiss if value is different than 0\n        if (this.autoDismiss !== 0) {\n          this._dimissTimeout = window.setTimeout(() => {\n            if (this.open && !this.contains(document.activeElement)) {\n              this.open = false;\n            }\n          }, this.autoDismiss);\n        }\n      });\n    }\n  }\n\n  /**\n   The Toast variant. See {@link ToastVariantEnum}.\n\n   @type {String}\n   @default ToastVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this._renderVariantIcon();\n\n    // Remove all variant classes\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n\n    // Set new variant class\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n\n    // Set the role attribute to alert or status depending on\n    // the variant so that the element turns into a live region\n    this.setAttribute('role', (this.variant === variant.ERROR || this.variant === variant.WARNING || this.variant === variant.SUCCESS || this.variant === variant.INFO) ? 'alert' : 'status');\n    this.setAttribute('aria-live', 'polite');\n  }\n\n  /**\n   The Toast content element.\n\n   @type {ToastContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-toast-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}-content`);\n        // After the header\n        this._elements.body.insertBefore(content, this._elements.body.firstChild);\n      }\n    });\n  }\n\n  /**\n   The Toast placement. See {@link ToastPlacementEnum}.\n\n   @type {String}\n   @default ToastPlacementEnum.CENTER\n   @htmlattribute placement\n   */\n  get placement() {\n    return this._placement || placement.CENTER;\n  }\n\n  set placement(value) {\n    value = transform.string(value).toLowerCase();\n    this._placement = validate.enumeration(placement)(value) && value || placement.CENTER;\n\n    this._debounceLayout();\n  }\n\n  _renderVariantIcon() {\n    if (this._elements.icon) {\n      this._elements.icon.remove();\n    }\n\n    let variantValue = this.variant;\n\n    // Default variant has no icon\n    if (variantValue === variant.DEFAULT) {\n      return;\n    }\n\n    // Inject the SVG icon\n    const iconName = variantValue === variant.ERROR ? 'Alert' : capitalize(variantValue);\n    const icon = Icon._renderSVG(`spectrum-css-icon-${iconName}Medium`, ['_coral-Toast-typeIcon', `_coral-UIIcon-${iconName}Medium`]);\n    this.insertAdjacentHTML('afterbegin', icon);\n    this._elements.icon = this.querySelector('._coral-Toast-typeIcon');\n  }\n\n  _moveToDocumentBody() {\n    // Not in the DOM\n    if (!document.body.contains(this)) {\n      document.body.appendChild(this);\n    }\n    // In the DOM but not a direct child of body\n    else if (this.parentNode !== document.body) {\n      this._ignoreConnectedCallback = true;\n      this._repositioned = true;\n      document.body.appendChild(this);\n      this._ignoreConnectedCallback = false;\n    }\n  }\n\n  _debounceLayout() {\n    // Debounce\n    if (this._layoutTimeout !== null) {\n      clearTimeout(this._layoutTimeout);\n    }\n\n    this._layoutTimeout = window.setTimeout(() => {\n      this._layoutTimeout = null;\n      this._position();\n    }, this._wait);\n  }\n\n  _position() {\n    if (this.open) {\n      requestAnimationFrame(() => {\n        if (this.placement === placement.CENTER) {\n          this.style.left = `${document.body.clientWidth / 2 - this.clientWidth / 2}px`;\n          this.style.right = '';\n        } else if (this.placement === placement.LEFT) {\n          this.style.left = 0;\n          this.style.right = '';\n        } else if (this.placement === placement.RIGHT) {\n          this.style.left = '';\n          this.style.right = 0;\n        }\n      });\n    }\n  }\n\n  _onEscape(event) {\n    if (this.open && this.classList.contains('is-open') && this._isTopOverlay()) {\n      event.stopPropagation();\n      this.open = false;\n    }\n  }\n\n  _onCloseClick(event) {\n    const dismissTarget = event.matchedTarget;\n    const dismissValue = dismissTarget.getAttribute('coral-close');\n    if (!dismissValue || this.matches(dismissValue)) {\n      this.open = false;\n      event.stopPropagation();\n    }\n  }\n\n  _onClose() {\n    // Unmark it\n    this._queued = false;\n\n    // Continue emptying the queue\n    unqueue();\n  }\n\n  get _contentZones() {\n    return {\n      'coral-toast-content': 'content'\n    };\n  }\n\n  static get _queue() {\n    return PRIORITY_QUEUE;\n  }\n\n  /**\n   Returns {@link Toast} placement options.\n\n   @return {ToastPlacementEnum}\n   */\n  static get placement() {\n    return placement;\n  }\n\n  /**\n   Returns {@link Toast} variants.\n\n   @return {ToastVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  static get _attributePropertyMap() {\n    return commons.extend(super._attributePropertyMap, {\n      autodismiss: 'autoDismiss'\n    });\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat([\n      'variant',\n      'placement',\n      'autodismiss'\n    ]);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Create a fragment\n    const fragment = document.createDocumentFragment();\n\n    const templateHandleNames = ['body', 'buttons'];\n\n    // Render the template\n    fragment.appendChild(this._elements.body);\n    fragment.appendChild(this._elements.buttons);\n\n    const content = this._elements.content;\n    if (content.parentNode) {\n      content.remove();\n    }\n\n    const action = this.action;\n    if (action) {\n      action.remove();\n    }\n\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the content\n        content.appendChild(child);\n      } else {\n        // Remove anything else\n        this.removeChild(child);\n      }\n    }\n\n    // Insert template\n    this.appendChild(fragment);\n\n    // If default variant, does nothing\n    this._renderVariantIcon();\n\n    // Assign the content zones\n    this.content = this._elements.content;\n    this.action = action;\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    if (this._queued) {\n      let el = null;\n      PRIORITY_QUEUE.some((item, index) => {\n        if (item.el === this) {\n          this._queued = false;\n          el = index;\n          return true;\n        }\n      });\n\n      if (el !== null) {\n        PRIORITY_QUEUE.splice(el, 1);\n      }\n    }\n  }\n});\n\nexport default Toast;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2163,
    "kind": "typedef",
    "name": "ToastVariantEnum",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~ToastVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Toast} variants.",
    "lineNumber": 35,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A neutral toast."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A toast to notify that an error has occurred or to warn the user of something important."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "A toast to notify the user of a successful operation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "A toast to notify the user of non-critical information."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ToastVariantEnum"
    }
  },
  {
    "__docId__": 2164,
    "kind": "typedef",
    "name": "ToastPlacementEnum",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~ToastPlacementEnum",
    "access": "public",
    "description": "Enumeration for {@link Toast} placement values.",
    "lineNumber": 54,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEFT",
        "description": "A toast anchored to the bottom left of screen."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "CENTER",
        "description": "A toast anchored to the bottom center of screen."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "RIGHT",
        "description": "A toast anchored to the bottom right of screen."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "ToastPlacementEnum"
    }
  },
  {
    "__docId__": 2165,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 60,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2166,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2167,
    "kind": "variable",
    "name": "PRIORITY_QUEUE",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~PRIORITY_QUEUE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 68,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2168,
    "kind": "function",
    "name": "queue",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~queue",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 70,
    "undocument": true,
    "params": [
      {
        "name": "el",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 2169,
    "kind": "function",
    "name": "unqueue",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~unqueue",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 90,
    "undocument": true,
    "params": [],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 2170,
    "kind": "function",
    "name": "capitalize",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~capitalize",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 112,
    "undocument": true,
    "params": [
      {
        "name": "s",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 2171,
    "kind": "function",
    "name": "isButton",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~isButton",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 115,
    "undocument": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": null,
    "ignore": true
  },
  {
    "__docId__": 2172,
    "kind": "variable",
    "name": "Toast",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/Toast.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/Toast.js~Toast",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Toast}",
    "description": "Toasts display brief temporary notifications.\nThey are noticeable but do not disrupt the user experience and do not require an action to be taken.",
    "lineNumber": 127,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Toast"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Toasts display brief temporary notifications.\nThey are noticeable but do not disrupt the user experience and do not require an action to be taken."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-toast"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseOverlay}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-toast></coral-toast>",
      "<caption>JS constructor</caption>\nnew Coral.Toast();"
    ],
    "see": [
      "../examples/#toast"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2173,
    "kind": "file",
    "name": "coral-spectrum/coral-component-toast/src/scripts/ToastContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Toast.Content\n @classdesc The Toast default content\n @htmltag coral-toast-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-toast-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-toast/src/scripts/ToastContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2174,
    "kind": "function",
    "name": "ToastContent",
    "memberof": "coral-spectrum/coral-component-toast/src/scripts/ToastContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-toast/src/scripts/ToastContent.js~ToastContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Toast}",
    "description": "The Toast default content",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Toast.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "The Toast default content"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-toast-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-toast-content></coral-toast-content>",
      "<caption>JS constructor</caption>\nnew Coral.Toast.Content();"
    ],
    "see": [
      "../examples/#toast"
    ],
    "params": []
  },
  {
    "__docId__": 2175,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ExtensibleOverlay, Overlay} from '../../../coral-component-overlay';\nimport Vent from '@adobe/vent';\nimport base from '../templates/base';\nimport {commons, transform, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst arrowMap = {\n  left: 'left',\n  right: 'right',\n  top: 'top',\n  bottom: 'bottom'\n};\n\nconst CLASSNAME = '_coral-Tooltip';\n\nconst OFFSET = 5;\n\n/**\n Enumeration for {@link Tooltip} variants.\n\n @typedef {Object} TooltipVariantEnum\n\n @property {String} DEFAULT\n A default tooltip that provides additional information.\n @property {String} INFO\n A tooltip that informs the user of non-critical information.\n @property {String} SUCCESS\n A tooltip that indicates an operation was successful.\n @property {String} ERROR\n A tooltip that indicates an error has occurred.\n @property {String} WARNING\n Not supported. Falls back to DEFAULT.\n @property {String} INSPECT\n Not supported. Falls back to DEFAULT.\n */\nconst variant = {\n  DEFAULT: 'default',\n  INFO: 'info',\n  SUCCESS: 'success',\n  ERROR: 'error',\n  WARNING: 'warning',\n  INSPECT: 'inspect'\n};\n\n// A string of all possible variant classnames\nconst ALL_VARIANT_CLASSES = [];\nfor (const variantName in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantName]}`);\n}\n\n// A string of all position placement classnames\nconst ALL_PLACEMENT_CLASSES = [];\n\n// A map of lowercase directions to their corresponding classname\nconst placementClassMap = {};\nfor (const key in Overlay.placement) {\n  const direction = Overlay.placement[key];\n  const placementClass = `${CLASSNAME}--${arrowMap[direction]}`;\n\n  // Store in map\n  placementClassMap[direction] = placementClass;\n\n  // Store in list\n  ALL_PLACEMENT_CLASSES.push(placementClass);\n}\n\n/**\n @class Coral.Tooltip\n @classdesc A Tooltip component that can be attached to any element and may be displayed immediately or on hovering the\n target element.\n @htmltag coral-tooltip\n @extends {Overlay}\n */\nconst Tooltip = Decorator(class extends ExtensibleOverlay {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Override defaults\n    this._lengthOffset = OFFSET;\n    this._overlayAnimationTime = Overlay.FADETIME;\n    this._focusOnShow = Overlay.focusOnShow.OFF;\n\n    // Fetch or create the content zone element\n    this._elements = commons.extend(this._elements, {\n      content: this.querySelector('coral-tooltip-content') || document.createElement('coral-tooltip-content')\n    });\n\n    // Generate template\n    base.call(this._elements);\n\n    // Used for events\n    this._id = commons.getUID();\n    this._delegateEvents({\n      'coral-overlay:positioned': '_onPositioned',\n      'coral-overlay:_animate': '_onAnimate',\n      'mouseenter': '_onMouseEnter',\n      'mouseleave': '_onMouseLeave'\n    });\n  }\n\n  /**\n   The variant of tooltip. See {@link TooltipVariantEnum}.\n\n   @type {String}\n   @default TooltipVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n  }\n\n  /**\n   The amount of time in miliseconds to wait before showing the tooltip when the target is interacted with.\n\n   @type {Number}\n   @default 500\n   @htmlattribute delay\n   */\n  get delay() {\n    return typeof this._delay === 'number' ? this._delay : 500;\n  }\n\n  set delay(value) {\n    this._delay = transform.number(value);\n  }\n\n  /**\n   The Tooltip content element.\n\n   @type {TooltipContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-tooltip-content',\n      insert: function (content) {\n        content.classList.add(`${CLASSNAME}-label`);\n        this.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   Inherited from {@link Overlay#open}.\n   */\n  get open() {\n    return super.open;\n  }\n\n  set open(value) {\n    super.open = value;\n\n    if (!this.open) {\n      // Stop previous show operations from happening\n      this._cancelShow();\n    }\n  }\n\n  /**\n   Inherited from {@link Overlay#target}.\n   */\n  get target() {\n    return super.target;\n  }\n\n  set target(value) {\n    super.target = value;\n\n    const target = this._getTarget(value);\n\n    if (target) {\n      this._elements.tip.hidden = false;\n\n      if (this.interaction === this.constructor.interaction.ON) {\n        // Add listeners to the target\n        this._addTargetListeners(target);\n      }\n    } else {\n      this._elements.tip.hidden = true;\n    }\n  }\n\n  /**\n   Inherited from {@link Overlay#interaction}.\n   */\n  get interaction() {\n    return super.interaction;\n  }\n\n  set interaction(value) {\n    super.interaction = value;\n\n    const target = this._getTarget();\n\n    if (target) {\n      if (value === this.constructor.interaction.ON) {\n        this._addTargetListeners(target);\n      } else {\n        this._removeTargetListeners(target);\n      }\n    }\n  }\n\n  /** @ignore */\n  _onPositioned(event) {\n    // Set arrow placement\n    this.classList.remove(...ALL_PLACEMENT_CLASSES);\n    this.classList.add(placementClassMap[event.detail.placement]);\n  }\n\n  _onAnimate() {\n    // popper attribute\n    const popperPlacement = this.getAttribute('x-placement');\n\n    // popper takes care of setting left, top to 0 on positioning\n    if (popperPlacement === 'left') {\n      this.style.left = '8px';\n    } else if (popperPlacement === 'top') {\n      this.style.top = '8px';\n    } else if (popperPlacement === 'right') {\n      this.style.left = '-8px';\n    } else if (popperPlacement === 'bottom') {\n      this.style.top = '-8px';\n    }\n  }\n\n  _onMouseEnter() {\n    if (this.interaction === this.constructor.interaction.ON && this.open) {\n      // on automatic interaction and tooltip still open and mouse enters the tooltip, cancel hide.\n      this._cancelHide();\n    }\n  }\n\n  _onMouseLeave() {\n    if (this.interaction === this.constructor.interaction.ON) {\n      // on automatic interaction and mouse leave tooltip and execute same flow when mouse leaves target.\n      this._startHide();\n    }\n  }\n\n  /** @ignore */\n  _handleFocusOut() {\n    // The item that should have focus will get it on the next frame\n    window.requestAnimationFrame(() => {\n      const targetIsFocused = document.activeElement === this._getTarget();\n\n      if (!targetIsFocused) {\n        this._cancelShow();\n        this.open = false;\n      }\n    });\n  }\n\n  /** @ignore */\n  _cancelShow() {\n    window.clearTimeout(this._showTimeout);\n  }\n\n  /** @ignore */\n  _cancelHide() {\n    window.clearTimeout(this._hideTimeout);\n  }\n\n  /** @ignore */\n  _startHide() {\n    if (this.delay === 0) {\n      // Hide immediately\n      this._handleFocusOut();\n    } else {\n      this._hideTimeout = window.setTimeout(() => {\n        this._handleFocusOut();\n      }, this.delay);\n    }\n  }\n\n  /** @ignore */\n  _addTargetListeners(target) {\n    // Make sure we don't add listeners twice to the same element for this particular tooltip\n    if (target[`_hasTooltipListeners${this._id}`]) {\n      return;\n    }\n    target[`_hasTooltipListeners${this._id}`] = true;\n\n    // Remove listeners from the old target\n    if (this._oldTarget) {\n      const oldTarget = this._getTarget(this._oldTarget);\n      if (oldTarget) {\n        this._removeTargetListeners(oldTarget);\n      }\n    }\n\n    // Store the current target value\n    this._oldTarget = target;\n\n    // Use Vent to bind events on the target\n    this._targetEvents = new Vent(target);\n\n    this._targetEvents.on(`mouseenter.Tooltip${this._id}`, this._handleOpenTooltip.bind(this));\n    this._targetEvents.on(`focusin.Tooltip${this._id}`, this._handleOpenTooltip.bind(this));\n\n    this._targetEvents.on(`mouseleave.Tooltip${this._id}`, () => {\n      if (this.interaction === this.constructor.interaction.ON) {\n        this._startHide();\n      }\n    });\n\n    this._targetEvents.on(`focusout.Tooltip${this._id}`, () => {\n      if (this.interaction === this.constructor.interaction.ON) {\n        this._handleFocusOut();\n      }\n    });\n  }\n\n  _handleOpenTooltip() {\n    // Don't let the tooltip hide\n    this._cancelHide();\n\n    if (!this.open) {\n      this._cancelShow();\n\n      if (this.delay === 0) {\n        // Show immediately\n        this.show();\n      } else {\n        this._showTimeout = window.setTimeout(() => {\n          this.show();\n        }, this.delay);\n      }\n    }\n  }\n\n  /** @ignore */\n  _removeTargetListeners(target) {\n    // Remove listeners for this tooltip and mark that the element doesn't have them\n    // Use the ID so we can support multiple tooltips on the same element\n    if (this._targetEvents) {\n      this._targetEvents.off(`.Tooltip${this._id}`);\n    }\n    target[`_hasTooltipListeners${this._id}`] = false;\n  }\n\n  get _contentZones() {\n    return {'coral-tooltip-content': 'content'};\n  }\n\n  /**\n   Returns {@link Tooltip} variants.\n\n   @return {TooltipVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['variant', 'delay']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // ARIA\n    this.setAttribute('role', 'tooltip');\n    // Let the tooltip be focusable\n    // We'll marshall focus around when its focused\n    this.setAttribute('tabindex', '-1');\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // Support cloneNode\n    const tip = this.querySelector('._coral-Tooltip-tip');\n    if (tip) {\n      tip.remove();\n    }\n\n    const content = this._elements.content;\n\n    // Move the content into the content zone if none specified\n    if (!content.parentNode) {\n      while (this.firstChild) {\n        content.appendChild(this.firstChild);\n      }\n    }\n\n    // Append template\n    this.appendChild(this._elements.tip);\n\n    // Assign the content zone so the insert function will be called\n    this.content = content;\n  }\n});\n\nexport default Tooltip;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2176,
    "kind": "variable",
    "name": "arrowMap",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~arrowMap",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "{\"left\": string, \"right\": string, \"top\": string, \"bottom\": string}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2177,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 26,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2178,
    "kind": "variable",
    "name": "OFFSET",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~OFFSET",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 28,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2179,
    "kind": "typedef",
    "name": "TooltipVariantEnum",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~TooltipVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Tooltip} variants.",
    "lineNumber": 48,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "A default tooltip that provides additional information."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INFO",
        "description": "A tooltip that informs the user of non-critical information."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SUCCESS",
        "description": "A tooltip that indicates an operation was successful."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ERROR",
        "description": "A tooltip that indicates an error has occurred."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "WARNING",
        "description": "Not supported. Falls back to DEFAULT."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "INSPECT",
        "description": "Not supported. Falls back to DEFAULT."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TooltipVariantEnum"
    }
  },
  {
    "__docId__": 2180,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 58,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2181,
    "kind": "variable",
    "name": "ALL_PLACEMENT_CLASSES",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~ALL_PLACEMENT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 64,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2182,
    "kind": "variable",
    "name": "placementClassMap",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~placementClassMap",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 67,
    "undocument": true,
    "type": {
      "types": [
        "{}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2183,
    "kind": "variable",
    "name": "Tooltip",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/Tooltip.js~Tooltip",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tooltip}",
    "description": "A Tooltip component that can be attached to any element and may be displayed immediately or on hovering the\ntarget element.",
    "lineNumber": 86,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tooltip"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Tooltip component that can be attached to any element and may be displayed immediately or on hovering the\ntarget element."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tooltip"
      },
      {
        "tagName": "@extends",
        "tagValue": "{Overlay}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tooltip></coral-tooltip>",
      "<caption>JS constructor</caption>\nnew Coral.Tooltip();"
    ],
    "see": [
      "../examples/#tooltip"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2184,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tooltip/src/scripts/TooltipContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Tooltip.Content\n @classdesc Tooltip's content component\n @htmltag coral-tooltip-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-tooltip-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tooltip/src/scripts/TooltipContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2185,
    "kind": "function",
    "name": "TooltipContent",
    "memberof": "coral-spectrum/coral-component-tooltip/src/scripts/TooltipContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tooltip/src/scripts/TooltipContent.js~TooltipContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tooltip}",
    "description": "Tooltip's content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tooltip.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Tooltip's content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tooltip-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-tooltip-content></coral-tooltip-content>",
      "<caption>JS constructor</caption>\nnew Coral.Tooltip.Content();"
    ],
    "see": [
      "../examples/#tooltip"
    ],
    "params": []
  },
  {
    "__docId__": 2186,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {SelectableCollection} from '../../../coral-collection';\nimport TreeItem from './TreeItem';\nimport {transform} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-TreeView';\n\n/**\n @class Coral.Tree\n @classdesc A Tree component is a container component to display collapsible content.\n Tree items don't expand by default. It's the developer's responsibility to handle it by listening to the\n {@link coral-collection:add} and {@link coral-collection:remove} events.\n @htmltag coral-tree\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Tree = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Attach events\n    this._delegateEvents({\n      'click ._coral-TreeView-itemLink': '_onItemClick',\n      'click ._coral-TreeView-indicator': '_onExpandCollapseClick',\n      'coral-collection:add coral-tree-item': '_onCollectionChange',\n      'coral-collection:remove coral-tree-item': '_onCollectionChange',\n      // a11y\n      'key:space ._coral-TreeView-itemLink': '_onItemClick',\n      'key:space ._coral-TreeView-indicator': '_onExpandCollapseClick',\n      'key:return ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onExpandCollapseClick',\n      'key:pageup ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusPreviousItem',\n      'key:left ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onCollapseItem',\n      'key:up ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusPreviousItem',\n      'key:pagedown ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusNextItem',\n      'key:right ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onExpandItem',\n      'key:down ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusNextItem',\n      'key:home ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusFirstItem',\n      'key:end ._coral-TreeView-itemLink, ._coral-TreeView-indicator': '_onFocusLastItem',\n      'capture:blur ._coral-TreeView-itemLink[tabindex=\"0\"]': '_onItemBlur',\n      // private\n      'coral-tree-item:_selectedchanged': '_onItemSelectedChanged',\n      'coral-tree-item:_disabledchanged': '_onFocusableChanged',\n      'coral-tree-item:_expandedchanged': '_onFocusableChanged',\n      'coral-tree-item:_afterexpandedchanged': '_onExpandedChanged',\n      'coral-tree-item:_hiddenchanged': '_onFocusableChanged'\n    });\n\n    // Used for eventing\n    this._oldSelection = [];\n\n    // Init the collection mutation observer\n    this.items._startHandlingItems(true);\n\n    // Listen for mutations for Torq compatibility\n    const observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n          const addedNode = mutation.addedNodes[i];\n          if (addedNode.tagName === 'CORAL-TREE-ITEM') {\n            // Move tree items to their container\n            if (addedNode.parentNode.tagName === addedNode.tagName) {\n              addedNode.parentNode._elements.subTreeContainer.appendChild(addedNode);\n            }\n          }\n        }\n      });\n    });\n\n    observer.observe(this, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {SelectableCollection}\n   @readonly\n   */\n  get items() {\n    // just init on demand\n    if (!this._items) {\n      this._items = new SelectableCollection({\n        host: this,\n        itemTagName: 'coral-tree-item'\n      });\n    }\n    return this._items;\n  }\n\n  /**\n   Indicates whether the tree accepts multiple selected items.\n   @type {Boolean}\n   @default false\n   @htmlattribute multiple\n   @htmlattributereflected\n   */\n  get multiple() {\n    return this._multiple || false;\n  }\n\n  set multiple(value) {\n    this._multiple = transform.booleanAttr(value);\n    this._reflectAttribute('multiple', this._multiple);\n\n    this.setAttribute('aria-multiselectable', this._multiple);\n\n    this._validateSelection();\n  }\n\n  /**\n   Returns an Array containing the set selected items.\n   @type {Array.<HTMLElement>}\n   @readonly\n   */\n  get selectedItems() {\n    return this.items._getAllSelected();\n  }\n\n  /**\n   Returns the first selected item in the Tree. The value <code>null</code> is returned if no element is\n   selected.\n   @type {?HTMLElement}\n   @readonly\n   */\n  get selectedItem() {\n    return this.items._getAllSelected()[0] || null;\n  }\n\n  /** @private */\n  _onItemSelectedChanged(event) {\n    event.stopImmediatePropagation();\n\n    this._validateSelection(event.target);\n  }\n\n  /** @private */\n  _validateSelection(item) {\n    const selectedItems = this.selectedItems;\n\n    if (!this.multiple) {\n      // Last selected item wins if multiple selection while not allowed\n      item = item || selectedItems[selectedItems.length - 1];\n\n      if (item && item.hasAttribute('selected') && selectedItems.length > 1) {\n        selectedItems.forEach((selectedItem) => {\n          if (selectedItem !== item) {\n            // Don't trigger change events\n            this._preventTriggeringEvents = true;\n            selectedItem.removeAttribute('selected');\n          }\n        });\n\n        // We can trigger change events again\n        this._preventTriggeringEvents = false;\n      }\n    }\n\n    this._triggerChangeEvent();\n  }\n\n  /** @private */\n  _triggerChangeEvent() {\n    const selectedItems = this.selectedItems;\n    const oldSelection = this._oldSelection;\n\n    if (!this._preventTriggeringEvents && this._arraysAreDifferent(selectedItems, oldSelection)) {\n      // We differentiate whether multiple is on or off and return an array or HTMLElement respectively\n      if (this.multiple) {\n        this.trigger('coral-tree:change', {\n          oldSelection: oldSelection,\n          selection: selectedItems\n        });\n      } else {\n        // Return all items if we just switched from multiple=true to multiple=false and we had >1 selected items\n        this.trigger('coral-tree:change', {\n          oldSelection: oldSelection.length > 1 ? oldSelection : oldSelection[0] || null,\n          selection: selectedItems[0] || null\n        });\n      }\n\n      this._oldSelection = selectedItems;\n    }\n  }\n\n  /** @private */\n  _arraysAreDifferent(selection, oldSelection) {\n    let diff = [];\n\n    if (oldSelection.length === selection.length) {\n      diff = oldSelection.filter((item) => selection.indexOf(item) === -1);\n    }\n\n    // since we guarantee that they are arrays, we can start by comparing their size\n    return oldSelection.length !== selection.length || diff.length !== 0;\n  }\n\n  /** @private */\n  _toggleItemAttribute(item, attributeName) {\n    if (item) {\n      item[item.hasAttribute(attributeName) ? 'removeAttribute' : 'setAttribute'](attributeName, '');\n    }\n  }\n\n  /** @private */\n  _onCollectionChange(event) {\n    // Prevent triggering collection event twice. Only coral-tree collection events are propagated.\n    event.stopImmediatePropagation();\n  }\n\n  /** @private */\n  _onItemClick(event) {\n    // Clickable item inside Tree Item should not trigger selection of item\n    if (event.target.hasAttribute('coral-interactive') || event.target.closest('[coral-interactive]')) {\n      return;\n    }\n\n    // If the indicator is clicked, expand/collapse the tree item\n    if (event.target.closest('._coral-TreeView-indicator')) {\n      this._onExpandCollapseClick(event);\n      return;\n    }\n\n    // The click was performed on the header so we select the item (parentNode) the selection is toggled\n    const item = event.target.closest('coral-tree-item');\n    if (item && !item.hasAttribute('disabled')) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      // We ignore the selection if the item is disabled\n      this._toggleItemAttribute(item, 'selected');\n      const focusable = this._getFocusable();\n      if (focusable) {\n        focusable.setAttribute('tabindex', '-1');\n      }\n      item._elements.header.setAttribute('tabindex', '0');\n      item._elements.header.focus();\n    }\n  }\n\n  /** @private */\n  _onExpandCollapseClick(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    // The click was performed on the icon to expand/collapse  the sub tree\n    const item = event.target.closest('coral-tree-item');\n    if (item) {\n      // We ignore the expand/collapse if the item is disabled\n      if (item.hasAttribute('disabled')) {\n        return;\n      }\n\n      // Toggle the expanded of the item:\n      this._toggleItemAttribute(item, 'expanded');\n    }\n  }\n\n  /** @private */\n  _onExpandItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    // The click was performed on the icon to expand the sub tree\n    const item = event.target.closest('coral-tree-item');\n    if (item) {\n      // We ignore the expand if the item is disabled\n      if (item.hasAttribute('disabled')) {\n        return;\n      }\n\n      if (!item.expanded && item.variant === TreeItem.variant.DRILLDOWN) {\n        // If the item is not expanded, expand the item\n        item.expanded = !item.expanded;\n        item._elements.header.classList.add('focus-ring');\n      } else if (item.items.length > 0) {\n        // If the item is expanded, and contains items, focus the next item\n        this._onFocusNextItem(event);\n      }\n    }\n  }\n\n  /** @private */\n  _onCollapseItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    // The click was performed on the icon to collapse the sub tree\n    const item = event.target.closest('coral-tree-item');\n    if (item) {\n      // We ignore the expand if the item is disabled\n      if (item.hasAttribute('disabled')) {\n        return;\n      }\n\n      if (item.expanded && item.variant === TreeItem.variant.DRILLDOWN) {\n        // If the item is not expanded, expand the item\n        item.expanded = !item.expanded;\n        item._elements.header.classList.add('focus-ring');\n      } else if (item.parent) {\n        item._elements.header.setAttribute('tabindex', '-1');\n        item._elements.header.classList.remove('focus-ring');\n        item.parent.focus();\n        item.parent._elements.header.classList.add('focus-ring');\n      }\n    }\n  }\n\n  /** @private */\n  _focusSiblingItem(item, next) {\n    const focusableItems = this._getFocusableItems();\n\n    // There's not enough items to change focus\n    if (focusableItems.length < 2) {\n      return;\n    }\n\n    let index = focusableItems.indexOf(item) + (next ? 1 : -1);\n    let siblingItem = null;\n\n    // If we reached the edge, target the other edge\n    if (index > focusableItems.length - 1) {\n      siblingItem = focusableItems[0];\n    } else if (index < 0) {\n      siblingItem = focusableItems[focusableItems.length - 1];\n    }\n\n    // Find the sibling item\n    while (!siblingItem) {\n      siblingItem = focusableItems[index];\n      // The item might be hidden because a parent is collapsed\n      if (siblingItem.parentNode.closest('coral-tree-item.is-collapsed')) {\n        if (next) {\n          index++;\n          siblingItem = index > focusableItems.length - 1 ? item : null;\n        } else {\n          index--;\n          siblingItem = index < 0 ? item : null;\n        }\n      }\n    }\n\n    // Change focus\n    if (siblingItem !== item) {\n      item._elements.header.setAttribute('tabindex', '-1');\n      item._elements.header.classList.remove('focus-ring');\n\n      siblingItem._elements.header.setAttribute('tabindex', '0');\n      siblingItem._elements.header.classList.add('focus-ring');\n      siblingItem._elements.header.focus();\n    }\n  }\n\n  /** @private */\n  _focusEdgeItem(last) {\n    // Query the focusable item\n    const focusable = this._getFocusable();\n    if (focusable) {\n      const focusableItems = this._getFocusableItems();\n      const edgeItem = focusableItems[last ? focusableItems.length - 1 : 0];\n\n      // Change focus\n      if (edgeItem !== focusable) {\n        focusable.setAttribute('tabindex', '-1');\n        edgeItem._elements.header.setAttribute('tabindex', '0');\n        edgeItem._elements.header.focus();\n      }\n    }\n  }\n\n  /** @private */\n  _onFocusNextItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const item = event.target.closest('coral-tree-item');\n    if (item) {\n      this._focusSiblingItem(item, true);\n    }\n  }\n\n  /** @private */\n  _onFocusPreviousItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const item = event.target.closest('coral-tree-item');\n    if (item) {\n      this._focusSiblingItem(item, false);\n    }\n  }\n\n  /** @private */\n  _onFocusFirstItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusEdgeItem(false);\n  }\n\n  /** @private */\n  _onFocusLastItem(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this._focusEdgeItem(true);\n  }\n\n  /** @private */\n  _onFocusableChanged(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (event.target.contains(this._getFocusable())) {\n      this._resetFocusableItem();\n    }\n  }\n\n\n  /** @private */\n  _onExpandedChanged(event) {\n    event.stopImmediatePropagation();\n\n    const item = event.target;\n    this.trigger(`coral-tree:${item.expanded ? 'expand' : 'collapse'}`, {item});\n  }\n\n  /** @private */\n  _getFocusable() {\n    return this.querySelector('coral-tree-item > ._coral-TreeView-itemLink[tabindex=\"0\"]');\n  }\n\n  /** @private */\n  _getFocusableItems() {\n    return this.items.getAll().filter((item) => !item.closest('coral-tree-item[disabled]') && !item.closest('coral-tree-item[hidden]'));\n  }\n\n  /** @private */\n  _onItemBlur() {\n    const focused = this.querySelector('._coral-TreeView-itemLink.focus-ring');\n    if (focused) {\n      focused.classList.remove('focus-ring');\n    }\n  }\n\n  /** @private */\n  _resetFocusableItem(item) {\n    // Old focusable becomes unfocusable\n    const focusable = this._getFocusable();\n    if (focusable) {\n      focusable.setAttribute('tabindex', '-1');\n      focusable.classList.remove('focus-ring');\n    }\n\n    // Defined item or first item by default gets the focus\n    item = item || this._getFocusableItems()[0];\n    if (item) {\n      item._elements.header.setAttribute('tabindex', '0');\n    }\n  }\n\n  /** @private */\n  _expandCollapseAll(expand) {\n    const coralTreeItems = this.querySelectorAll('coral-tree-item');\n    if (coralTreeItems) {\n      let item;\n      const length = coralTreeItems.length;\n      if (length > 0) {\n        for (let index = 0 ; index < length ; index++) {\n          item = coralTreeItems[index];\n          if (item) {\n            item.expanded = expand;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   Expand all the Tree Items\n   */\n  expandAll() {\n    this._expandCollapseAll(true);\n  }\n\n  /**\n   Collapse all the Tree Items\n   */\n  collapseAll() {\n    this._expandCollapseAll(false);\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['multiple']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // a11y\n    this.setAttribute('role', 'tree');\n    this.setAttribute('aria-multiselectable', this.multiple);\n\n    // Enable keyboard interaction\n    requestAnimationFrame(() => {\n      this._resetFocusableItem();\n    });\n\n    // Don't trigger events once connected\n    this._preventTriggeringEvents = true;\n    this._validateSelection();\n    this._preventTriggeringEvents = false;\n\n    this._oldSelection = this.selectedItems;\n  }\n\n  /**\n   Triggered when the {@link Tree} selection changed.\n\n   @typedef {CustomEvent} coral-tree:change\n\n   @property {Array.<TreeItem>} detail.oldSelection\n   The old selected item.\n   @property {Array.<TreeItem>} detail.selection\n   The selected items.\n   */\n\n  /**\n   Triggered when a {@link Tree} item expanded.\n\n   @typedef {CustomEvent} coral-tree:expand\n\n   @property {TreeItem} detail.item\n   The expanded item.\n   */\n\n  /**\n   Triggered when a {@link Tree} item collapsed.\n\n   @typedef {CustomEvent} coral-tree:collapse\n\n   @property {TreeItem} detail.item\n   The collapsed item.\n   */\n});\n\nexport default Tree;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2187,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/Tree.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2188,
    "kind": "variable",
    "name": "Tree",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/Tree.js~Tree",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tree}",
    "description": "A Tree component is a container component to display collapsible content.\nTree items don't expand by default. It's the developer's responsibility to handle it by listening to the\n{@link coral-collection:add} and {@link coral-collection:remove} events.",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tree"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Tree component is a container component to display collapsible content.\nTree items don't expand by default. It's the developer's responsibility to handle it by listening to the\n{@link coral-collection:add} and {@link coral-collection:remove} events."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tree"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tree></coral-tree>",
      "<caption>JS constructor</caption>\nnew Coral.Tree();"
    ],
    "see": [
      "../examples/#tree"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2189,
    "kind": "typedef",
    "name": "coral-tree:change",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/Tree.js~coral-tree:change",
    "access": "public",
    "description": "Triggered when the {@link Tree} selection changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Array.<TreeItem>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.oldSelection",
        "description": "The old selected item."
      },
      {
        "nullable": null,
        "types": [
          "Array.<TreeItem>"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.selection",
        "description": "The selected items."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree:change"
    }
  },
  {
    "__docId__": 2190,
    "kind": "typedef",
    "name": "coral-tree:expand",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/Tree.js~coral-tree:expand",
    "access": "public",
    "description": "Triggered when a {@link Tree} item expanded.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TreeItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The expanded item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree:expand"
    }
  },
  {
    "__docId__": 2191,
    "kind": "typedef",
    "name": "coral-tree:collapse",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/Tree.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/Tree.js~coral-tree:collapse",
    "access": "public",
    "description": "Triggered when a {@link Tree} item collapsed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "TreeItem"
        ],
        "spread": false,
        "optional": false,
        "name": "detail.item",
        "description": "The collapsed item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree:collapse"
    }
  },
  {
    "__docId__": 2192,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\nimport {Icon} from '../../../coral-component-icon';\nimport treeItem from '../templates/treeItem';\nimport {transform, commons, i18n, validate} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-TreeView-item';\n\n/**\n Enumeration for {@link TreeItem} variants.\n\n @typedef {Object} TreeItemVariantEnum\n\n @property {String} DRILLDOWN\n Default variant with icon to expand/collapse subtree.\n @property {String} LEAF\n Variant for leaf items. Icon to expand/collapse subtree is hidden.\n */\nconst variant = {\n  /* Default variant with icon to expand/collapse subtree. */\n  DRILLDOWN: 'drilldown',\n  /* Variant for leaf items. Icon to expand/collapse subtree is hidden. */\n  LEAF: 'leaf'\n};\n\nconst ALL_VARIANT_CLASSES = [];\n\nfor (const variantValue in variant) {\n  ALL_VARIANT_CLASSES.push(`${CLASSNAME}--${variant[variantValue]}`);\n}\n\nconst IS_TOUCH_DEVICE = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;\n\n/**\n @class Coral.Tree.Item\n @classdesc A Tree item component\n @htmltag coral-tree-item\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst TreeItem = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {\n      // Create or fetch the content zones\n      content: this.querySelector('coral-tree-item-content') || document.createElement('coral-tree-item-content')\n    };\n    treeItem.call(this._elements, {Icon, commons});\n\n    if (!this._elements.icon) {\n      this._elements.icon = this._elements.header.querySelector('._coral-TreeView-indicator');\n    }\n\n    // Tells the collection to automatically detect the items and handle the events\n    this.items._startHandlingItems();\n  }\n\n  /**\n   The parent tree. Returns <code>null</code> if item is the root.\n\n   @type {HTMLElement}\n   @readonly\n   */\n  get parent() {\n    return this._parent || null;\n  }\n\n  /**\n   The content of this tree item.\n\n   @type {TreeItemContent}\n   @contentzone\n   */\n  get content() {\n    return this._getContentZone(this._elements.content);\n  }\n\n  set content(value) {\n    this._setContentZone('content', value, {\n      handle: 'content',\n      tagName: 'coral-tree-item-content',\n      insert: function (content) {\n        this._elements.header.appendChild(content);\n      }\n    });\n  }\n\n  /**\n   The Collection Interface that allows interacting with the items that the component contains.\n\n   @type {Collection}\n   @readonly\n   */\n  get items() {\n    // Construct the collection on first request\n    if (!this._items) {\n      this._items = new Collection({\n        host: this,\n        itemTagName: 'coral-tree-item',\n        itemSelector: ':scope > coral-tree-item',\n        onlyHandleChildren: true,\n        container: this._elements.subTreeContainer,\n        filter: this._filterItem.bind(this),\n        onItemAdded: this._onItemAdded,\n        onItemRemoved: this._onItemRemoved\n      });\n    }\n\n    return this._items;\n  }\n\n  /**\n   Whether the item is expanded. Expanded cannot be set to <code>true</code> if the item is disabled.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute expanded\n   @htmlattributereflected\n   */\n  get expanded() {\n    return this._expanded || false;\n  }\n\n  set expanded(value) {\n    value = transform.booleanAttr(value);\n    const triggerEvent = this.expanded !== value;\n\n    this._expanded = value;\n    this._reflectAttribute('expanded', this._expanded);\n\n    const header = this._elements.header;\n    const subTreeContainer = this._elements.subTreeContainer;\n\n    this.classList.toggle('is-open', this._expanded);\n    this.classList.toggle('is-collapsed', !this._expanded);\n\n    if (this.variant !== variant.DRILLDOWN) {\n      header.removeAttribute('aria-expanded');\n      header.removeAttribute('aria-owns');\n    } else if (this.items.length > 0) {\n      header.setAttribute('aria-expanded', this._expanded);\n      header.setAttribute('aria-owns', subTreeContainer.id);\n    }\n\n    if (this._expanded) {\n      subTreeContainer.removeAttribute('aria-hidden');\n    } else {\n      subTreeContainer.setAttribute('aria-hidden', !this._expanded);\n    }\n\n    if (IS_TOUCH_DEVICE) {\n      const icon = header.querySelector('._coral-TreeView-indicator');\n      icon.setAttribute('aria-label', i18n.get(this._expanded ? 'Collapse' : 'Expand'));\n    }\n\n    this.trigger('coral-tree-item:_expandedchanged');\n\n    // Do animation in next frame to avoid a forced reflow\n    window.requestAnimationFrame(() => {\n      // Don't animate on initialization\n      if (this._animate) {\n        // Remove height as we want the drawer to naturally grow if content is added later\n        commons.transitionEnd(subTreeContainer, () => {\n          if (this.expanded) {\n            subTreeContainer.style.height = '';\n          } else {\n            subTreeContainer.hidden = true;\n          }\n\n          // Trigger once the animation is over to inform coral-tree\n          if (triggerEvent) {\n            this.trigger('coral-tree-item:_afterexpandedchanged');\n          }\n        });\n\n        // Force height to enable transition\n        if (!this.expanded) {\n          subTreeContainer.style.height = `${subTreeContainer.scrollHeight}px`;\n        } else {\n          subTreeContainer.hidden = false;\n        }\n\n        // We read the offset height to force a reflow, this is needed to start the transition between absolute values\n        // https://blog.alexmaccaw.com/css-transitions under Redrawing\n        // eslint-disable-next-line no-unused-vars\n        const offsetHeight = subTreeContainer.offsetHeight;\n\n        subTreeContainer.style.height = this.expanded ? `${subTreeContainer.scrollHeight}px` : 0;\n      } else {\n        // Make sure it's animated next time\n        this._animate = true;\n\n        // Hide it on initialization if closed\n        if (!this.expanded) {\n          subTreeContainer.style.height = 0;\n          subTreeContainer.hidden = true;\n        }\n      }\n    });\n  }\n\n  /**\n   The item's variant. See {@link TreeItemVariantEnum}.\n\n   @type {String}\n   @default TreeItemVariant.DRILLDOWN\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DRILLDOWN;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant, value) && value || variant.DRILLDOWN;\n\n    // removes every existing variant\n    this.classList.remove(...ALL_VARIANT_CLASSES);\n    this.classList.add(`${CLASSNAME}--${this._variant}`);\n  }\n\n  /**\n   Whether the item is selected.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute selected\n   @htmlattributereflected\n   */\n  get selected() {\n    return this._selected || false;\n  }\n\n  set selected(value) {\n    this._selected = transform.booleanAttr(value);\n    this._reflectAttribute('selected', this._selected);\n\n    this._elements.header.classList.toggle('is-selected', this._selected);\n    this._elements.header.setAttribute('aria-selected', this._selected);\n\n    const selectedState = this._elements.selectedState;\n    selectedState.textContent = i18n.get(this._selected ? 'selected' : 'not selected');\n\n    if (IS_TOUCH_DEVICE) {\n      selectedState.setAttribute('aria-pressed', this._selected);\n    }\n\n    this.trigger('coral-tree-item:_selectedchanged');\n  }\n\n  /**\n   Whether this item is disabled.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute disabled\n   @htmlattributereflected\n   */\n  get disabled() {\n    return this._disabled || false;\n  }\n\n  set disabled(value) {\n    this._disabled = transform.booleanAttr(value);\n    this._reflectAttribute('disabled', this._disabled);\n\n    this._elements.header.classList.toggle('is-disabled', this._disabled);\n    this._elements.header[this._disabled ? 'setAttribute' : 'removeAttribute']('aria-disabled', this._disabled);\n\n    this.trigger('coral-tree-item:_disabledchanged');\n  }\n\n  /**\n   @ignore\n   */\n  get hidden() {\n    return this.hasAttribute('hidden');\n  }\n\n  set hidden(value) {\n    this._reflectAttribute('hidden', transform.booleanAttr(value));\n\n    // We redefine hidden to trigger an event\n    this.trigger('coral-tree-item:_hiddenchanged');\n  }\n\n  /** @private */\n  _filterItem(item) {\n    // Handle nesting check for parent tree item\n    // Use parentNode for added items\n    // Use _parent for removed items\n    return item.parentNode && item.parentNode.parentNode === this || item._parent === this;\n  }\n\n  /** @private */\n  _onItemAdded(item) {\n    item._parent = this;\n\n    const header = this._elements.header;\n    const subTreeContainer = this._elements.subTreeContainer;\n    if (!header.hasAttribute('aria-owns')) {\n      header.setAttribute('aria-owns', subTreeContainer.id);\n    }\n  }\n\n  /** @private */\n  _onItemRemoved(item) {\n    item._parent = undefined;\n\n    // If there are no items the subTreeContainer\n    if (!this.items.length) {\n      this._elements.header.removeAttribute('aria-owns');\n    }\n  }\n\n  /**\n   Handles the focus of the item.\n\n   @ignore\n   */\n  focus() {\n    this._elements.header.setAttribute('tabindex', '0');\n    this._elements.header.focus();\n  }\n\n  /**\n   Returns {@link TreeItem} variants.\n\n   @return {TreeItemVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  get _contentZones() {\n    return {'coral-tree-item-content': 'content'};\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['selected', 'disabled', 'variant', 'expanded', 'hidden']);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    const header = this._elements.header;\n    const subTreeContainer = this._elements.subTreeContainer;\n    const content = this._elements.content;\n    const selectedState = this._elements.selectedState;\n\n    // a11ys\n    content.id = content.id || commons.getUID();\n    this.setAttribute('role', 'presentation');\n    header.setAttribute('aria-labelledby', `${content.id} ${selectedState.id}`);\n    header.setAttribute('aria-selected', this.selected);\n    subTreeContainer.setAttribute('aria-labelledby', content.id);\n    selectedState.textContent = i18n.get(this.selected ? 'selected' : 'not selected');\n\n    if (IS_TOUCH_DEVICE) {\n      const icon = this._elements.icon || header.querySelector('._coral-TreeView-indicator');\n      if (icon && !icon.id) {\n        icon.id = commons.getUID();\n      }\n      icon.setAttribute('role', 'button');\n      icon.setAttribute('tabindex', '-1');\n      icon.setAttribute('aria-labelledby', icon.id + ' ' + content.id);\n      icon.setAttribute('aria-label', i18n.get(this.expanded ? 'Collapse' : 'Expand'));\n      icon.setAttribute('style', 'outline: none !important');\n      icon.removeAttribute('aria-hidden');\n\n      selectedState.setAttribute('role', 'button');\n      selectedState.setAttribute('tabindex', '-1');\n      selectedState.setAttribute('aria-labelledby', content.id + ' ' + selectedState.id);\n      selectedState.setAttribute('aria-pressed', this.selected);\n      selectedState.setAttribute('style', 'outline: none !important');\n    }\n\n    // Default reflected attributes\n    if (!this._variant) {\n      this.variant = variant.DRILLDOWN;\n    }\n    this.expanded = this.expanded;\n\n    // Render the template and set element references\n    const frag = document.createDocumentFragment();\n\n    const templateHandleNames = ['header', 'icon', 'subTreeContainer'];\n\n    const subTree = this.querySelector('._coral-TreeView');\n    if (subTree) {\n      const items = subTree.querySelectorAll('coral-tree-item');\n      for (let i = 0 ; i < items.length ; i++) {\n        subTreeContainer.appendChild(items[i]);\n      }\n    }\n\n    // Add templates into the frag\n    frag.appendChild(header);\n    frag.appendChild(subTreeContainer);\n\n    // Assign the content zones, moving them into place in the process\n    this.content = content;\n\n    // Move any remaining elements into the content sub-component\n    while (this.firstChild) {\n      const child = this.firstChild;\n      if (child.nodeName === 'CORAL-TREE-ITEM') {\n        // Adding parent attribute to access the parent directly\n        child._parent = this;\n        // Add tree items to the sub tree container\n        subTreeContainer.appendChild(child);\n      } else if (child.nodeType === Node.TEXT_NODE ||\n        child.nodeType === Node.ELEMENT_NODE && templateHandleNames.indexOf(child.getAttribute('handle')) === -1) {\n        // Add non-template elements to the content\n        content.appendChild(child);\n      } else {\n        // Remove anything else element\n        this.removeChild(child);\n      }\n    }\n\n    if (this.variant === variant.DRILLDOWN && this.items.length && !header.hasAttribute('aria-owns')) {\n      header.setAttribute('aria-owns', subTreeContainer.id);\n    }\n\n    // Lastly, add the fragment into the container\n    this.appendChild(frag);\n  }\n\n  /**\n   Triggered when {@link TreeItem#selected} changed.\n\n   @typedef {CustomEvent} coral-tree-item:_selectedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TreeItem#expanded} changed.\n\n   @typedef {CustomEvent} coral-tree-item:_expandedchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TreeItem#hidden} changed.\n\n   @typedef {CustomEvent} coral-tree-item:_hiddenchanged\n\n   @private\n   */\n\n  /**\n   Triggered when {@link TreeItem#disabled} changed.\n\n   @typedef {CustomEvent} coral-tree-item:_disabledchanged\n\n   @private\n   */\n});\n\nexport default TreeItem;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2193,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2194,
    "kind": "typedef",
    "name": "TreeItemVariantEnum",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~TreeItemVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link TreeItem} variants.",
    "lineNumber": 32,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DRILLDOWN",
        "description": "Default variant with icon to expand/collapse subtree."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LEAF",
        "description": "Variant for leaf items. Icon to expand/collapse subtree is hidden."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "TreeItemVariantEnum"
    }
  },
  {
    "__docId__": 2195,
    "kind": "variable",
    "name": "ALL_VARIANT_CLASSES",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~ALL_VARIANT_CLASSES",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 39,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2196,
    "kind": "variable",
    "name": "IS_TOUCH_DEVICE",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~IS_TOUCH_DEVICE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 45,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2197,
    "kind": "variable",
    "name": "TreeItem",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~TreeItem",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tree}",
    "description": "A Tree item component",
    "lineNumber": 54,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tree.Item"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Tree item component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tree-item"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-tree-item></coral-tree-item>",
      "<caption>JS constructor</caption>\nnew Coral.Tree.Item();"
    ],
    "see": [
      "../examples/#tree"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2198,
    "kind": "typedef",
    "name": "coral-tree-item:_selectedchanged",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~coral-tree-item:_selectedchanged",
    "access": "private",
    "description": "Triggered when {@link TreeItem#selected} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree-item:_selectedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2199,
    "kind": "typedef",
    "name": "coral-tree-item:_expandedchanged",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~coral-tree-item:_expandedchanged",
    "access": "private",
    "description": "Triggered when {@link TreeItem#expanded} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree-item:_expandedchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2200,
    "kind": "typedef",
    "name": "coral-tree-item:_hiddenchanged",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~coral-tree-item:_hiddenchanged",
    "access": "private",
    "description": "Triggered when {@link TreeItem#hidden} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree-item:_hiddenchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2201,
    "kind": "typedef",
    "name": "coral-tree-item:_disabledchanged",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItem.js~coral-tree-item:_disabledchanged",
    "access": "private",
    "description": "Triggered when {@link TreeItem#disabled} changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-tree-item:_disabledchanged"
    },
    "ignore": true
  },
  {
    "__docId__": 2202,
    "kind": "file",
    "name": "coral-spectrum/coral-component-tree/src/scripts/TreeItemContent.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n @class Coral.Tree.Item.Content\n @classdesc Tree item's content component\n @htmltag coral-tree-item-content\n @return {HTMLElement}\n */\nexport default () => document.createElement('coral-tree-item-content');\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-tree/src/scripts/TreeItemContent.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2203,
    "kind": "function",
    "name": "TreeItemContent",
    "memberof": "coral-spectrum/coral-component-tree/src/scripts/TreeItemContent.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-component-tree/src/scripts/TreeItemContent.js~TreeItemContent",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Tree}",
    "description": "Tree item's content component",
    "lineNumber": 19,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Tree.Item.Content"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "Tree item's content component"
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-tree-item-content"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": ""
    },
    "examples": [
      "<caption>Markup</caption>\n<coral-tree-item-content></coral-tree-item-content>",
      "<caption>JS constructor</caption>\nnew Coral.Tree.Item.Content();"
    ],
    "see": [
      "../examples/#tree"
    ],
    "params": []
  },
  {
    "__docId__": 2204,
    "kind": "file",
    "name": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {transform, validate} from '../../../coral-utils';\nimport base from '../templates/base';\nimport {Decorator} from '../../../coral-decorator';\n\n/**\n Enumeration for {@link Wait} variants.\n\n @typedef {Object} WaitVariantEnum\n\n @property {String} DEFAULT\n The default variant.\n @property {String} DOTS\n Not supported. Falls back to DEFAULT.\n */\nconst variant = {\n  DEFAULT: 'default',\n  DOTS: 'dots'\n};\n\n/**\n Enumeration for {@link Wait} sizes.\n\n @typedef {Object} WaitSizeEnum\n\n @property {String} SMALL\n A small wait indicator.\n @property {String} MEDIUM\n A medium wait indicator. This is the default size.\n @property {String} LARGE\n A large wait indicator.\n */\nconst size = {\n  SMALL: 'S',\n  MEDIUM: 'M',\n  LARGE: 'L'\n};\n\n// the waits's base classname\nconst CLASSNAME = '_coral-CircleLoader';\n\n/**\n @class Coral.Wait\n @classdesc A Wait component to be used to indicate a process that is in-progress for an indefinite amount of time.\n When the time is known, {@link Progress} should be used instead.\n @htmltag coral-wait\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst Wait = Decorator(class extends BaseComponent(HTMLElement) {\n  constructor() {\n    super();\n\n    // Prepare templates\n    this._elements = {};\n    base.call(this._elements);\n  }\n\n  /**\n   The size of the wait indicator. Currently 'S' (the default), 'M' and 'L' are available.\n   See {@link WaitSizeEnum}.\n\n   @type {String}\n   @default WaitSizeEnum.MEDIUM\n   @htmlattribute size\n   @htmlattributereflected\n   */\n  get size() {\n    return this._size || size.MEDIUM;\n  }\n\n  set size(value) {\n    value = transform.string(value).toUpperCase();\n    this._size = validate.enumeration(size)(value) && value || size.MEDIUM;\n    this._reflectAttribute('size', this._size);\n\n    // large css change\n    this.classList.toggle(`${CLASSNAME}--large`, this._size === size.LARGE);\n\n    // small css change\n    this.classList.toggle(`${CLASSNAME}--small`, this._size === size.SMALL);\n  }\n\n  /**\n   Whether the component is centered or not. The container needs to have the style <code>position: relative</code>\n   for the centering to work correctly.\n   @type {Boolean}\n   @default false\n   @htmlattribute centered\n   @htmlattributereflected\n   */\n  get centered() {\n    return this._centered || false;\n  }\n\n  set centered(value) {\n    this._centered = transform.booleanAttr(value);\n    this._reflectAttribute('centered', this._centered);\n\n    this.classList.toggle(`${CLASSNAME}--centered`, this._centered);\n  }\n\n  /**\n   The wait's variant. See {@link WaitVariantEnum}.\n\n   @type {String}\n   @default WaitVariantEnum.DEFAULT\n   @htmlattribute variant\n   @htmlattributereflected\n   */\n  get variant() {\n    return this._variant || variant.DEFAULT;\n  }\n\n  set variant(value) {\n    value = transform.string(value).toLowerCase();\n    this._variant = validate.enumeration(variant)(value) && value || variant.DEFAULT;\n    this._reflectAttribute('variant', this._variant);\n  }\n\n  /**\n   Whether to hide the current value and show an animation. Set to true for operations whose progress cannot be\n   determined.\n\n   @type {Boolean}\n   @default false\n   @htmlattribute indeterminate\n   @htmlattributereflected\n   */\n  get indeterminate() {\n    return this._indeterminate || false;\n  }\n\n  set indeterminate(value) {\n    this._indeterminate = transform.booleanAttr(value);\n    this._reflectAttribute('indeterminate', this._indeterminate);\n\n    if (this._indeterminate) {\n      this.classList.add(`${CLASSNAME}--indeterminate`);\n\n      // ARIA: Remove attributes\n      this.removeAttribute('aria-valuenow');\n      this.removeAttribute('aria-valuemin');\n      this.removeAttribute('aria-valuemax');\n\n      this.value = 0;\n    } else {\n      this.classList.remove(`${CLASSNAME}--indeterminate`);\n\n      // ARIA: Add attributes\n      this.setAttribute('aria-valuemin', '0');\n      this.setAttribute('aria-valuemax', '100');\n\n      this.value = this._oldValue;\n    }\n  }\n\n  /**\n   The current progress in percent. If no value is set on initialization, wait is forced into indeterminate state.\n\n   @type {Number}\n   @default 0\n   @emits {coral-wait:change}\n   @htmlattribute value\n   @htmlattributereflected\n   */\n  get value() {\n    return this.hasAttribute('indeterminate') ? 0 : this._value || 0;\n  }\n\n  set value(value) {\n    value = transform.number(value) || 0;\n\n    // Stay within bounds\n    if (value > 100) {\n      value = 100;\n    } else if (value < 0) {\n      value = 0;\n    }\n\n    this._value = value;\n    this._reflectAttribute('value', this._value);\n\n    const subMask1 = this._elements.subMask1;\n    const subMask2 = this._elements.subMask2;\n\n    if (!this.hasAttribute('indeterminate')) {\n      let angle;\n\n      if (value > 0 && value <= 50) {\n        angle = -180 + value / 50 * 180;\n        subMask1.style.transform = `rotate(${angle}deg)`;\n        subMask2.style.transform = 'rotate(-180deg)';\n      } else if (value > 50) {\n        angle = -180 + (value - 50) / 50 * 180;\n        subMask1.style.transform = 'rotate(0deg)';\n        subMask2.style.transform = `rotate(${angle}deg)`;\n      } else {\n        subMask1.style.transform = '';\n        subMask2.style.transform = '';\n      }\n\n      // ARIA: Reflect value for screenreaders\n      this.setAttribute('aria-valuenow', this._value);\n      this.setAttribute('aria-valuemin', '0');\n      this.setAttribute('aria-valuemax', '100');\n    } else {\n      subMask1.style.transform = '';\n      subMask2.style.transform = '';\n    }\n\n    this.trigger('coral-wait:change');\n  }\n\n  /**\n   Returns {@link Wait} sizes.\n\n   @return {WaitSizeEnum}\n   */\n  static get size() {\n    return size;\n  }\n\n  /**\n   Returns {@link Wait} variants.\n\n   @return {WaitVariantEnum}\n   */\n  static get variant() {\n    return variant;\n  }\n\n  /** @ignore */\n  static get observedAttributes() {\n    return super.observedAttributes.concat(['size', 'centered', 'variant', 'value', 'indeterminate']);\n  }\n\n  /** @ignore */\n  attributeChangedCallback(name, oldValue, value) {\n    if (name === 'indeterminate' && transform.booleanAttr(value)) {\n      // Remember current value in case indeterminate is toggled back\n      this._oldValue = this._value || 0;\n    }\n\n    super.attributeChangedCallback(name, oldValue, value);\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    // ARIA\n    this.setAttribute('role', 'progressbar');\n\n    // Default reflected attributes\n    if (!this._size) {\n      this.size = size.MEDIUM;\n    }\n    if (!this._variant) {\n      this.variant = variant.DEFAULT;\n    }\n\n    // If no value is specified, indeterminate is set\n    if (!this._value) {\n      this.indeterminate = true;\n    }\n\n    // Centering reads the size\n    if (this.centered) {\n      this.centered = this.centered;\n    }\n\n    // Support cloneNode\n    const template = this.querySelectorAll('._coral-CircleLoader-track, ._coral-CircleLoader-fills');\n    for (let i = 0 ; i < template.length ; i++) {\n      template[i].remove();\n    }\n\n    // Render template\n    this.appendChild(this._elements.track);\n    this.appendChild(this._elements.fills);\n  }\n\n  /**\n   Triggered when the {@link Wait} value is changed.\n\n   @typedef {CustomEvent} coral-wait:change\n   */\n});\n\nexport default Wait;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2205,
    "kind": "typedef",
    "name": "WaitVariantEnum",
    "memberof": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wait/src/scripts/Wait.js~WaitVariantEnum",
    "access": "public",
    "description": "Enumeration for {@link Wait} variants.",
    "lineNumber": 28,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DEFAULT",
        "description": "The default variant."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "DOTS",
        "description": "Not supported. Falls back to DEFAULT."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "WaitVariantEnum"
    }
  },
  {
    "__docId__": 2206,
    "kind": "typedef",
    "name": "WaitSizeEnum",
    "memberof": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wait/src/scripts/Wait.js~WaitSizeEnum",
    "access": "public",
    "description": "Enumeration for {@link Wait} sizes.",
    "lineNumber": 45,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "SMALL",
        "description": "A small wait indicator."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "MEDIUM",
        "description": "A medium wait indicator. This is the default size."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "LARGE",
        "description": "A large wait indicator."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "WaitSizeEnum"
    }
  },
  {
    "__docId__": 2207,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wait/src/scripts/Wait.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 52,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2208,
    "kind": "variable",
    "name": "Wait",
    "memberof": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wait/src/scripts/Wait.js~Wait",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Wait}",
    "description": "A Wait component to be used to indicate a process that is in-progress for an indefinite amount of time.\nWhen the time is known, {@link Progress} should be used instead.",
    "lineNumber": 62,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.Wait"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A Wait component to be used to indicate a process that is in-progress for an indefinite amount of time.\nWhen the time is known, {@link Progress} should be used instead."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-wait"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-wait></coral-wait>",
      "<caption>JS constructor</caption>\nnew Coral.Wait();"
    ],
    "see": [
      "../examples/#wait"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2209,
    "kind": "typedef",
    "name": "coral-wait:change",
    "memberof": "coral-spectrum/coral-component-wait/src/scripts/Wait.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wait/src/scripts/Wait.js~coral-wait:change",
    "access": "public",
    "description": "Triggered when the {@link Wait} value is changed.",
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-wait:change"
    }
  },
  {
    "__docId__": 2210,
    "kind": "file",
    "name": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseComponent} from '../../../coral-base-component';\nimport {Collection} from '../../../coral-collection';\nimport '../../../coral-component-steplist';\nimport '../../../coral-component-panelstack';\nimport {commons} from '../../../coral-utils';\nimport {Decorator} from '../../../coral-decorator';\n\nconst CLASSNAME = '_coral-WizardView';\n\n/**\n @class Coral.WizardView\n @classdesc A WizardView component is the wrapping container used to create the typical Wizard pattern. This is intended\n to be used with a {@link StepList} and a {@link PanelStack}.\n @htmltag coral-wizardview\n @extends {HTMLElement}\n @extends {BaseComponent}\n */\nconst WizardView = Decorator(class extends BaseComponent(HTMLElement) {\n  /** @ignore */\n  constructor() {\n    super();\n\n    this._delegateEvents({\n      'capture:click coral-steplist[coral-wizardview-steplist] > coral-step': '_onStepClick',\n      'coral-steplist:change coral-steplist[coral-wizardview-steplist]': '_onStepListChange',\n      'click [coral-wizardview-previous]': '_onPreviousClick',\n      'click [coral-wizardview-next]': '_onNextClick'\n    });\n\n    // Init the collection mutation observer\n    this.stepLists._startHandlingItems(true);\n    this.panelStacks._startHandlingItems(true);\n\n    // Disable tracking for specific elements that are attached to the component.\n    this._observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        // Sync added nodes\n        for (let i = 0 ; i < mutation.addedNodes.length ; i++) {\n          const addedNode = mutation.addedNodes[i];\n\n          if (addedNode.setAttribute &&\n            (\n              addedNode.hasAttribute('coral-wizardview-next') ||\n              addedNode.hasAttribute('coral-wizardview-previous') ||\n              addedNode.hasAttribute('coral-wizardview-steplist') ||\n              addedNode.hasAttribute('coral-wizardview-panelstack')\n            )) {\n            addedNode.setAttribute('tracking', 'off');\n          }\n        }\n      });\n    });\n\n    this._observer.observe(this, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  /**\n   The set of controlled PanelStacks. Each PanelStack must have the <code>coral-wizardview-panelstack</code> attribute.\n\n   @type {Collection}\n   @readonly\n   */\n  get panelStacks() {\n    // Construct the collection on first request:\n    if (!this._panelStacks) {\n      this._panelStacks = new Collection({\n        host: this,\n        itemTagName: 'coral-panelstack',\n        // allows panelstack to be nested\n        itemSelector: ':scope > coral-panelstack[coral-wizardview-panelstack]',\n        onlyHandleChildren: true,\n        onItemAdded: this._onItemAdded\n      });\n    }\n\n    return this._panelStacks;\n  }\n\n  /**\n   The set of controlling StepLists. Each StepList must have the <code>coral-wizardview-steplist</code> attribute.\n\n   @type {Collection}\n   @readonly\n   */\n  get stepLists() {\n    // Construct the collection on first request:\n    if (!this._stepLists) {\n      this._stepLists = new Collection({\n        host: this,\n        itemTagName: 'coral-steplist',\n        // allows steplist to be nested\n        itemSelector: ':scope > coral-steplist[coral-wizardview-steplist]',\n        onlyHandleChildren: true,\n        onItemAdded: this._onItemAdded\n      });\n    }\n\n    return this._stepLists;\n  }\n\n  /**\n   Called by the Collection when an item is added\n\n   @private\n   */\n  _onItemAdded(item) {\n    this._selectItemByIndex(item, this._getSelectedIndex());\n  }\n\n  _onStepClick(event) {\n    this._trackEvent('click', 'coral-wizardview-steplist-step', event, event.matchedTarget);\n  }\n\n  /**\n   Handles the next button click.\n\n   @private\n   */\n  _onNextClick(event) {\n    // we stop propagation in case the wizard views are nested\n    event.stopPropagation();\n\n    this.next();\n\n    const stepList = this.stepLists.first();\n    const step = stepList.items.getAll()[this._getSelectedIndex()];\n    this._trackEvent('click', 'coral-wizardview-next', event, step);\n  }\n\n  /**\n   Handles the previous button click.\n\n   @private\n   */\n  _onPreviousClick(event) {\n    // we stop propagation in case the wizard views are nested\n    event.stopPropagation();\n\n    this.previous();\n\n    const stepList = this.stepLists.first();\n    const step = stepList.items.getAll()[this._getSelectedIndex()];\n    this._trackEvent('click', 'coral-wizardview-previous', event, step);\n  }\n\n  /**\n   Detects a change in the StepList and triggers an event.\n\n   @private\n   */\n  _onStepListChange(event) {\n    // Stop propagation of the events to support nested panels\n    event.stopPropagation();\n\n    // Get the step number\n    const index = event.target.items.getAll().indexOf(event.detail.selection);\n\n    // Sync the other StepLists\n    this._selectStep(index);\n\n    this.trigger('coral-wizardview:change', {\n      selection: event.detail.selection,\n      oldSelection: event.detail.oldSelection\n    });\n\n    this._trackEvent('change', 'coral-wizardview', event);\n  }\n\n  /** @private */\n  _getSelectedIndex() {\n    const stepList = this.stepLists.first();\n    if (!stepList) {\n      return -1;\n    }\n\n    let stepIndex = -1;\n    if (stepList.items) {\n      stepIndex = stepList.items.getAll().indexOf(stepList.selectedItem);\n    } else {\n      // Manually get the selected step\n      const steps = stepList.querySelectorAll('coral-step');\n\n      // Find the last selected step\n      for (let i = steps.length - 1 ; i >= 0 ; i--) {\n        if (steps[i].hasAttribute('selected')) {\n          stepIndex = i;\n          break;\n        }\n      }\n    }\n\n    return stepIndex;\n  }\n\n  /**\n   Select the step according to the provided index.\n\n   @param {*} component\n   The StepList or PanelStack to select the step on.\n   @param {Number} index\n   The index of the step that should be selected.\n\n   @private\n   */\n  _selectItemByIndex(component, index) {\n    let item = null;\n\n    // we need to set an id to be able to find direct children\n    component.id = component.id || commons.getUID();\n\n    // if collection api is available we use it to find the correct item\n    if (component.items) {\n      // Get the corresponding item\n      item = component.items.getAll()[index];\n    }\n    // Resort to querying manually on immediately children\n    else if (component.tagName === 'CORAL-STEPLIST') {\n      // @polyfill IE - we use id since :scope is not supported\n      item = component.querySelectorAll(`#${component.id} > coral-step`)[index];\n    } else if (component.tagName === 'CORAL-PANELSTACK') {\n      // @polyfill IE - we use id since :scope is not supported\n      item = component.querySelectorAll(`#${component.id} > coral-panel`)[index];\n    }\n\n    if (item) {\n      // we only select if not select to avoid mutations\n      if (!item.hasAttribute('selected')) {\n        item.setAttribute('selected', '');\n      }\n    }\n      // if we did not find an item to select, it means that the \"index\" is not available in the component, therefore we\n    // need to deselect all items\n    else {\n      // we use the component id to be able to find direct children\n      if (component.tagName === 'CORAL-STEPLIST') {\n        // @polyfill IE - we use id since :scope is not supported\n        item = component.querySelector(`#${component.id} > coral-step[selected]`);\n      } else if (component.tagName === 'CORAL-PANELSTACK') {\n        // @polyfill IE - we use id since :scope is not supported\n        item = component.querySelector(`#${component.id} > coral-panel[selected]`);\n      }\n\n      if (item) {\n        item.removeAttribute('selected');\n      }\n    }\n  }\n\n  /** @private */\n  _selectStep(index) {\n    // we apply the selection to all available steplists\n    this.stepLists.getAll().forEach((stepList) => {\n      this._selectItemByIndex(stepList, index);\n    });\n\n    // we apply the selection to all available panelstacks\n    this.panelStacks.getAll().forEach((panelStack) => {\n      this._selectItemByIndex(panelStack, index);\n    });\n  }\n\n  /**\n   Sets the correct selected item in every PanelStack.\n\n   @private\n   */\n  _syncPanelStackSelection(defaultIndex) {\n    // Find out which step we're on by checking the first StepList\n    let index = this._getSelectedIndex();\n\n    if (index === -1) {\n      if (typeof defaultIndex !== 'undefined') {\n        index = defaultIndex;\n      } else {\n        // No panel selected\n        return;\n      }\n    }\n\n    this.panelStacks.getAll().forEach((panelStack) => {\n      this._selectItemByIndex(panelStack, index);\n    });\n  }\n\n  /**\n   Selects the correct step in every StepList.\n\n   @private\n   */\n  _syncStepListSelection(defaultIndex) {\n    // Find out which step we're on by checking the first StepList\n    let index = this._getSelectedIndex();\n\n    if (index === -1) {\n      if (typeof defaultIndex !== 'undefined') {\n        index = defaultIndex;\n      } else {\n        // No step selected\n        return;\n      }\n    }\n\n    this.stepLists.getAll().forEach((stepList) => {\n      this._selectItemByIndex(stepList, index);\n    });\n  }\n\n  /**\n   Shows the next step. If the WizardView is already in the last step nothing will happen.\n\n   @emits {coral-wizardview:change}\n   */\n  next() {\n    const stepList = this.stepLists.first();\n    if (!stepList) {\n      return;\n    }\n\n    // Change to the next step\n    stepList.next();\n\n    // Select the step everywhere\n    this._selectStep(stepList.items.getAll().indexOf(stepList.selectedItem));\n  }\n\n  /**\n   Shows the previous step. If the WizardView is already in the first step nothing will happen.\n\n   @emits {coral-wizardview:change}\n   */\n  previous() {\n    const stepList = this.stepLists.first();\n    if (!stepList) {\n      return;\n    }\n\n    // Change to the previous step\n    stepList.previous();\n\n    // Select the step everywhere\n    this._selectStep(stepList.items.getAll().indexOf(stepList.selectedItem));\n  }\n\n  /** @ignore */\n  render() {\n    super.render();\n\n    this.classList.add(CLASSNAME);\n\n    this._syncStepListSelection(0);\n    this._syncPanelStackSelection(0);\n\n    // Disable tracking for specific elements that are attached to the component.\n    const selector = '[coral-wizardview-next],[coral-wizardview-previous],[coral-wizardview-steplist],[coral-wizardview-panelstack]';\n    const items = this.querySelectorAll(selector);\n    for (let i = 0 ; i < items.length ; i++) {\n      items[i].setAttribute('tracking', 'off');\n    }\n  }\n\n  /**\n   Triggered when the {@link WizardView} selected step list item has changed.\n\n   @typedef {CustomEvent} coral-wizardview:change\n\n   @property {Step} event.detail.selection\n   The new selected step list item.\n   @property {Step} event.detail.oldSelection\n   The prior selected step list item.\n   */\n});\n\nexport default WizardView;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2211,
    "kind": "variable",
    "name": "CLASSNAME",
    "memberof": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js~CLASSNAME",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2212,
    "kind": "variable",
    "name": "WizardView",
    "memberof": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js~WizardView",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{WizardView}",
    "description": "A WizardView component is the wrapping container used to create the typical Wizard pattern. This is intended\nto be used with a {@link StepList} and a {@link PanelStack}.",
    "lineNumber": 30,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.WizardView"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "A WizardView component is the wrapping container used to create the typical Wizard pattern. This is intended\nto be used with a {@link StepList} and a {@link PanelStack}."
      },
      {
        "tagName": "@htmltag",
        "tagValue": "coral-wizardview"
      },
      {
        "tagName": "@extends",
        "tagValue": "{HTMLElement}"
      },
      {
        "tagName": "@extends",
        "tagValue": "{BaseComponent}"
      }
    ],
    "examples": [
      "<caption>Markup</caption>\n<coral-wizardview></coral-wizardview>",
      "<caption>JS constructor</caption>\nnew Coral.WizardView();"
    ],
    "see": [
      "../examples/#wizardview"
    ],
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2213,
    "kind": "typedef",
    "name": "coral-wizardview:change",
    "memberof": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js",
    "static": true,
    "longname": "coral-spectrum/coral-component-wizardview/src/scripts/WizardView.js~coral-wizardview:change",
    "access": "public",
    "description": "Triggered when the {@link WizardView} selected step list item has changed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "Step"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.selection",
        "description": "The new selected step list item."
      },
      {
        "nullable": null,
        "types": [
          "Step"
        ],
        "spread": false,
        "optional": false,
        "name": "event.detail.oldSelection",
        "description": "The prior selected step list item."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-wizardview:change"
    }
  },
  {
    "__docId__": 2214,
    "kind": "file",
    "name": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// todo add tests\n\n// Used to store DateTimeFormat\nconst dateTimeFormats = {};\n\n// Default supported format\nconst DEFAULT_FORMAT = 'YYYY-MM-DD';\n\nconst transform2digit = (value) => {\n  const s = value.toString();\n  return s.length === 1 ? `0${s}` : s;\n};\n\n// Default locale\nlet globalLocale = document.documentElement.lang || window.navigator.language || 'en-US';\n\n// Uses Intl.DateTimeFormat to return a formatted date string\nconst formatDate = function (date, locale, options) {\n  let formattedDateString = '';\n  try {\n    const key = `${JSON.stringify(locale)}${JSON.stringify(options)}`;\n    const dateTimeFormat = dateTimeFormats[key];\n\n    // Use existing DateTimeFormat or create new one\n    if (!dateTimeFormat) {\n      dateTimeFormats[key] = new window.Intl.DateTimeFormat(locale, options);\n    }\n\n    // Format to string\n    formattedDateString = dateTimeFormats[key].format(date);\n  } catch (e) {\n    console.warn(e.message);\n  }\n\n  return formattedDateString;\n};\n\n/**\n The DateTime API is used as fallback to {@link momentJS}.\n\n @param {DateTime|Date|Array<Number>|String} value\n The initial date value. If none provided, the current day is used instead.\n */\nclass DateTime {\n  /**\n   @see https://momentjs.com/docs/#/parsing/now/\n   */\n  constructor(value) {\n    if (value instanceof this.constructor) {\n      // Copy properties\n      this._locale = value._locale;\n      this._value = value._value;\n      this._date = value._date;\n    } else {\n      this._locale = globalLocale;\n      this._value = value;\n\n      // Support Array\n      if (Array.isArray(value)) {\n        this._date = value.length ? new Date(value[0], value[1] || 0, value[2] || 1) : new Date();\n      } else if (typeof value === 'string') {\n        const isTime = value.indexOf(':') === 2;\n\n        // For time, we only need to set hours and minutes using current date\n        if (isTime) {\n          const time = value.split(':');\n          const hours = parseInt(time[0], 10);\n          const minutes = parseInt(time[1], 10);\n\n          if (hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59) {\n            this._date = new Date();\n            this._date.setHours(time[0]);\n            this._date.setMinutes(time[1]);\n          } else {\n            this._date = new Date('Invalid Date');\n          }\n        } else {\n          // If string is invalid, the date will be invalid too\n          // \"replace\" fixes the one day off issue\n          this._date = new Date(this._value.replace(/-/g, '/').replace(/T.+/, ''));\n        }\n      } else if (this._value === null) {\n        this._date = new Date('Invalid Date');\n      } else {\n        // Create a Date instance from the value or use current day if value is missing\n        this._date = this._value ? new Date(this._value) : new Date();\n      }\n    }\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/i18n/instance-locale/\n   */\n  locale(value) {\n    if (value) {\n      this._locale = value;\n    }\n\n    return this._locale;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/displaying/as-javascript-date/\n   */\n  toDate() {\n    return this._date;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/parsing/moment-clone/\n   */\n  clone() {\n    const clone = new this.constructor(this._value);\n    clone._date = this._date;\n    return clone;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/displaying/format/\n   */\n  format(format) {\n    let formattedDateString = '';\n\n    if (!format) {\n      format = DEFAULT_FORMAT;\n    }\n\n    if (format === DEFAULT_FORMAT) {\n      formattedDateString += this._date.getFullYear();\n      formattedDateString += '-';\n      formattedDateString += transform2digit(this._date.getMonth() + 1);\n      formattedDateString += '-';\n      formattedDateString += transform2digit(this._date.getDate());\n    } else if (format === 'MMMM YYYY') {\n      formattedDateString += formatDate(this._date, this._locale, {month: 'long'});\n      formattedDateString += ' ';\n      formattedDateString += this._date.getFullYear();\n    } else if (format === 'LL') {\n      formattedDateString += formatDate(this._date, this._locale, {\n        month: 'long',\n        year: 'numeric',\n        day: '2-digit'\n      });\n    } else if (format === 'dd') {\n      formattedDateString += formatDate(this._date, this._locale, {weekday: 'short'});\n    } else if (format === 'dddd') {\n      formattedDateString += formatDate(this._date, this._locale, {weekday: 'long'});\n    } else if (format === 'HH:mm') {\n      formattedDateString += transform2digit(this._date.getHours());\n      formattedDateString += ':';\n      formattedDateString += transform2digit(this._date.getMinutes());\n    } else if (format === 'HH') {\n      formattedDateString += transform2digit(this._date.getHours());\n    } else if (format === 'mm') {\n      formattedDateString += transform2digit(this._date.getMinutes());\n    } else if (format === 'YYYY-MM-DD[T]HH:mmZ') {\n      formattedDateString += this._date.getFullYear();\n      formattedDateString += '-';\n      formattedDateString += transform2digit(this._date.getMonth() + 1);\n      formattedDateString += '-';\n      formattedDateString += transform2digit(this._date.getDate());\n\n      formattedDateString += 'T';\n\n      formattedDateString += transform2digit(this._date.getHours());\n      formattedDateString += ':';\n      formattedDateString += transform2digit(this._date.getMinutes());\n\n      const timezone = -1 * (this._date.getTimezoneOffset() / 60);\n      let abs = Math.abs(timezone);\n      abs = abs < 10 ? `0${abs}` : abs.toString();\n\n      formattedDateString += timezone < 0 ? `-${abs}:00` : `+${abs}:00`;\n    } else {\n      format = typeof format === 'object' ? format : {};\n      formattedDateString = formatDate(this._date, this._locale, format);\n    }\n\n    return formattedDateString;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/year/\n   */\n  year() {\n    return this._date.getFullYear();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/month/\n   */\n  month() {\n    return this._date.getMonth();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/week/\n   */\n  week() {\n    // Source : https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php\n    const date = new Date(Date.UTC(this._date.getFullYear(), this._date.getMonth(), this._date.getDate()));\n    const dayNum = date.getUTCDay() || 7;\n    date.setUTCDate(date.getUTCDate() + 4 - dayNum);\n    const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\n    return Math.ceil(((date - yearStart) / 86400000 + 1) / 7);\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/day/\n   */\n  day(day) {\n    if (typeof day === 'number') {\n      this._date.setDate(this._date.getDate() - (this._date.getDay() || 7) + day);\n\n      return this;\n    }\n\n    return this._date.getDay();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/hour/\n   */\n  hours(hours) {\n    if (typeof hours === 'number') {\n      this._date.setHours(hours);\n\n      return this;\n    }\n\n    return this._date.getHours();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/minute/\n   */\n  minutes(minutes) {\n    if (typeof minutes === 'number') {\n      this._date.setMinutes(minutes);\n\n      return this;\n    }\n\n    return this._date.getMinutes();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/get-set/date/\n   */\n  date() {\n    return this._date.getDate();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/manipulating/add/\n   */\n  add(value, type) {\n    let multiplier = 1;\n    switch (type) {\n      case 'year':\n      case 'years':\n        multiplier = 12;\n      case 'month':\n      case 'months':\n        const dayOfMonth = this._date.getDate();\n        this._date.setMonth(this._date.getMonth() + multiplier * value);\n        if (this._date.getDate() != dayOfMonth) {\n          this._date.setDate(0);\n        }\n        break;\n      case 'week':\n      case 'weeks':\n        multiplier = 7;\n      case 'day':\n      case 'days':\n        this._date.setDate(this._date.getDate() + multiplier * value);\n        break;\n    }\n\n    return this;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/manipulating/subtract/\n   */\n  subtract(value, type) {\n    let multiplier = 1;\n    switch (type) {\n      case 'year':\n      case 'years':\n        multiplier = 12;\n      case 'month':\n      case 'months':\n        const dayOfMonth = this._date.getDate();\n        this._date.setMonth(this._date.getMonth() - multiplier * value);\n        if (this._date.getDate() != dayOfMonth) {\n          this._date.setDate(0);\n        }\n        break;\n      case 'week':\n      case 'weeks':\n        multiplier = 7;\n      case 'day':\n      case 'days':\n        this._date.setDate(this._date.getDate() - multiplier * value);\n        break;\n    }\n\n    return this;\n  }\n\n\n  /**\n   @see https://momentjs.com/docs/#/displaying/days-in-month/\n  */\n  daysInMonth() {\n    return new Date(this._date.getFullYear(), this._date.getMonth() + 1, 0).getDate();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/displaying/difference/\n   */\n  diff(obj) {\n    let diff = this._date.getTime() - obj._date.getTime();\n\n    let timezoneDiff = this._date.getTimezoneOffset() - obj._date.getTimezoneOffset();\n    if (timezoneDiff !== 0) {\n      diff -= timezoneDiff * 60000;\n    }\n\n    return diff / 86400000;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/manipulating/start-of/\n   */\n  startOf(value) {\n    if (value === 'day') {\n      // Today\n      this._date = new Date(this._date.getFullYear(), this._date.getMonth(), this._date.getDate());\n    } else if (value === 'month') {\n      this._date = new Date(this._date.getFullYear(), this._date.getMonth(), 1);\n    } else if (value === 'year') {\n      this._date = new Date(new Date().getFullYear(), 0, 1);\n    }\n\n    return this;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/query/is-before/\n   */\n  isBefore(coralDate, unit) {\n    if (coralDate && coralDate._date) {\n      return unit ? coralDate[unit]() > this[unit]() : coralDate._date > this._date;\n    }\n\n    return false;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/query/is-after/\n   */\n  isAfter(coralDate, unit) {\n    if (coralDate && coralDate._date) {\n      return unit ? coralDate[unit]() < this[unit]() : coralDate._date < this._date;\n    }\n\n    return false;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/query/is-same/\n   */\n  isSame(obj, type) {\n    if (type === 'hour') {\n      return obj && obj.clone()._date.getHours() === this.clone()._date.getHours();\n    } else if (type === 'minute') {\n      return obj && obj.clone()._date.getMinutes() === this.clone()._date.getMinutes();\n    } else if (type === 'day') {\n      return obj && obj.clone().startOf('day')._date.getTime() === this.clone().startOf('day')._date.getTime();\n    }\n\n    return obj && obj.clone()._date.getTime() === this.clone()._date.getTime();\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/parsing/is-valid/\n   */\n  isValid() {\n    return this._date.toString() !== 'Invalid Date';\n  }\n\n  /**\n   @ignore\n   Not supported so we return an empty object\n   */\n  static localeData() {\n    return {};\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/i18n/changing-locale/\n   */\n  static locale(value) {\n    if (value) {\n      globalLocale = value;\n    }\n\n    return globalLocale;\n  }\n\n  /**\n   @see https://momentjs.com/docs/#/query/is-a-moment/\n   */\n  static isMoment(obj) {\n    return obj instanceof this;\n  }\n\n  /**\n   @return {momentJS|DateTime}\n   */\n  static get Moment() {\n    return window.moment || this;\n  }\n}\n\nexport default DateTime;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2215,
    "kind": "variable",
    "name": "dateTimeFormats",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~dateTimeFormats",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Copyright 2019 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.",
    "lineNumber": 16,
    "type": {
      "types": [
        "{}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2216,
    "kind": "variable",
    "name": "DEFAULT_FORMAT",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DEFAULT_FORMAT",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2217,
    "kind": "function",
    "name": "transform2digit",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~transform2digit",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2218,
    "kind": "variable",
    "name": "globalLocale",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~globalLocale",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 27,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2219,
    "kind": "function",
    "name": "formatDate",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~formatDate",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 30,
    "undocument": true,
    "params": [
      {
        "name": "date",
        "types": [
          "*"
        ]
      },
      {
        "name": "locale",
        "types": [
          "*"
        ]
      },
      {
        "name": "options",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2220,
    "kind": "class",
    "name": "DateTime",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js",
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{DateTime}",
    "description": "The DateTime API is used as fallback to {@link momentJS}.",
    "lineNumber": 56,
    "params": [
      {
        "nullable": null,
        "types": [
          "DateTime",
          "Date",
          "Array<Number>",
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The initial date value. If none provided, the current day is used instead."
      }
    ],
    "interface": false
  },
  {
    "__docId__": 2221,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#constructor",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/parsing/now/"
    ],
    "lineNumber": 60
  },
  {
    "__docId__": 2222,
    "kind": "member",
    "name": "_locale",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#_locale",
    "access": "private",
    "description": null,
    "lineNumber": 63,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2223,
    "kind": "member",
    "name": "_value",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#_value",
    "access": "private",
    "description": null,
    "lineNumber": 64,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2224,
    "kind": "member",
    "name": "_date",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#_date",
    "access": "private",
    "description": null,
    "lineNumber": 65,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2233,
    "kind": "method",
    "name": "locale",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#locale",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/i18n/instance-locale/"
    ],
    "lineNumber": 106,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2235,
    "kind": "method",
    "name": "toDate",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#toDate",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/displaying/as-javascript-date/"
    ],
    "lineNumber": 117,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2236,
    "kind": "method",
    "name": "clone",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#clone",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/parsing/moment-clone/"
    ],
    "lineNumber": 124,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2237,
    "kind": "method",
    "name": "format",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#format",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/displaying/format/"
    ],
    "lineNumber": 133,
    "params": [
      {
        "name": "format",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2238,
    "kind": "method",
    "name": "year",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#year",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/year/"
    ],
    "lineNumber": 197,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2239,
    "kind": "method",
    "name": "month",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#month",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/month/"
    ],
    "lineNumber": 204,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2240,
    "kind": "method",
    "name": "week",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#week",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/week/"
    ],
    "lineNumber": 211,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2241,
    "kind": "method",
    "name": "day",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#day",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/day/"
    ],
    "lineNumber": 223,
    "params": [
      {
        "name": "day",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2242,
    "kind": "method",
    "name": "hours",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#hours",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/hour/"
    ],
    "lineNumber": 236,
    "params": [
      {
        "name": "hours",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2243,
    "kind": "method",
    "name": "minutes",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#minutes",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/minute/"
    ],
    "lineNumber": 249,
    "params": [
      {
        "name": "minutes",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2244,
    "kind": "method",
    "name": "date",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#date",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/get-set/date/"
    ],
    "lineNumber": 262,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2245,
    "kind": "method",
    "name": "add",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#add",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/manipulating/add/"
    ],
    "lineNumber": 269,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      },
      {
        "name": "type",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2246,
    "kind": "method",
    "name": "subtract",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#subtract",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/manipulating/subtract/"
    ],
    "lineNumber": 298,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      },
      {
        "name": "type",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2247,
    "kind": "method",
    "name": "daysInMonth",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#daysInMonth",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/displaying/days-in-month/"
    ],
    "lineNumber": 328,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2248,
    "kind": "method",
    "name": "diff",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#diff",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/displaying/difference/"
    ],
    "lineNumber": 335,
    "params": [
      {
        "name": "obj",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2249,
    "kind": "method",
    "name": "startOf",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#startOf",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/manipulating/start-of/"
    ],
    "lineNumber": 349,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2253,
    "kind": "method",
    "name": "isBefore",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#isBefore",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/query/is-before/"
    ],
    "lineNumber": 365,
    "params": [
      {
        "name": "coralDate",
        "types": [
          "*"
        ]
      },
      {
        "name": "unit",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2254,
    "kind": "method",
    "name": "isAfter",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#isAfter",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/query/is-after/"
    ],
    "lineNumber": 376,
    "params": [
      {
        "name": "coralDate",
        "types": [
          "*"
        ]
      },
      {
        "name": "unit",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2255,
    "kind": "method",
    "name": "isSame",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#isSame",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/query/is-same/"
    ],
    "lineNumber": 387,
    "params": [
      {
        "name": "obj",
        "types": [
          "*"
        ]
      },
      {
        "name": "type",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2256,
    "kind": "method",
    "name": "isValid",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime#isValid",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/parsing/is-valid/"
    ],
    "lineNumber": 402,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2257,
    "kind": "method",
    "name": "localeData",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime.localeData",
    "access": "public",
    "description": "",
    "lineNumber": 410,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "{}"
      ]
    }
  },
  {
    "__docId__": 2258,
    "kind": "method",
    "name": "locale",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime.locale",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/i18n/changing-locale/"
    ],
    "lineNumber": 417,
    "params": [
      {
        "name": "value",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2259,
    "kind": "method",
    "name": "isMoment",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime.isMoment",
    "access": "public",
    "description": "",
    "see": [
      "https://momentjs.com/docs/#/query/is-a-moment/"
    ],
    "lineNumber": 428,
    "params": [
      {
        "name": "obj",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2260,
    "kind": "member",
    "name": "Moment",
    "memberof": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-datetime/src/scripts/DateTime.js~DateTime.Moment",
    "access": "public",
    "description": "",
    "lineNumber": 435,
    "return": {
      "nullable": null,
      "types": [
        "momentJS",
        "DateTime"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2261,
    "kind": "file",
    "name": "coral-spectrum/coral-decorator/src/scripts/Decorator.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Decorator will be used to intercept any call before passing it to actual element.\n * kind of wrapper around each coral component\n * @private\n */\nconst Decorator = (superClass) => class extends superClass {\n\n  /** @ignore */\n  _resumeCallback() {\n    super._resumeCallback();\n  }\n\n  /** @ignore */\n  _suspendCallback() {\n    super._suspendCallback();\n  }\n\n  /** @ignore */\n  connectedCallback() {\n    if(!this.isConnected) {\n      // component is not connected  do nothing\n      return;\n    } else if (this._disconnected === false || this._ignoreConnectedCallback === true) {\n      // either component is being moved around DOM or callback are ignored, resume suspended component\n      // use this hook to only change required state and properties.\n      // avoid executing whole connect and disconnect hooks\n      this._resumeCallback();\n    } else {\n      // normal flow\n      super.connectedCallback();\n    }\n  }\n\n  /** @ignore */\n  disconnectedCallback() {\n    if(!(this._disconnected === false)) {\n      // component is already disconnected do nothing\n      return;\n    } else if(this.isConnected || this._ignoreConnectedCallback === true) {\n      // either component is being moved around DOM or callback are ignored, only suspend component.\n      // use this hook to only change required state and properties.\n      // avoid executing whole connect and disconnect hooks\n      this._suspendCallback();\n    } else {\n      // normal flow\n      super.disconnectedCallback();\n    }\n  }\n};\n\nexport default Decorator;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-decorator/src/scripts/Decorator.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2262,
    "kind": "function",
    "name": "Decorator",
    "memberof": "coral-spectrum/coral-decorator/src/scripts/Decorator.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-decorator/src/scripts/Decorator.js~Decorator",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Decorator}",
    "description": "Decorator will be used to intercept any call before passing it to actual element.\nkind of wrapper around each coral component",
    "lineNumber": 18,
    "ignore": true,
    "params": [
      {
        "name": "superClass",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2263,
    "kind": "file",
    "name": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport Vent from '@adobe/vent';\nimport {events, validate, transform, commons} from '../../../coral-utils';\n\n// Attributes\nconst DROP_ZONE_ATTRIBUTE = 'coral-dragaction-dropzone';\nconst HANDLE_ATTRIBUTE = 'coral-dragaction-handle';\nconst AXIS_ATTRIBUTE = 'coral-dragaction-axis';\nconst SCROLL_ATTRIBUTE = 'coral-dragaction-scroll';\nconst CONTAINMENT_ATTRIBUTE = 'coral-dragaction-containment';\n\n// Classes\nconst OPEN_HAND_CLASS = 'u-coral-openHand';\nconst CLOSE_HAND_CLASS = 'u-coral-closedHand';\nconst IS_DRAGGING_CLASS = 'is-dragging';\n\n// Scroll offset default values\nconst DEFAULT_SCROLL_OFFSET = 20;\nconst DEFAULT_SCROLL_BY = 10;\n\n/**\n Enumeration for {@link DragAction} axis restrictions.\n\n @typedef {Object} DragActionAxisEnum\n\n @property {String} FREE\n Allows vertically and horizontally dragging.\n @property {String} VERTICAL\n Allows vertically dragging only.\n @property {String} HORIZONTAL\n Allows horizontally dragging only.\n */\nconst axis = {\n  FREE: 'free',\n  VERTICAL: 'vertical',\n  HORIZONTAL: 'horizontal'\n};\n\n/**\n @ignore\n @param {HTMLElement} element\n @returns {HTMLElement}\n First parent element with overflow [hidden|scroll|auto]\n */\nfunction getViewContainer(element) {\n  while (element) {\n    const p = element.parentNode;\n\n    if (!p) {\n      return p;\n    }\n    if (p.matches('body')) {\n      return p;\n    }\n\n    const computedStyle = window.getComputedStyle(p);\n    const overflow = computedStyle.overflow;\n\n    // IE11 can return a value for overflow even if it was not set compared to other browsers so we check for X and Y.\n    const overflowX = computedStyle.overflowX;\n    const overflowY = computedStyle.overflowY;\n\n    if ((overflow === 'hidden' || overflow === 'auto' || overflow === 'scroll') &&\n      // @polyfill IE11\n      overflow === overflowX && overflow === overflowY) {\n      return p;\n    }\n\n    element = p;\n  }\n}\n\n/**\n @ignore\n @param {String|HTMLElement|NodeList} el\n @returns {Array.<HTMLElement>}\n X and y position whether event was generated by a click or a touch\n */\nfunction transformToArray(el) {\n  if (typeof el === 'string') {\n    return Array.prototype.slice.call(document.querySelectorAll(el));\n  } else if (el instanceof HTMLElement) {\n    return [el];\n  } else if (Object.prototype.toString.call(el) === '[object NodeList]') {\n    return Array.prototype.slice.call(el);\n  }\n}\n\n/**\n @ignore\n @param {Object} event\n @returns {Object}\n X and y position whether event was generated by a click or a touch\n */\nfunction getPagePosition(event) {\n  let touch = {};\n\n  if (event.changedTouches && event.changedTouches.length > 0) {\n    touch = event.changedTouches[0];\n  } else if (event.touches && event.touches.length > 0) {\n    touch = event.touches[0];\n  }\n\n  return {\n    x: touch.pageX || event.pageX,\n    y: touch.pageY || event.pageY\n  };\n}\n\n/**\n @ignore\n @param {HTMLElement} scrollingElement\n element that scrolls the document\n @param {HTMLElement} a\n @param {HTMLElement} b\n @returns {Boolean}\n Whether a is within b bounds\n */\nfunction within(scrollingElement, a, b) {\n  const aBoundingClientRect = a.getBoundingClientRect();\n  const bBoundingClientRect = b.getBoundingClientRect();\n  const documentScrollTop = scrollingElement.scrollTop;\n  const documentScrollLeft = scrollingElement.scrollLeft;\n\n  const al = aBoundingClientRect.left + documentScrollLeft;\n  const ar = al + aBoundingClientRect.width;\n  const bl = bBoundingClientRect.left + documentScrollLeft;\n  const br = bl + bBoundingClientRect.width;\n\n  const at = aBoundingClientRect.top + documentScrollTop;\n  const ab = at + aBoundingClientRect.height;\n  const bt = bBoundingClientRect.top + documentScrollTop;\n  const bb = bt + bBoundingClientRect.height;\n\n  return !(bl > ar || br < al || (bt > ab || bb < at));\n}\n\n/**\n @ignore\n @param {DragAction} dragAction\n Coral.DragAction instance\n @returns {HTMLElement}\n The dropzone that is being hovered by the dragged element or null if none\n */\nfunction isOverDropZone(dragAction) {\n  let el = null;\n  if (dragAction._dropZones && dragAction._dropZones.length) {\n    dragAction._dropZones.some((dropZone) => {\n      if (within(dragAction._scrollingElement, dragAction._dragElement, dropZone)) {\n        el = dropZone;\n        return true;\n      }\n\n      return false;\n    });\n  }\n\n  return el;\n}\n\nfunction getScrollParent(node) {\n  if (!node) {\n    return null;\n  }\n\n  return node.scrollHeight > node.clientHeight ? node : getScrollParent(node.parentNode);\n}\n\n/**\n @class Coral.DragAction\n @classdesc This a decorator which adds draggable functionality to elements.\n To define draggable actions on specific elements, handles can be used.\n A handle is given a special attribute :\n - <code>coral-dragaction</code> attribute adds draggable functionality to the corresponding element.\n - <code>coral-dragaction-handle</code> attribute allows dragging only by dragging the specified handle.\n - <code>coral-dragaction-dropzone</code> attribute is used to indicate possible dropzones making it possible\n to build drag-and-drop enabled interfaces in conjunction with <code>DragAction</code> events.\n - <code>coral-dragaction-axis</code> and setting it to either <code>horizontal</code> or <code>vertical</code>,\n it is possible to restrict the drag'n'drop to a single axis.\n - <code>coral-dragaction-scroll</code> attribute will scroll the container when the draggable is moved beyond the viewport.\n - <code>coral-dragaction-containment</code>, the draggable element will be constrained to its container.\n @param {String|HTMLElement} dragElement\n The draggable element.\n */\nclass DragAction {\n  /**\n   Takes the {HTMLElement} to be dragged as argument.\n\n   @param {HTMLElement} dragElement\n   */\n  constructor(dragElement) {\n    if (!dragElement) {\n      throw new Error('Coral.DragAction: dragElement is missing');\n    }\n\n    let el = null;\n    if (dragElement instanceof HTMLElement) {\n      el = dragElement;\n    } else if (typeof dragElement === 'string') {\n      el = document.querySelector(dragElement);\n      if (!el) {\n        throw new Error('Coral.DragAction: dragElement is null');\n      }\n    }\n\n    this._id = commons.getUID();\n    this._dragElementValue = dragElement;\n    this._dragElement = el;\n\n    // Destroy instance if existing\n    if (this._dragElement.dragAction) {\n      this._dragElement.dragAction.destroy();\n    }\n\n    const computedStyle = window.getComputedStyle(this._dragElement);\n\n    // Store initial position\n    this._initialPosition = {\n      position: computedStyle.position,\n      left: computedStyle.left,\n      top: computedStyle.top\n    };\n\n    // Prepare Vent\n    this._dragEvents = new Vent(this._dragElement);\n\n    // Handle options. Binds events to dragElement if no handles defined or found\n    this.handle = this._dragElement.getAttribute(HANDLE_ATTRIBUTE);\n\n    // DropZone options\n    this.dropZone = this._dragElement.getAttribute(DROP_ZONE_ATTRIBUTE);\n\n    // Axis horizontal|vertical\n    this.axis = this._dragElement.getAttribute(AXIS_ATTRIBUTE);\n\n    // Scroll options\n    this.scroll = this._dragElement.matches(`[${SCROLL_ATTRIBUTE}]`);\n\n    // Restriction to container\n    this.containment = this._dragElement.matches(`[${CONTAINMENT_ATTRIBUTE}]`);\n\n    this._drag = this._drag.bind(this);\n    this._dragEnd = this._dragEnd.bind(this);\n    this._dragOnKeyEnd = this._dragOnKeyEnd.bind(this);\n\n    events.on(`touchmove.DragAction${this._id}`, this._drag);\n    events.on(`mousemove.DragAction${this._id}`, this._drag);\n    events.on(`touchend.DragAction${this._id}`, this._dragEnd);\n    events.on(`mouseup.DragAction${this._id}`, this._dragEnd);\n\n    // Store reference on dragElement\n    this._dragElement.dragAction = this;\n  }\n\n  /**\n   The draggable element.\n\n   @name dragElement\n   @readonly\n   @type {String|HTMLElement}\n   @htmlattribute coral-dragaction\n   */\n  get dragElement() {\n    return this._dragElementValue;\n  }\n\n  /**\n   The handle allowing to drag the element.\n\n   @name handle\n   @type {String|HTMLElement}\n   @htmlattribute coral-dragaction-handle\n   */\n  get handle() {\n    return this._handle;\n  }\n\n  set handle(value) {\n    // Set new value\n    this._handle = value;\n\n    // Unbind events\n    this._dragEvents.off('.DragAction');\n\n    // Remove classes\n    document.body.classList.remove(CLOSE_HAND_CLASS);\n    this._dragElement.classList.remove(IS_DRAGGING_CLASS);\n    if (this._handles && this._handles.length) {\n      this._handles.forEach((handle) => {\n        handle._dragEvents.off('.DragAction');\n        handle.classList.remove(OPEN_HAND_CLASS);\n      });\n    } else {\n      this._dragElement.classList.remove(OPEN_HAND_CLASS);\n    }\n\n    if (typeof value === 'string' ||\n      value instanceof HTMLElement ||\n      Object.prototype.toString.call(value) === '[object NodeList]') {\n      this._handles = transformToArray(value);\n\n      // Bind events\n      if (this._handles && this._handles.length) {\n        this._handles.forEach((handle) => {\n          handle._dragEvents = handle._dragEvents || new Vent(handle);\n          handle._dragEvents.on('mousedown.DragAction', this._dragStart.bind(this));\n          handle._dragEvents.on('touchstart.DragAction', this._dragStart.bind(this));\n          handle._dragEvents.on('keydown.DragAction', this._dragOnKeyDown.bind(this));\n          handle._dragEvents.on('keyup.DragAction', this._dragOnKeyUp.bind(this));\n          handle._dragEvents.on('focusout.DragAction', this._dragOnFocusOut.bind(this));\n          handle.classList.add(OPEN_HAND_CLASS);\n        });\n      } else {\n        this._dragEvents.on('touchstart.DragAction', this._dragStart.bind(this));\n        this._dragEvents.on('mousedown.DragAction', this._dragStart.bind(this));\n        this._dragEvents.on('keydown.DragAction', this._dragOnKeyDown.bind(this));\n        this._dragEvents.on('keyup.DragAction', this._dragOnKeyUp.bind(this));\n        this._dragEvents.on('focusout.DragAction', this._dragOnFocusOut.bind(this));\n        this._dragElement.classList.add(OPEN_HAND_CLASS);\n      }\n    } else {\n      // Defaults to the dragElement\n      this._handles = [];\n      this._dragEvents.on('touchstart.DragAction', this._dragStart.bind(this));\n      this._dragEvents.on('mousedown.DragAction', this._dragStart.bind(this));\n      this._dragEvents.on('keydown.DragAction', this._dragOnKeyDown.bind(this));\n      this._dragEvents.on('keyup.DragAction', this._dragOnKeyUp.bind(this));\n      this._dragEvents.on('focusout.DragAction', this._dragOnFocusOut.bind(this));\n      this._dragElement.classList.add(OPEN_HAND_CLASS);\n    }\n  }\n\n  /**\n   The dropZone to drop the dragged element.\n\n   @name dropZone\n   @type {String|HTMLElement}\n   @htmlattribute coral-dragaction-dropzone\n   */\n  get dropZone() {\n    return this._dropZone;\n  }\n\n  set dropZone(value) {\n    // Set new value\n    this._dropZone = value;\n    this._dropZoneEntered = false;\n\n    if (typeof value === 'string' ||\n      value instanceof HTMLElement ||\n      Object.prototype.toString.call(value) === '[object NodeList]') {\n      this._dropZones = transformToArray(value);\n    } else {\n      this._dropZones = [];\n    }\n  }\n\n  /**\n   The axis to constrain drag movement. See {@link DragActionAxisEnum}.\n\n   @name axis\n   @type {String}\n   @default DragActionAxisEnum.FREE\n   @htmlattribute coral-dragaction-axis\n   */\n  get axis() {\n    return this._axis;\n  }\n\n  set axis(value) {\n    value = transform.string(value);\n    this._axis = validate.enumeration(axis)(value) && value || axis.FREE;\n  }\n\n  /**\n   Whether to scroll the container when the draggable element is moved beyond the viewport.\n\n   @name scroll\n   @default false\n   @type {Boolean}\n   @htmlattribute coral-dragaction-scroll\n   */\n  get scroll() {\n    return this._scroll;\n  }\n\n  set scroll(value) {\n    this._scroll = transform.boolean(value);\n  }\n\n  get useScrollParent() {\n    return this._useScrollParent || false;\n  }\n\n  set useScrollParent(value) {\n    this._useScrollParent = transform.boolean(value);\n  }\n\n  /**\n   Whether to constrain the draggable element to its container viewport.\n\n   @name containment\n   @default false\n   @type {Boolean}\n   @htmlattribute coral-dragaction-containment\n   */\n  get containment() {\n    return this._containment;\n  }\n\n  set containment(value) {\n    this._containment = transform.boolean(value);\n  }\n\n  /** @private */\n  _dragStart(event) {\n    if (events.isVirtualEvent(event)) {\n      return;\n    }\n\n    // Container\n    const viewContainer = getViewContainer(this._dragElement) || document.body;\n    this._container = this.useScrollParent ? getScrollParent(this._dragElement) || viewContainer : viewContainer;\n\n    // Prevent dragging ghost image\n    if (event.target.tagName === 'IMG') {\n      event.preventDefault();\n    }\n\n    // Prevent touchscreen windows to scroll while dragging\n    events.on('touchmove.DragAction', (e) => {\n      e.preventDefault();\n    });\n\n    document.body._overflow = window.getComputedStyle(document.body).overflow;\n    document.body.style.overflow = 'hidden';\n\n    if (!this._container.matches('body')) {\n      this._container._overflow = window.getComputedStyle(this._container).overflow;\n      this._container.style.overflow = this.scroll ? 'scroll' : 'hidden';\n    }\n\n    const pagePosition = getPagePosition(event);\n    const dragElementBoundingClientRect = this._dragElement.getBoundingClientRect();\n    this._dragPosition = getPagePosition(event);\n    this._dragPosition.y -= dragElementBoundingClientRect.top + this._scrollingElement.scrollTop;\n    this._dragPosition.x -= dragElementBoundingClientRect.left + this._scrollingElement.scrollLeft;\n\n    // Handle classes\n    document.body.classList.add(CLOSE_HAND_CLASS);\n    if (this._handles && this._handles.length) {\n      this._handles.forEach((handle) => {\n        handle.classList.remove(OPEN_HAND_CLASS);\n      });\n    } else {\n      this._dragElement.classList.remove(OPEN_HAND_CLASS);\n    }\n    this._dragElement.classList.add(IS_DRAGGING_CLASS);\n\n    // Apply relative position by default\n    if (window.getComputedStyle(this._dragElement).position === 'static') {\n      this._dragElement.style.position = 'relative';\n    }\n\n    this._dragEvents.dispatch('coral-dragaction:dragstart', {\n      detail: {\n        dragElement: this._dragElement,\n        pageX: pagePosition.x,\n        pageY: pagePosition.y\n      }\n    });\n  }\n\n  /** @private */\n  _drag(event) {\n    if (this._dragElement.classList.contains(IS_DRAGGING_CLASS)) {\n      const pagePosition = getPagePosition(event);\n\n      const documentScrollTop = this._scrollingElement.scrollTop;\n      const documentScrollLeft = this._scrollingElement.scrollLeft;\n\n      const dragElementBoundingClientRect = this._dragElement.getBoundingClientRect();\n      const dragElementHeight = dragElementBoundingClientRect.height;\n      const dragElementWidth = dragElementBoundingClientRect.width;\n      const dragElementPosition = {\n        top: dragElementBoundingClientRect.top + documentScrollTop,\n        left: dragElementBoundingClientRect.left + documentScrollLeft\n      };\n      const dragElementComputedStyle = window.getComputedStyle(this._dragElement);\n      const dragElementCSSPosition = {\n        top: parseFloat(dragElementComputedStyle.top) || 0,\n        left: parseFloat(dragElementComputedStyle.left) || 0\n      };\n\n      const containerBoundingClientRect = this._container.getBoundingClientRect();\n      const containerWidth = containerBoundingClientRect.width;\n      const containerHeight = containerBoundingClientRect.height;\n      const containerPosition = {\n        top: containerBoundingClientRect.top + documentScrollTop,\n        left: containerBoundingClientRect.left + documentScrollLeft\n      };\n\n      this._dragEvents.dispatch('coral-dragaction:drag', {\n        detail: {\n          dragElement: this._dragElement,\n          pageX: pagePosition.x,\n          pageY: pagePosition.y\n        }\n      });\n\n      // Remove selection\n      if (document.selection) {\n        document.selection.empty();\n      } else if (window.getSelection) {\n        // @polyfill ie\n        if (window.getSelection().removeAllRanges) {\n          window.getSelection().removeAllRanges();\n        }\n      }\n\n      // Need to scroll ?\n      if (this.scroll) {\n        // Scroll element is the document\n        if (this._container === document.body) {\n          // Scroll to the top\n          if (dragElementBoundingClientRect.top < DEFAULT_SCROLL_OFFSET) {\n            this._scrollingElement.scrollTop = documentScrollTop - DEFAULT_SCROLL_BY;\n          }\n          // Scroll to the bottom but don't go further than the maximum scroll position of the document\n          else if (dragElementBoundingClientRect.top + dragElementBoundingClientRect.height > window.innerHeight - DEFAULT_SCROLL_OFFSET &&\n            dragElementPosition.top + dragElementBoundingClientRect.height + DEFAULT_SCROLL_OFFSET < this._scrollingElement.scrollHeight) {\n            this._scrollingElement.scrollTop = documentScrollTop + DEFAULT_SCROLL_BY;\n          }\n\n          // Scroll to the left\n          if (dragElementBoundingClientRect.left < DEFAULT_SCROLL_OFFSET) {\n            this._scrollingElement.scrollLeft = documentScrollLeft - DEFAULT_SCROLL_BY;\n          }\n          // Scroll to the right but don't go further than the maximum scroll position of the document\n          else if (dragElementBoundingClientRect.left + dragElementBoundingClientRect.width > window.innerWidth - DEFAULT_SCROLL_OFFSET &&\n            dragElementPosition.left + dragElementBoundingClientRect.width + DEFAULT_SCROLL_OFFSET < this._scrollingElement.scrollWidth) {\n            this._scrollingElement.scrollLeft = documentScrollLeft + DEFAULT_SCROLL_BY;\n          }\n        }\n        // Scroll element is an element other than the document\n        else {\n          // Scroll to the top\n          if (dragElementBoundingClientRect.top - containerBoundingClientRect.top < DEFAULT_SCROLL_OFFSET) {\n            this._container.scrollTop = this._container.scrollTop - DEFAULT_SCROLL_BY;\n          }\n          // Scroll to the bottom but don't go further than the maximum scroll position of the container\n          else if (dragElementBoundingClientRect.top - containerBoundingClientRect.top + dragElementBoundingClientRect.height > containerBoundingClientRect.height - DEFAULT_SCROLL_OFFSET &&\n            dragElementBoundingClientRect.top - containerBoundingClientRect.top + dragElementBoundingClientRect.height < containerBoundingClientRect.height) {\n            this._container.scrollTop = this._container.scrollTop + DEFAULT_SCROLL_BY;\n          }\n\n          // Scroll to the left\n          if (dragElementBoundingClientRect.left - containerBoundingClientRect.left < DEFAULT_SCROLL_OFFSET) {\n            this._container.scrollLeft = this._container.scrollLeft - DEFAULT_SCROLL_BY;\n          }\n          // Scroll to the bottom but don't go further than the maximum scroll position of the container\n          else if (dragElementBoundingClientRect.left - containerBoundingClientRect.left + dragElementBoundingClientRect.width > containerBoundingClientRect.width - DEFAULT_SCROLL_OFFSET &&\n            dragElementBoundingClientRect.left - containerBoundingClientRect.left + dragElementBoundingClientRect.width < containerBoundingClientRect.width) {\n            this._container.scrollLeft = this._container.scrollLeft + DEFAULT_SCROLL_BY;\n          }\n        }\n      }\n\n      // Set drag element's new position\n      const newPosition = {};\n\n      if (this.axis !== 'horizontal') {\n        const top = pagePosition.y - this._dragPosition.y;\n\n        // Applying container containment for y movements\n        if (this.containment) {\n          if (top >= containerPosition.top && top + dragElementHeight <= containerPosition.top + containerHeight) {\n            newPosition.top = top;\n          }\n          // put the drag element to the container's top\n          else if (pagePosition.y <= containerPosition.top) {\n            newPosition.top = containerPosition.top;\n          }\n          // put the drag element to the container's bottom\n          else if (pagePosition.y >= containerPosition.top + containerHeight) {\n            newPosition.top = containerPosition.top + containerHeight - dragElementHeight;\n          }\n        } else {\n          newPosition.top = top;\n        }\n      }\n      if (this.axis !== 'vertical') {\n        const left = pagePosition.x - this._dragPosition.x;\n\n        // Applying container containment for x movements\n        if (this.containment) {\n          if (left >= containerPosition.left && left + dragElementWidth <= containerPosition.left + containerWidth) {\n            newPosition.left = left;\n          }\n          // put the drag element to the container's left\n          else if (pagePosition.x <= containerPosition.left) {\n            newPosition.left = containerPosition.left;\n          }\n          // put the drag element to the container's right\n          else if (pagePosition.x >= containerPosition.left + containerWidth) {\n            newPosition.left = containerPosition.left + containerWidth - dragElementWidth;\n          }\n        } else {\n          newPosition.left = left;\n        }\n      }\n\n      // Set the new position\n      this._dragElement.style.top = `${newPosition.top - dragElementPosition.top + dragElementCSSPosition.top}px`;\n      this._dragElement.style.left = `${newPosition.left - dragElementPosition.left + dragElementCSSPosition.left}px`;\n\n      // Trigger dropzone related events\n      const dropZone = isOverDropZone(this);\n      if (dropZone) {\n        this._dropElement = dropZone;\n        if (!this._dropZoneEntered) {\n          this._dropZoneEntered = true;\n          this._dragEvents.dispatch('coral-dragaction:dragenter', {\n            detail: {\n              dragElement: this._dragElement,\n              pageX: pagePosition.x,\n              pageY: pagePosition.y,\n              dropElement: this._dropElement\n            }\n          });\n        }\n\n        this._dragEvents.dispatch('coral-dragaction:dragover', {\n          detail: {\n            dragElement: this._dragElement,\n            pageX: pagePosition.x,\n            pageY: pagePosition.y,\n            dropElement: this._dropElement\n          }\n        });\n      } else if (this._dropZoneEntered) {\n        this._dragEvents.dispatch('coral-dragaction:dragleave', {\n          detail: {\n            dragElement: this._dragElement,\n            pageX: pagePosition.x,\n            pageY: pagePosition.y,\n            dropElement: this._dropElement\n          }\n        });\n        this._dropZoneEntered = false;\n      }\n    }\n  }\n\n  /** @private */\n  _dragEnd(event) {\n    if (this._dragElement.classList.contains(IS_DRAGGING_CLASS)) {\n      const pagePosition = getPagePosition(event);\n\n      // Restore overflow\n      document.body.style.overflow = document.body._overflow;\n      document.body._overflow = undefined;\n\n      if (!this._container.matches('body')) {\n        this._container.style.overflow = this._container._overflow;\n        this._container._overflow = undefined;\n      }\n\n      document.body.classList.remove(CLOSE_HAND_CLASS);\n      this._dragElement.classList.remove(IS_DRAGGING_CLASS);\n\n      if (this._handles && this._handles.length) {\n        this._handles.forEach((handle) => {\n          handle.classList.add(OPEN_HAND_CLASS);\n        });\n      } else {\n        this._dragElement.classList.add(OPEN_HAND_CLASS);\n      }\n\n      if (this._dropZoneEntered) {\n        const dropZone = isOverDropZone(this);\n        if (dropZone) {\n          this._dropElement = dropZone;\n          this._dragEvents.dispatch('coral-dragaction:drop', {\n            detail: {\n              dragElement: this._dragElement,\n              pageX: pagePosition.x,\n              pageY: pagePosition.y,\n              dropElement: this._dropElement\n            }\n          });\n        }\n      }\n\n      this._dragEvents.dispatch('coral-dragaction:dragend', {\n        detail: {\n          dragElement: this._dragElement,\n          pageX: pagePosition.x,\n          pageY: pagePosition.y\n        }\n      });\n    }\n  }\n\n  /** @private */\n  _dragOnKeyDown(event) {\n    switch (event.code) {\n      case 'Space':\n      case 'ArrowDown':\n      case 'ArrowUp':\n      case 'Enter':\n      case 'Escape':\n        event.preventDefault();\n        break;\n    }\n  }\n\n  /** @private */\n  _dragOnKeyUp(event) {\n    switch (event.code) {\n      case 'Space':\n        if (!this.isKeyboardDragging) {\n          this._dragEvents.dispatch('coral-dragaction:dragonkeyspace', {\n            detail: {\n              dragElement: this._dragElement\n            }\n          });\n          this.isKeyboardDragging = true;\n        } else {\n          this._dragOnKeyEnd();\n        }\n        break;\n      case 'ArrowDown':\n        this._dragEvents.dispatch('coral-dragaction:dragoveronkeyarrowdown', {\n          detail: {\n            dragElement: this._dragElement\n          }\n        });\n        break;\n      case 'ArrowUp':\n        this._dragEvents.dispatch('coral-dragaction:dragoveronkeyarrowup', {\n          detail: {\n            dragElement: this._dragElement\n          }\n        });\n        break;\n      case 'Enter':\n      case 'Escape':\n        this._dragOnKeyEnd();\n        break;\n    }\n  }\n\n  /** @private */\n  _dragOnFocusOut(event) {\n    window.setTimeout(() => {\n      if (document.activeElement === event.target) {\n        return;\n      }\n      this._dragOnKeyEnd();\n    }, 0);\n  }\n\n  /** @private */\n  _dragOnKeyEnd() {\n    this._dragEvents.dispatch('coral-dragaction:dragendonkey', {\n      detail: {\n        dragElement: this._dragElement\n      }\n    });\n    this.isKeyboardDragging = false;\n  }\n\n  /**\n   Remove draggable actions\n\n   @function destroy\n   @param {Boolean} restorePosition\n   Whether to restore the draggable element to its initial position\n   */\n  destroy(restorePosition) {\n    // Unbind events and remove classes\n    document.body.classList.remove(CLOSE_HAND_CLASS);\n    this._dragElement.classList.remove(IS_DRAGGING_CLASS);\n    if (this._handles && this._handles.length) {\n      this._handles.forEach((handle) => {\n        handle._dragEvents.off('.DragAction');\n        handle.classList.remove(OPEN_HAND_CLASS);\n      });\n    } else {\n      this._dragEvents.off('.DragAction');\n      this._dragElement.classList.remove(OPEN_HAND_CLASS);\n    }\n\n    events.off(`.DragAction${this._id}`);\n\n    // Restore overflow\n    if (document.body._overflow) {\n      document.body.style.overflow = document.body._overflow;\n      document.body._overflow = undefined;\n    }\n\n    // Container might not have been initialized\n    if (this._container) {\n      if (!this._container.matches('body') && this._container._overflow) {\n        this._container.style.overflow = this._container._overflow;\n        this._container._overflow = undefined;\n      }\n    }\n\n    // Set to initial position\n    if (restorePosition) {\n      this._dragElement.style.position = this._initialPosition.position;\n      this._dragElement.style.top = this._initialPosition.top;\n      this._dragElement.style.left = this._initialPosition.left;\n    }\n\n    // Remove reference\n    this._dragElement.dragAction = undefined;\n  }\n\n  /**\n   Returns {@link DragAction} axis restrictions.\n\n   @return {DragActionAxisEnum}\n   */\n  static get axis() {\n    return axis;\n  }\n\n  /** @private */\n  get _scrollingElement() {\n    // @polyfill ie11\n    // Element that scrolls the document.\n    return document.scrollingElement || document.documentElement;\n  }\n\n  /**\n   Triggered when the {@link DragAction#dragElement} starts to be dragged.\n\n   @typedef {CustomEvent} coral-dragaction:dragstart\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is being dragged.\n\n   @typedef {CustomEvent} coral-dragaction:drag\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} stops to be dragged.\n\n   @typedef {CustomEvent} coral-dragaction:dragend\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} enters a drop element.\n\n   @typedef {CustomEvent} coral-dragaction:dragenter\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {HTMLElement} dropElement\n   The drop element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is over a drop element.\n\n   @typedef {CustomEvent} coral-dragaction:dragover\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {HTMLElement} dropElement\n   The drop element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} leaves a drop element.\n\n   @typedef {CustomEvent} coral-dragaction:dragleave\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {HTMLElement} dropElement\n   The drop element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is dropped on a drop element.\n\n   @typedef {CustomEvent} coral-dragaction:drop\n\n   @property {HTMLElement} dragElement\n   The dragged element\n   @property {HTMLElement} dropElement\n   The drop element\n   @property {Number} pageX\n   The mouse position relative to the left edge of the document.\n   @property {Number} pageY\n   The mouse position relative to the top edge of the document.\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is selected to be dragged.\n   @typedef {CustomEvent} coral-dragaction:dragonkeyspace\n   @property {HTMLElement} dragElement\n   The dragged element\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is moved on arrow down pressed.\n   @typedef {CustomEvent} coral-dragaction:dragoveronkeyarrowdown\n   @property {HTMLElement} dragElement\n   The dragged element\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is moved on arrow up pressed.\n   @typedef {CustomEvent} coral-dragaction:dragoveronkeyarrowup\n   @property {HTMLElement} dragElement\n   The dragged element\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is losing focus.\n   @typedef {CustomEvent} coral-dragaction:dragonkeyfocusout\n   @property {HTMLElement} dragElement\n   The dragged element\n   */\n\n  /**\n   Triggered when the {@link DragAction#dragElement} is dropped on key.\n   @typedef {CustomEvent} coral-dragaction:dragendonkey\n   @property {HTMLElement} dragElement\n   The dragged element\n   */\n}\n\nexport default DragAction;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2264,
    "kind": "variable",
    "name": "DROP_ZONE_ATTRIBUTE",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DROP_ZONE_ATTRIBUTE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 17,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2265,
    "kind": "variable",
    "name": "HANDLE_ATTRIBUTE",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~HANDLE_ATTRIBUTE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 18,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2266,
    "kind": "variable",
    "name": "AXIS_ATTRIBUTE",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~AXIS_ATTRIBUTE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2267,
    "kind": "variable",
    "name": "SCROLL_ATTRIBUTE",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~SCROLL_ATTRIBUTE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 20,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2268,
    "kind": "variable",
    "name": "CONTAINMENT_ATTRIBUTE",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~CONTAINMENT_ATTRIBUTE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 21,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2269,
    "kind": "variable",
    "name": "OPEN_HAND_CLASS",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~OPEN_HAND_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2270,
    "kind": "variable",
    "name": "CLOSE_HAND_CLASS",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~CLOSE_HAND_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2271,
    "kind": "variable",
    "name": "IS_DRAGGING_CLASS",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~IS_DRAGGING_CLASS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 26,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2272,
    "kind": "variable",
    "name": "DEFAULT_SCROLL_OFFSET",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DEFAULT_SCROLL_OFFSET",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 29,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2273,
    "kind": "variable",
    "name": "DEFAULT_SCROLL_BY",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DEFAULT_SCROLL_BY",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 30,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2274,
    "kind": "typedef",
    "name": "DragActionAxisEnum",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragActionAxisEnum",
    "access": "public",
    "description": "Enumeration for {@link DragAction} axis restrictions.",
    "lineNumber": 44,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "FREE",
        "description": "Allows vertically and horizontally dragging."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "VERTICAL",
        "description": "Allows vertically dragging only."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "HORIZONTAL",
        "description": "Allows horizontally dragging only."
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "DragActionAxisEnum"
    }
  },
  {
    "__docId__": 2275,
    "kind": "function",
    "name": "getViewContainer",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~getViewContainer",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 56,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nFirst parent element with overflow [hidden|scroll|auto]"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "First parent element with overflow [hidden|scroll|auto]"
    }
  },
  {
    "__docId__": 2276,
    "kind": "function",
    "name": "transformToArray",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~transformToArray",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 90,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array.<HTMLElement>}\nX and y position whether event was generated by a click or a touch"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String",
          "HTMLElement",
          "NodeList"
        ],
        "spread": false,
        "optional": false,
        "name": "el",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array.<HTMLElement>"
      ],
      "spread": false,
      "description": "X and y position whether event was generated by a click or a touch"
    }
  },
  {
    "__docId__": 2277,
    "kind": "function",
    "name": "getPagePosition",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~getPagePosition",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 106,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object}\nX and y position whether event was generated by a click or a touch"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "X and y position whether event was generated by a click or a touch"
    }
  },
  {
    "__docId__": 2278,
    "kind": "function",
    "name": "within",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~within",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 130,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean}\nWhether a is within b bounds"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "scrollingElement",
        "description": "element that scrolls the document"
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "a",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "b",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "Whether a is within b bounds"
    }
  },
  {
    "__docId__": 2279,
    "kind": "function",
    "name": "isOverDropZone",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~isOverDropZone",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 156,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{HTMLElement}\nThe dropzone that is being hovered by the dragged element or null if none"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "DragAction"
        ],
        "spread": false,
        "optional": false,
        "name": "dragAction",
        "description": "Coral.DragAction instance"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "HTMLElement"
      ],
      "spread": false,
      "description": "The dropzone that is being hovered by the dragged element or null if none"
    }
  },
  {
    "__docId__": 2280,
    "kind": "function",
    "name": "getScrollParent",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~getScrollParent",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 172,
    "undocument": true,
    "params": [
      {
        "name": "node",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2281,
    "kind": "class",
    "name": "DragAction",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{DragAction}",
    "description": "This a decorator which adds draggable functionality to elements.\nTo define draggable actions on specific elements, handles can be used.\nA handle is given a special attribute :\n- <code>coral-dragaction</code> attribute adds draggable functionality to the corresponding element.\n- <code>coral-dragaction-handle</code> attribute allows dragging only by dragging the specified handle.\n- <code>coral-dragaction-dropzone</code> attribute is used to indicate possible dropzones making it possible\nto build drag-and-drop enabled interfaces in conjunction with <code>DragAction</code> events.\n- <code>coral-dragaction-axis</code> and setting it to either <code>horizontal</code> or <code>vertical</code>,\nit is possible to restrict the drag'n'drop to a single axis.\n- <code>coral-dragaction-scroll</code> attribute will scroll the container when the draggable is moved beyond the viewport.\n- <code>coral-dragaction-containment</code>, the draggable element will be constrained to its container.",
    "lineNumber": 196,
    "unknown": [
      {
        "tagName": "@class",
        "tagValue": "Coral.DragAction"
      },
      {
        "tagName": "@classdesc",
        "tagValue": "This a decorator which adds draggable functionality to elements.\nTo define draggable actions on specific elements, handles can be used.\nA handle is given a special attribute :\n- <code>coral-dragaction</code> attribute adds draggable functionality to the corresponding element.\n- <code>coral-dragaction-handle</code> attribute allows dragging only by dragging the specified handle.\n- <code>coral-dragaction-dropzone</code> attribute is used to indicate possible dropzones making it possible\nto build drag-and-drop enabled interfaces in conjunction with <code>DragAction</code> events.\n- <code>coral-dragaction-axis</code> and setting it to either <code>horizontal</code> or <code>vertical</code>,\nit is possible to restrict the drag'n'drop to a single axis.\n- <code>coral-dragaction-scroll</code> attribute will scroll the container when the draggable is moved beyond the viewport.\n- <code>coral-dragaction-containment</code>, the draggable element will be constrained to its container."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String",
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The draggable element."
      }
    ],
    "interface": false,
    "examples": [
      "<caption>JS constructor</caption>\nnew Coral.DragAction();"
    ],
    "see": [
      "../examples/#dragaction"
    ]
  },
  {
    "__docId__": 2282,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#constructor",
    "access": "public",
    "description": "Takes the {HTMLElement} to be dragged as argument.",
    "lineNumber": 202,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": ""
      }
    ]
  },
  {
    "__docId__": 2283,
    "kind": "member",
    "name": "_id",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_id",
    "access": "private",
    "description": null,
    "lineNumber": 217,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2284,
    "kind": "member",
    "name": "_dragElementValue",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragElementValue",
    "access": "private",
    "description": null,
    "lineNumber": 218,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2285,
    "kind": "member",
    "name": "_dragElement",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragElement",
    "access": "private",
    "description": null,
    "lineNumber": 219,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2286,
    "kind": "member",
    "name": "_initialPosition",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_initialPosition",
    "access": "private",
    "description": null,
    "lineNumber": 229,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "{\"position\": *, \"left\": *, \"top\": *}"
      ]
    }
  },
  {
    "__docId__": 2287,
    "kind": "member",
    "name": "_dragEvents",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragEvents",
    "access": "private",
    "description": null,
    "lineNumber": 236,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2296,
    "kind": "member",
    "name": "dragElement",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#dragElement",
    "access": "public",
    "description": "The draggable element.\n<ul><li><code>read-only</code></li></ul>",
    "lineNumber": 274,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String",
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2297,
    "kind": "member",
    "name": "handle",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#handle",
    "access": "public",
    "description": "The handle allowing to drag the element.",
    "lineNumber": 285,
    "unknown": [
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction-handle"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String",
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2299,
    "kind": "member",
    "name": "_handle",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_handle",
    "access": "private",
    "description": null,
    "lineNumber": 291,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2300,
    "kind": "member",
    "name": "_handles",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_handles",
    "access": "private",
    "description": null,
    "lineNumber": 311,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2302,
    "kind": "member",
    "name": "dropZone",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#dropZone",
    "access": "public",
    "description": "The dropZone to drop the dragged element.",
    "lineNumber": 351,
    "unknown": [
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction-dropzone"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String",
        "HTMLElement"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2304,
    "kind": "member",
    "name": "_dropZone",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dropZone",
    "access": "private",
    "description": null,
    "lineNumber": 357,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2305,
    "kind": "member",
    "name": "_dropZoneEntered",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dropZoneEntered",
    "access": "private",
    "description": null,
    "lineNumber": 358,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2306,
    "kind": "member",
    "name": "_dropZones",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dropZones",
    "access": "private",
    "description": null,
    "lineNumber": 363,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2308,
    "kind": "member",
    "name": "axis",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#axis",
    "access": "public",
    "description": "The axis to constrain drag movement. See {@link DragActionAxisEnum}.\n<ul><li><code>DragActionAxisEnum.FREE</code> by default.</li></ul>",
    "lineNumber": 377,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "DragActionAxisEnum.FREE"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction-axis"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2310,
    "kind": "member",
    "name": "_axis",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_axis",
    "access": "private",
    "description": null,
    "lineNumber": 383,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2311,
    "kind": "member",
    "name": "scroll",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#scroll",
    "access": "public",
    "description": "Whether to scroll the container when the draggable element is moved beyond the viewport.\n<ul><li><code>false</code> by default.</li></ul>",
    "lineNumber": 394,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction-scroll"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2313,
    "kind": "member",
    "name": "_scroll",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_scroll",
    "access": "private",
    "description": null,
    "lineNumber": 399,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2314,
    "kind": "member",
    "name": "useScrollParent",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#useScrollParent",
    "access": "public",
    "description": "null",
    "lineNumber": 402,
    "undocument": true,
    "modality": "both",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2316,
    "kind": "member",
    "name": "_useScrollParent",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_useScrollParent",
    "access": "private",
    "description": null,
    "lineNumber": 407,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2317,
    "kind": "member",
    "name": "containment",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#containment",
    "access": "public",
    "description": "Whether to constrain the draggable element to its container viewport.\n<ul><li><code>false</code> by default.</li></ul>",
    "lineNumber": 418,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "false"
      },
      {
        "tagName": "@htmlattribute",
        "tagValue": "coral-dragaction-containment"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2319,
    "kind": "member",
    "name": "_containment",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_containment",
    "access": "private",
    "description": null,
    "lineNumber": 423,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2320,
    "kind": "method",
    "name": "_dragStart",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragStart",
    "access": "private",
    "description": null,
    "lineNumber": 427,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2321,
    "kind": "member",
    "name": "_container",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_container",
    "access": "private",
    "description": null,
    "lineNumber": 434,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2322,
    "kind": "member",
    "name": "_dragPosition",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragPosition",
    "access": "private",
    "description": null,
    "lineNumber": 456,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2323,
    "kind": "method",
    "name": "_drag",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_drag",
    "access": "private",
    "description": null,
    "lineNumber": 486,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2324,
    "kind": "member",
    "name": "_dropElement",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dropElement",
    "access": "private",
    "description": null,
    "lineNumber": 631,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2327,
    "kind": "method",
    "name": "_dragEnd",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragEnd",
    "access": "private",
    "description": null,
    "lineNumber": 667,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2329,
    "kind": "method",
    "name": "_dragOnKeyDown",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragOnKeyDown",
    "access": "private",
    "description": null,
    "lineNumber": 717,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2330,
    "kind": "method",
    "name": "_dragOnKeyUp",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragOnKeyUp",
    "access": "private",
    "description": null,
    "lineNumber": 730,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2331,
    "kind": "member",
    "name": "isKeyboardDragging",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#isKeyboardDragging",
    "access": "public",
    "description": null,
    "lineNumber": 739,
    "undocument": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2332,
    "kind": "method",
    "name": "_dragOnFocusOut",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragOnFocusOut",
    "access": "private",
    "description": null,
    "lineNumber": 766,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2333,
    "kind": "method",
    "name": "_dragOnKeyEnd",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_dragOnKeyEnd",
    "access": "private",
    "description": null,
    "lineNumber": 776,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2335,
    "kind": "method",
    "name": "destroy",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#destroy",
    "access": "public",
    "description": "Remove draggable actions",
    "lineNumber": 792,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "destroy"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "restorePosition",
        "description": "Whether to restore the draggable element to its initial position"
      }
    ],
    "return": null
  },
  {
    "__docId__": 2336,
    "kind": "member",
    "name": "axis",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.axis",
    "access": "public",
    "description": "Returns {@link DragAction} axis restrictions.",
    "lineNumber": 838,
    "return": {
      "nullable": null,
      "types": [
        "DragActionAxisEnum"
      ],
      "spread": false,
      "description": ""
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2337,
    "kind": "member",
    "name": "_scrollingElement",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction#_scrollingElement",
    "access": "private",
    "description": null,
    "lineNumber": 843,
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2338,
    "kind": "typedef",
    "name": "coral-dragaction:dragstart",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragstart",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} starts to be dragged.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragstart"
    }
  },
  {
    "__docId__": 2339,
    "kind": "typedef",
    "name": "coral-dragaction:drag",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:drag",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is being dragged.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:drag"
    }
  },
  {
    "__docId__": 2340,
    "kind": "typedef",
    "name": "coral-dragaction:dragend",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragend",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} stops to be dragged.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragend"
    }
  },
  {
    "__docId__": 2341,
    "kind": "typedef",
    "name": "coral-dragaction:dragenter",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragenter",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} enters a drop element.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dropElement",
        "description": "The drop element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragenter"
    }
  },
  {
    "__docId__": 2342,
    "kind": "typedef",
    "name": "coral-dragaction:dragover",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragover",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is over a drop element.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dropElement",
        "description": "The drop element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragover"
    }
  },
  {
    "__docId__": 2343,
    "kind": "typedef",
    "name": "coral-dragaction:dragleave",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragleave",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} leaves a drop element.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dropElement",
        "description": "The drop element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragleave"
    }
  },
  {
    "__docId__": 2344,
    "kind": "typedef",
    "name": "coral-dragaction:drop",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:drop",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is dropped on a drop element.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      },
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dropElement",
        "description": "The drop element"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageX",
        "description": "The mouse position relative to the left edge of the document."
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": false,
        "name": "pageY",
        "description": "The mouse position relative to the top edge of the document."
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:drop"
    }
  },
  {
    "__docId__": 2345,
    "kind": "typedef",
    "name": "coral-dragaction:dragonkeyspace",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragonkeyspace",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is selected to be dragged.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragonkeyspace"
    }
  },
  {
    "__docId__": 2346,
    "kind": "typedef",
    "name": "coral-dragaction:dragoveronkeyarrowdown",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragoveronkeyarrowdown",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is moved on arrow down pressed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragoveronkeyarrowdown"
    }
  },
  {
    "__docId__": 2347,
    "kind": "typedef",
    "name": "coral-dragaction:dragoveronkeyarrowup",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragoveronkeyarrowup",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is moved on arrow up pressed.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragoveronkeyarrowup"
    }
  },
  {
    "__docId__": 2348,
    "kind": "typedef",
    "name": "coral-dragaction:dragonkeyfocusout",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragonkeyfocusout",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is losing focus.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragonkeyfocusout"
    }
  },
  {
    "__docId__": 2349,
    "kind": "typedef",
    "name": "coral-dragaction:dragendonkey",
    "memberof": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction",
    "static": true,
    "longname": "coral-spectrum/coral-dragaction/src/scripts/DragAction.js~DragAction.coral-dragaction:dragendonkey",
    "access": "public",
    "description": "Triggered when the {@link DragAction#dragElement} is dropped on key.",
    "properties": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "dragElement",
        "description": "The dragged element"
      }
    ],
    "type": {
      "types": [
        "CustomEvent"
      ],
      "optional": false,
      "name": "coral-dragaction:dragendonkey"
    }
  },
  {
    "__docId__": 2350,
    "kind": "file",
    "name": "coral-spectrum/coral-messenger/src/scripts/Messenger.js",
    "content": "/**\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {commons} from '../../../coral-utils';\n\nconst SCOPE_SELECTOR = ':scope > ';\n\n/**\n * Messenger will used to pass the messages from child component to its parent. Currently we are relying on\n * events to do the job. When a large DOM is connected, these events as a bulk leads to delays.\n * With the use of messenger we will directly call the parent method provided in the observed messages list.\n * The current implmentation only supports one to many mapping i.e. one parent and many children and any\n * in child property will result in execution of only one parent method. This should be used purely for\n * coral internal events and not any DOM based or public events.\n *\n * Limitations :\n * - This doesnot support the case where any change in child property, needs to be notified\n *   to two or more parents. This is achievable, but not currently supported.\n * - Use this to post message only coral internal events.\n * - Do not use for DOM events or public events.\n * @private\n */\n\nclass Messenger {\n  /** @ignore */\n  constructor(element) {\n    this._element = element;\n    this._connected = false;\n    this._clearQueue();\n    this._clearListeners();\n  }\n\n  /**\n   * checks whether Messenger is connected or not.\n   * @returns {Boolean} true if connected\n   * @private\n   */\n  get isConnected() {\n    return this._connected === true;\n  }\n\n  /**\n   * checks whether the event is silenced or not\n   * @returns {Boolean} true if silenced\n   * @private\n   */\n  get isSilenced() {\n    return this._element._silenced === true;\n  }\n\n  /**\n   * specifies the list of listener attached to messenger.\n   * @returns {Array} array of listeners\n   * @private\n   */\n  get listeners() {\n    return this._listeners;\n  }\n\n  /**\n   * add a message to the queue only if messenger is not connected\n   * message will be added only if element is not connected.\n   * @private\n   */\n  _addMessageToQueue(message, detail) {\n    if(!this.isConnected) {\n      this._queue.push({\n        message: message,\n        detail: detail\n      });\n    }\n  }\n\n  /**\n   * executes the stored queue messages.\n   * It will be executed when element is connected.\n   * @private\n   */\n  _executeQueue() {\n    this._queue.forEach((options) => {\n      this._postMessage(options.message, options.detail);\n    });\n    this._clearQueue();\n  }\n\n  /**\n   * empty the stored queue message\n   * @private\n   */\n  _clearQueue() {\n    this._queue = [];\n  }\n\n  /**\n   * clears the listeners\n   * @private\n   */\n  _clearListeners() {\n    this._listeners = [];\n  }\n\n  /**\n   * element should call this method when they are connected in DOM.\n   * its the responsibility of the element to call this hook\n   * @triggers `${element.tagName.toLowerCase()}:_messengerconnected`\n   * @private\n   */\n  connect() {\n    if(!this.isConnected) {\n      let element = this._element;\n\n      this._connected = true;\n\n      element.trigger(`${element.tagName.toLowerCase()}:_messengerconnected`, {\n        handler : this.registerListener.bind(this)\n      });\n      // post all stored messages\n      this._executeQueue();\n    }\n  }\n\n  /**\n   * add the listener to messenger\n   * this handler will be passed when messengerconnect event is trigger\n   * the handler needs to be executed by listeners.\n   * @private\n   */\n  registerListener(listener) {\n    if(listener) {\n      this._listeners.push(listener);\n    }\n  }\n\n  /**\n   * post the provided message to all listener.\n   * @param {String} message which should be posted\n   * @param {Object} additional detail which needs to be posted.\n   * @private\n   */\n  _postMessage(message, detail) {\n    let element = this._element;\n    this.listeners.forEach((listener) => {\n      let observedMessages = listener.observedMessages;\n      let messageInfo = observedMessages[message];\n\n      if(messageInfo) {\n        let selector;\n        let handler;\n        if(typeof messageInfo === 'string') {\n          selector = \"*\";\n          handler = messageInfo;\n        } else if(typeof messageInfo === 'object') {\n          selector = messageInfo.selector || \"*\";\n          handler = messageInfo.handler;\n        }\n\n        if(selector.indexOf(SCOPE_SELECTOR) === 0 ) {\n          if(!listener.id) {\n            listener.id = commons.getUID();\n          }\n          selector = selector.replace(SCOPE_SELECTOR, `#${listener.id} > `);\n        }\n\n        if(element.matches(selector)) {\n          listener[handler].call(listener, new Event({\n            target: element,\n            detail: detail,\n            type: message,\n            currentTarget: listener\n          }));\n        }\n      }\n    });\n  }\n\n  /**\n    * post the provided message to all listener,\n    * along with validating silencing and storing in queue\n    * @param {String} message which should be posted\n    * @param {Object} additional detail which needs to be posted.\n    * @private\n   */\n  postMessage(message, detail) {\n    if(this.isSilenced) {\n      return;\n    }\n\n    if(!this.isConnected) {\n      this._addMessageToQueue(message, detail);\n      return;\n    }\n\n    // element got disconnect and messenger not notified.\n    if(!this._element.isConnected) {\n      // disconnect messenger and again post the same message,\n      // message will get store in queue.\n      this.disconnect();\n      this.postMessage(message, detail);\n      return;\n    }\n\n    this._postMessage(message, detail);\n  }\n\n  /**\n    * element should call this method when they are disconnected from DOM.\n    * Its the responsibility of the element to call this hook\n    * @private\n   */\n  disconnect() {\n    if(this.isConnected) {\n      this._connected = false;\n      this._clearListeners();\n      this._clearQueue();\n    }\n  }\n}\n\n/**\n * This Event class is just a bogus class, current message callback aspects\n * actual event as a parameter, since we are directly calling the method instead\n * of triggering event, will pass an instance of this disguised object,\n * to avoid breaks.\n * This just disguise the  most used functionality of event object\n * @private\n */\nclass Event {\n  constructor(options) {\n    this._detail = options.detail;\n    this._target = options.target;\n    this._type = options.type;\n    this._currentTarget = options.currentTarget;\n    this._defaultPrevented = false;\n    this._propagationStopped = false;\n    this._immediatePropagationStopped = false;\n  }\n\n  get detail() {\n    return this._detail;\n  }\n\n  get type() {\n    return this._type;\n  }\n\n  get target() {\n    return this._target;\n  }\n\n  get currentTarget() {\n    return this._currentTarget;\n  }\n\n  preventDefault() {\n    this._defaultPrevented = true;\n  }\n\n  stopPropagation() {\n    this._propagationStopped = true;\n  }\n\n  stopImmediatePropagation() {\n    this._immediatePropagationStopped = true;\n  }\n}\n\nMessenger.Event = Event;\n\nexport default Messenger;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-messenger/src/scripts/Messenger.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2351,
    "kind": "variable",
    "name": "SCOPE_SELECTOR",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js",
    "static": true,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~SCOPE_SELECTOR",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 15,
    "undocument": true,
    "type": {
      "types": [
        "string"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2352,
    "kind": "class",
    "name": "Event",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js",
    "static": true,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "This Event class is just a bogus class, current message callback aspects\nactual event as a parameter, since we are directly calling the method instead\nof triggering event, will pass an instance of this disguised object,\nto avoid breaks.\nThis just disguise the  most used functionality of event object",
    "lineNumber": 236,
    "interface": false,
    "ignore": true
  },
  {
    "__docId__": 2353,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 237,
    "undocument": true
  },
  {
    "__docId__": 2354,
    "kind": "member",
    "name": "_detail",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_detail",
    "access": "private",
    "description": null,
    "lineNumber": 238,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2355,
    "kind": "member",
    "name": "_target",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_target",
    "access": "private",
    "description": null,
    "lineNumber": 239,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2356,
    "kind": "member",
    "name": "_type",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_type",
    "access": "private",
    "description": null,
    "lineNumber": 240,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2357,
    "kind": "member",
    "name": "_currentTarget",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_currentTarget",
    "access": "private",
    "description": null,
    "lineNumber": 241,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2358,
    "kind": "member",
    "name": "_defaultPrevented",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_defaultPrevented",
    "access": "private",
    "description": null,
    "lineNumber": 242,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2359,
    "kind": "member",
    "name": "_propagationStopped",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_propagationStopped",
    "access": "private",
    "description": null,
    "lineNumber": 243,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2360,
    "kind": "member",
    "name": "_immediatePropagationStopped",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#_immediatePropagationStopped",
    "access": "private",
    "description": null,
    "lineNumber": 244,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2361,
    "kind": "member",
    "name": "detail",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#detail",
    "access": "public",
    "description": null,
    "lineNumber": 247,
    "undocument": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2362,
    "kind": "member",
    "name": "type",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#type",
    "access": "public",
    "description": null,
    "lineNumber": 251,
    "undocument": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2363,
    "kind": "member",
    "name": "target",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#target",
    "access": "public",
    "description": null,
    "lineNumber": 255,
    "undocument": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2364,
    "kind": "member",
    "name": "currentTarget",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#currentTarget",
    "access": "public",
    "description": null,
    "lineNumber": 259,
    "undocument": true,
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2365,
    "kind": "method",
    "name": "preventDefault",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#preventDefault",
    "access": "public",
    "description": null,
    "lineNumber": 263,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2367,
    "kind": "method",
    "name": "stopPropagation",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#stopPropagation",
    "access": "public",
    "description": null,
    "lineNumber": 267,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2369,
    "kind": "method",
    "name": "stopImmediatePropagation",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Event#stopImmediatePropagation",
    "access": "public",
    "description": null,
    "lineNumber": 271,
    "undocument": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2371,
    "kind": "class",
    "name": "Messenger",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js",
    "static": true,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "access": "private",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{Messenger}",
    "description": "Messenger will used to pass the messages from child component to its parent. Currently we are relying on\nevents to do the job. When a large DOM is connected, these events as a bulk leads to delays.\nWith the use of messenger we will directly call the parent method provided in the observed messages list.\nThe current implmentation only supports one to many mapping i.e. one parent and many children and any\nin child property will result in execution of only one parent method. This should be used purely for\ncoral internal events and not any DOM based or public events.\n\nLimitations :\n- This doesnot support the case where any change in child property, needs to be notified\n  to two or more parents. This is achievable, but not currently supported.\n- Use this to post message only coral internal events.\n- Do not use for DOM events or public events.",
    "lineNumber": 33,
    "interface": false,
    "ignore": true
  },
  {
    "__docId__": 2372,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 35,
    "ignore": true
  },
  {
    "__docId__": 2373,
    "kind": "member",
    "name": "_element",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_element",
    "access": "private",
    "description": null,
    "lineNumber": 36,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2374,
    "kind": "member",
    "name": "_connected",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_connected",
    "access": "private",
    "description": null,
    "lineNumber": 37,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "boolean"
      ]
    }
  },
  {
    "__docId__": 2375,
    "kind": "member",
    "name": "isConnected",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#isConnected",
    "access": "private",
    "description": "checks whether Messenger is connected or not.",
    "lineNumber": 47,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} true if connected"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "true if connected"
    },
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2376,
    "kind": "member",
    "name": "isSilenced",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#isSilenced",
    "access": "private",
    "description": "checks whether the event is silenced or not",
    "lineNumber": 56,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} true if silenced"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "true if silenced"
    },
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2377,
    "kind": "member",
    "name": "listeners",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#listeners",
    "access": "private",
    "description": "specifies the list of listener attached to messenger.",
    "lineNumber": 65,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Array} array of listeners"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Array"
      ],
      "spread": false,
      "description": "array of listeners"
    },
    "modality": "readonly",
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2378,
    "kind": "method",
    "name": "_addMessageToQueue",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_addMessageToQueue",
    "access": "private",
    "description": "add a message to the queue only if messenger is not connected\nmessage will be added only if element is not connected.",
    "lineNumber": 74,
    "ignore": true,
    "params": [
      {
        "name": "message",
        "types": [
          "*"
        ]
      },
      {
        "name": "detail",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2379,
    "kind": "method",
    "name": "_executeQueue",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_executeQueue",
    "access": "private",
    "description": "executes the stored queue messages.\nIt will be executed when element is connected.",
    "lineNumber": 88,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2380,
    "kind": "method",
    "name": "_clearQueue",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_clearQueue",
    "access": "private",
    "description": "empty the stored queue message",
    "lineNumber": 99,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2381,
    "kind": "member",
    "name": "_queue",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_queue",
    "access": "private",
    "description": null,
    "lineNumber": 100,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2382,
    "kind": "method",
    "name": "_clearListeners",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_clearListeners",
    "access": "private",
    "description": "clears the listeners",
    "lineNumber": 107,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2383,
    "kind": "member",
    "name": "_listeners",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_listeners",
    "access": "private",
    "description": null,
    "lineNumber": 108,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2384,
    "kind": "method",
    "name": "connect",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#connect",
    "access": "private",
    "description": "element should call this method when they are connected in DOM.\nits the responsibility of the element to call this hook",
    "lineNumber": 117,
    "unknown": [
      {
        "tagName": "@triggers",
        "tagValue": "`${element.tagName.toLowerCase()}:_messengerconnected`"
      }
    ],
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2386,
    "kind": "method",
    "name": "registerListener",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#registerListener",
    "access": "private",
    "description": "add the listener to messenger\nthis handler will be passed when messengerconnect event is trigger\nthe handler needs to be executed by listeners.",
    "lineNumber": 137,
    "ignore": true,
    "params": [
      {
        "name": "listener",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2387,
    "kind": "method",
    "name": "_postMessage",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#_postMessage",
    "access": "private",
    "description": "post the provided message to all listener.",
    "lineNumber": 149,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "message",
        "description": "which should be posted"
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "additional",
        "description": "detail which needs to be posted."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2388,
    "kind": "method",
    "name": "postMessage",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#postMessage",
    "access": "private",
    "description": "post the provided message to all listener,\nalong with validating silencing and storing in queue",
    "lineNumber": 192,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "message",
        "description": "which should be posted"
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "additional",
        "description": "detail which needs to be posted."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2389,
    "kind": "method",
    "name": "disconnect",
    "memberof": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-messenger/src/scripts/Messenger.js~Messenger#disconnect",
    "access": "private",
    "description": "element should call this method when they are disconnected from DOM.\nIts the responsibility of the element to call this hook",
    "lineNumber": 219,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2391,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport ResizeObserver from 'resize-observer-polyfill/dist/ResizeObserver';\n\n// Used for unique IDs\nlet nextID = 0;\n\n// Remove namespace from global options\nconst cleanOption = (name) => {\n  name = name.replace('coral', '');\n  return name.charAt(0).toLowerCase() + name.slice(1);\n};\n\n// Threshold time in milliseconds that the setTimeout will wait for the transitionEnd event to be triggered.\nconst TRANSITION_DURATION_THRESHOLD = 100;\n\n// Based on jQuery's :focusable selector\nconst FOCUSABLE_ELEMENTS = [\n  'input:not([disabled])',\n  'select:not([disabled])',\n  'textarea:not([disabled])',\n  'button:not([disabled])',\n  'a[href]',\n  'area[href]',\n  'summary',\n  'iframe',\n  'object',\n  'embed',\n  'audio[controls]',\n  'video[controls]',\n  '[contenteditable]',\n  '[tabindex]'\n];\n\n// To support Coral.commons.ready and differentiate lightweight tags from defined elements\nconst CORAL_COMPONENTS = [];\n\n/**\n Converts CSS time to milliseconds. It supports both s and ms units. If the provided value has an unrecogenized unit,\n zero will be returned.\n\n @private\n @param {String} time\n The time string to convert to milliseconds.\n @returns {Number} the time in milliseconds.\n */\nfunction cssTimeToMilliseconds(time) {\n  const num = parseFloat(time, 10);\n  let unit = time.match(/m?s/);\n\n  if (unit) {\n    unit = unit[0];\n  }\n\n  if (unit === 's') {\n    return num * 1000;\n  } else if (unit === 'ms') {\n    return num;\n  }\n\n  // unrecognized unit, so we return 0\n  return 0;\n}\n\n/**\n @private\n\n @param first\n @param second\n @return {Function}\n */\nfunction returnFirst(first, second) {\n  // eslint-disable-next-line func-names\n  return function (...args) {\n    const ret = first.apply(this, args);\n    second.apply(this, args);\n    return ret;\n  };\n}\n\n/**\n Check if the provided object is a function\n\n @ignore\n\n @param {*} object\n The object to test\n\n @returns {Boolean} Whether the provided object is a function.\n */\nfunction isFunction(object) {\n  return typeof object === 'function';\n}\n\n/**\n Check if the provided regular expression matches the brand.\n @ignore\n @param {RegExp} re\n A regular expression to evaluate against the user agent string.\n \n @returns {Boolean} Whether user agent matches the regular expression.\n */\n function testUserAgent(re) {\n  if (typeof window === 'undefined' || window.navigator == null) {\n    return false;\n  }\n  return (\n    window.navigator['userAgentData'] &&\n    window.navigator['userAgentData'].brands.some(brand => re.test(brand.brand))\n  ) ||\n  re.test(window.navigator.userAgent);\n}\n\n/**\n Utility belt.\n */\nclass Commons {\n  /** @ignore */\n  constructor() {\n    // Create a Map to link elements to observe to their resize event callbacks\n    this._resizeObserverMap = new WeakMap();\n\n    this._resizeObserver = new ResizeObserver((entries) => {\n      for (let i = 0 ; i < entries.length ; i++) {\n        const observedElement = entries[i].target;\n        const allCallbacks = this._resizeObserverMap.get(observedElement);\n        if (allCallbacks) {\n          for (let j = 0 ; j < allCallbacks.length ; j++) {\n            allCallbacks[j].call(observedElement);\n          }\n        }\n      }\n    });\n\n    const focusableElements = FOCUSABLE_ELEMENTS.slice();\n    this._focusableElementsSelector = focusableElements.join(',');\n\n    focusableElements[focusableElements.length - 1] += ':not([tabindex=\"-1\"])';\n    this._tabbableElementsSelector = focusableElements.join(':not([tabindex=\"-1\"]),');\n\n    this._coralSelector = '';\n\n    // @IE11\n    if (!document.currentScript) {\n      const scripts = document.getElementsByTagName('script');\n      this._script = scripts[scripts.length - 1];\n    } else {\n      this._script = document.currentScript;\n    }\n  }\n\n  /**\n   Returns Coral global options retrieved on the <code><script></code> data attributes including:\n   - <code>[data-coral-icons]</code>: source folder of the SVG icons. If the icon collections have a custom name,\n   they have to be loaded manually using {@link Icon.load}.\n   - <code>[data-coral-icons-external]</code>: Whether SVG icons are always referenced as external resource. Possible values are \"on\" (default), \"off\" or \"js\" to load icons from a script.\n   - <code>[data-coral-typekit]</code>: custom typekit id used to load the fonts.\n   - <code>[data-coral-logging]</code>: defines logging level. Possible values are \"on\" (default) or \"off\".\n\n   @returns {Object}\n   The global options object.\n   */\n  get options() {\n    const options = {};\n    const props = this._script.dataset;\n    for (const key in props) {\n      // Detect Coral namespaced options\n      if (key.indexOf('coral') === 0) {\n        options[cleanOption(key)] = props[key];\n      }\n    }\n\n    return options;\n  }\n\n  /**\n   Utility function for logging.\n\n   @param {String} level\n   Logging level\n   @param {String} args\n   Logging message\n   */\n  _log(level, ...args) {\n    if (console[level] && this.options.logging !== 'off') {\n      console[level].apply(null, args);\n    }\n  }\n\n  /**\n   Copy the properties from all provided objects into the first object.\n\n   @param {Object} dest\n   The object to copy properties to\n   @param {...Object} source\n   An object to copy properties from. Additional objects can be passed as subsequent arguments.\n\n   @returns {Object}\n   The destination object, <code>dest</code>\n   */\n  extend(...args) {\n    const dest = args[0];\n    for (let i = 1, ni = args.length ; i < ni ; i++) {\n      const source = args[i];\n      for (const prop in source) {\n        dest[prop] = source[prop];\n      }\n    }\n    return dest;\n  }\n\n  /**\n   Copy the properties from the source object to the destination object, but calls the callback if the property is\n   already present on the destination object.\n\n   @param {Object} dest\n   The object to copy properties to\n   @param {...Object} source\n   An object to copy properties from. Additional objects can be passed as subsequent arguments.\n   @param {CommonsHandleCollision} [handleCollision]\n   Called if the property being copied is already present on the destination.\n   The return value will be used as the property value.\n\n   @returns {Object}\n   The destination object, <code>dest</code>\n   */\n  augment(...args) {\n    const dest = args[0];\n    let handleCollision;\n    let argCount = args.length;\n    const lastArg = args[argCount - 1];\n\n    if (typeof lastArg === 'function') {\n      handleCollision = lastArg;\n\n      // Don't attempt to augment using the last argument\n      argCount--;\n    }\n\n    for (let i = 1 ; i < argCount ; i++) {\n      const source = args[i];\n\n      for (const prop in source) {\n        if (typeof dest[prop] !== 'undefined') {\n          if (typeof handleCollision === 'function') {\n            // Call the handleCollision callback if the property is already present\n            const ret = handleCollision(dest[prop], source[prop], prop, dest, source);\n            if (typeof ret !== 'undefined') {\n              dest[prop] = ret;\n            }\n          }\n          // Otherwise, do nothing\n        } else {\n          dest[prop] = source[prop];\n        }\n      }\n    }\n\n    return dest;\n  }\n\n  /**\n   Return a new object with the swapped keys and values of the provided object.\n\n   @param {Object} obj\n   The object to copy.\n\n   @returns {Object}\n   An object with its keys as the values and values as the keys of the source object.\n   */\n  swapKeysAndValues(obj) {\n    const map = {};\n    for (const key in obj) {\n      map[obj[key]] = key;\n    }\n    return map;\n  }\n\n  /**\n   Execute the provided callback on the next animation frame.\n\n   @param {Function} onNextFrame\n   The callback to execute.\n   */\n  nextFrame(onNextFrame) {\n    return window.requestAnimationFrame(() => {\n      if (typeof onNextFrame === 'function') {\n        onNextFrame();\n      }\n    });\n  }\n\n  /**\n   Execute the provided callback once a CSS transition has ended. This method listens for the next transitionEnd event\n   on the given DOM element. In case the provided element does not have a transition defined, the callback will be\n   called in the next macrotask to allow a normal application execution flow. It cannot be used to listen continuously\n   on transitionEnd events.\n   @param {HTMLElement} element\n   The DOM element that is affected by the CSS transition.\n   @param {CommonsTransitionEndCallback} onTransitionEndCallback\n   The callback to execute.\n   */\n  transitionEnd(element, onTransitionEndCallback) {\n    let propertyName;\n    let hasTransitionEnded = false;\n    let transitionEndEventName = null;\n    const transitions = {\n      transition: 'transitionend',\n      WebkitTransition: 'webkitTransitionEnd',\n      MozTransition: 'transitionend',\n      MSTransition: 'msTransitionEnd'\n    };\n\n    let transitionEndTimeout = null;\n    const onTransitionEnd = (event) => {\n      const transitionStoppedByTimeout = typeof event === 'undefined';\n\n      if (!hasTransitionEnded) {\n        hasTransitionEnded = true;\n\n        clearTimeout(transitionEndTimeout);\n\n        // Remove event listener (if any was used by the current browser)\n        element.removeEventListener(transitionEndEventName, onTransitionEnd);\n\n        // Call callback with specified element\n        onTransitionEndCallback({\n          target: element,\n          cssTransitionSupported: true,\n          transitionStoppedByTimeout: transitionStoppedByTimeout\n        });\n      }\n    };\n\n    // Find transitionEnd event name used by browser\n    for (propertyName in transitions) {\n      if (element.style[propertyName] !== undefined) {\n        transitionEndEventName = transitions[propertyName];\n        break;\n      }\n    }\n\n    if (transitionEndEventName !== null) {\n      let timeoutDelay = 0;\n      // Gets the animation time (in milliseconds) using the computed style\n      const transitionDuration = cssTimeToMilliseconds(window.getComputedStyle(element).transitionDuration);\n\n      // We only setup the event listener if there is a valid transition\n      if (transitionDuration !== 0) {\n        // Register on transitionEnd event\n        element.addEventListener(transitionEndEventName, onTransitionEnd);\n\n        // As a fallback we use the transitionDuration plus a threshold. This can happen in IE10/11 where\n        // transitionEnd events are sometimes skipped\n        timeoutDelay = transitionDuration + TRANSITION_DURATION_THRESHOLD;\n      }\n\n      // Fallback in case the event does not trigger (IE10/11) or if the element does not have a valid transition\n      transitionEndTimeout = window.setTimeout(onTransitionEnd, timeoutDelay);\n    }\n  }\n\n  /**\n   Register a Coral component as Custom Element V1\n\n   @param {String} name\n   Custom element namespace\n   @param {Function} constructor\n   Constructor for the custom element\n   @param {Object} options\n   E.g for built-in custom elements\n   */\n  _define(name, constructor, options) {\n    window.customElements.define(name, constructor, options);\n    CORAL_COMPONENTS.push(name);\n  }\n\n  /**\n   Checks if Coral components and all nested Coral components are defined as Custom Elements.\n\n   @param {HTMLElement} element\n   The element that should be watched.\n   @param {CommonsReadyCallback} onDefined\n   The callback to call when all components are ready.\n\n   @see https://developer.mozilla.org/en-US/docs/Web/Web_Components/Custom_Elements\n   */\n  ready(element, onDefined) {\n    let root = element;\n\n    if (typeof element === 'function') {\n      onDefined = element;\n      root = document.body;\n    }\n\n    if (!root) {\n      root = document.body;\n    }\n\n    if (!(root instanceof HTMLElement)) {\n      // commons.ready should not be blocking by default\n      onDefined(root);\n      return;\n    }\n\n    // @todo use ':not(:defined)' once supported ?\n    this._coralSelector = this._coralSelector || CORAL_COMPONENTS.join(',');\n    const elements = root.querySelectorAll(this._coralSelector);\n\n    // Holds promises that resolve when the elements is defined\n    const promises = [];\n\n    // Don't forget to check root\n    if (root !== document.body && !root._componentReady && root.matches(this._coralSelector)) {\n      const name = (root.getAttribute('is') || root.tagName).toLowerCase();\n      promises.push(window.customElements.whenDefined(name));\n    }\n\n    // Check all descending elements\n    for (let i = 0 ; i < elements.length ; i++) {\n      const el = elements[i];\n      if (!el._componentReady) {\n        const name = (el.getAttribute('is') || el.tagName).toLowerCase();\n        promises.push(window.customElements.whenDefined(name));\n      }\n    }\n\n    // Call callback once all defined\n    if (promises.length) {\n      Promise.all(promises)\n        .then(() => {\n          onDefined(element instanceof HTMLElement && element || window);\n        })\n        .catch((err) => {\n          console.error(err);\n        });\n    } else {\n      // Call callback by default if all defined already\n      onDefined(element instanceof HTMLElement && element || window);\n    }\n  }\n\n  /**\n   Assign an object given a nested path\n\n   @param {Object} root\n   The root object on which the path should be traversed.\n   @param {String} path\n   The path at which the object should be assignment.\n   @param {String} obj\n   The object to assign at path.\n\n   @throws Will throw an error if the path is not present on the object.\n   */\n  setSubProperty(root, path, obj) {\n    const nsParts = path.split('.');\n    let curObj = root;\n\n    if (nsParts.length === 1) {\n      // Assign immediately\n      curObj[path] = obj;\n      return;\n    }\n\n    // Make sure we can assign at the requested location\n    while (nsParts.length > 1) {\n      const part = nsParts.shift();\n      if (curObj[part]) {\n        curObj = curObj[part];\n      } else {\n        throw new Error(`Coral.commons.setSubProperty: could not set ${path}, part ${part} not found`);\n      }\n    }\n\n    // Do the actual assignment\n    curObj[nsParts.shift()] = obj;\n  }\n\n  /**\n   Get the value of the property at the given nested path.\n\n   @param {Object} root\n   The root object on which the path should be traversed.\n   @param {String} path\n   The path of the sub-property to return.\n\n   @returns {*}\n   The value of the provided property.\n\n   @throws Will throw an error if the path is not present on the object.\n   */\n  getSubProperty(root, path) {\n    const nsParts = path.split('.');\n    let curObj = root;\n\n    if (nsParts.length === 1) {\n      // Return property immediately\n      return curObj[path];\n    }\n\n    // Make sure we can assign at the requested location\n    while (nsParts.length) {\n      const part = nsParts.shift();\n      // The property might be undefined, and that's OK if it's the last part\n      if (nsParts.length === 0 || typeof curObj[part] !== 'undefined') {\n        curObj = curObj[part];\n      } else {\n        throw new Error(`Coral.commons.getSubProperty: could not get ${path}, part ${part} not found`);\n      }\n    }\n\n    return curObj;\n  }\n\n  /**\n   Apply a mixin to the given object.\n\n   @param {Object} target\n   The object to apply the mixin to.\n   @param {Object|Function} mixin\n   The mixin to apply.\n   @param {Object} options\n   An object to pass to functional mixins.\n   */\n  _applyMixin(target, mixin, options) {\n    const mixinType = typeof mixin;\n\n    if (mixinType === 'function') {\n      mixin(target, options);\n    } else if (mixinType === 'object' && mixin !== null) {\n      this.extend(target, mixin);\n    } else {\n      throw new Error(`Coral.commons.mixin: Cannot mix in ${mixinType} to ${target.toString()}`);\n    }\n  }\n\n  /**\n   Mix a set of mixins to a target object.\n\n   @private\n\n   @param {Object} target\n   The target prototype or instance on which to apply mixins.\n   @param {Object|CoralMixin|Array<Object|CoralMixin>} mixins\n   A mixin or set of mixins to apply.\n   @param {Object} options\n   An object that will be passed to functional mixins as the second argument (options).\n   */\n  mixin(target, mixins, options) {\n    if (Array.isArray(mixins)) {\n      for (let i = 0 ; i < mixins.length ; i++) {\n        this._applyMixin(target, mixins[i], options);\n      }\n    } else {\n      this._applyMixin(target, mixins, options);\n    }\n  }\n\n  /**\n   Get a unique ID.\n\n   @returns {String} unique identifier.\n   */\n  getUID() {\n    return `coral-id-${nextID++}`;\n  }\n\n  /**\n   Call all of the provided functions, in order, returning the return value of the specified function.\n\n   @param {...Function} func\n   A function to call\n   @param {Number} [nth=0]\n   A zero-based index indicating the noth argument to return the value of.\n   If the nth argument is not a function, <code>null</code> will be returned.\n\n   @returns {Function} The aggregate function.\n   */\n  callAll(...args) {\n    let nth = args[args.length - 1];\n    if (typeof nth !== 'number') {\n      nth = 0;\n    }\n\n    // Get the function whose value we should return\n    let funcToReturn = args[nth];\n\n    // Only use arguments that are functions\n    const functions = Array.prototype.filter.call(args, isFunction);\n\n    if (functions.length === 2 && nth === 0) {\n      // Most common usecase: two valid functions passed\n      return returnFirst(functions[0], functions[1]);\n    } else if (functions.length === 1) {\n      // Common usecase: one valid function passed\n      return functions[0];\n    } else if (functions.length === 0) {\n      return () => {\n        // Fail case: no valid functions passed\n      };\n    }\n\n    if (typeof funcToReturn !== 'function') {\n      // If the argument at the provided index wasn't a function, just return the value of the first valid function\n      funcToReturn = functions[0];\n    }\n\n    // eslint-disable-next-line func-names\n    return function () {\n      let finalRet;\n      let ret;\n      let func;\n\n      // Skip first arg\n      for (let i = 0 ; i < functions.length ; i++) {\n        func = functions[i];\n        ret = func.apply(this, args);\n\n        // Store return value of desired function\n        if (func === funcToReturn) {\n          finalRet = ret;\n        }\n      }\n      return finalRet;\n    };\n  }\n\n  /**\n   Adds a resize listener to the given element.\n\n   @param {HTMLElement} element\n   The element to add the resize event to.\n   @param {Function} onResize\n   The resize callback.\n   */\n  // eslint-disable-next-line func-names\n  addResizeListener(element, onResize) {\n    // Map callback to element\n    if (!this._resizeObserverMap.has(element)) {\n      this._resizeObserverMap.set(element, []);\n    }\n    this._resizeObserverMap.get(element).push(onResize);\n\n    // Observe element resize events\n    this._resizeObserver.observe(element);\n  }\n\n  /**\n   Removes a resize listener from the given element.\n\n   @param {HTMLElement} element\n   The element to remove the resize event from.\n   @param {Function} onResize\n   The resize callback.\n   */\n  // eslint-disable-next-line func-names\n  removeResizeListener(element, onResize) {\n    // Stop observing element resize events\n    this._resizeObserver.unobserve(element);\n    this._resizeObserver.disconnect(element);\n\n    // Remove event from map\n    const onResizeEvents = this._resizeObserverMap.get(element);\n    if (onResizeEvents) {\n      const index = onResizeEvents.indexOf(onResize);\n      if (index !== -1) {\n        onResizeEvents.splice(index, 1);\n      }\n    }\n  }\n\n  /**\n   Caution: the selector doesn't verify if elements are visible.\n\n   @type {String}\n   @readonly\n   @see https://www.w3.org/TR/html5/editing.html#focus-management\n   */\n  get FOCUSABLE_ELEMENT_SELECTOR() {\n    return this._focusableElementsSelector;\n  }\n\n  /**\n   Caution: the selector doesn't verify if elements are visible.\n\n   @type {String}\n   @readonly\n   @see https://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute\n   */\n  get TABBABLE_ELEMENT_SELECTOR() {\n    return this._tabbableElementsSelector;\n  }\n\n  isAndroid() {\n    return testUserAgent(/Android/i);\n  }\n}\n\n/**\n Called when a property already exists on the destination object.\n\n @typedef {function} CommonsHandleCollision\n\n @param {*} oldValue\n The value currently present on the destination object.\n @param {*} newValue\n The value on the destination object.\n @param {*} prop\n The property that collided.\n @param {*} dest\n The destination object.\n @param {*} source\n The source object.\n\n @returns {*} The value to use. If <code>undefined</code>, the old value will be used.\n */\n\n/**\n Execute the callback once a CSS transition has ended.\n\n @typedef {function} CommonsTransitionEndCallback\n\n @param event\n The event passed to the callback.\n @param {HTMLElement} event.target\n The DOM element that was affected by the CSS transition.\n @param {Boolean} event.cssTransitionSupported\n Whether CSS transitions are supported by the browser.\n @param {Boolean} event.transitionStoppedByTimeout\n Whether the CSS transition has been ended by a timeout (should only happen as a fallback).\n */\n\n/**\n Execute the callback once a component and sub-components are ready. See {@link Commons.ready}.\n\n @typedef {function} CommonsReadyCallback\n @param {HTMLElement} element\n The element that is ready.\n */\n\n/**\n A functional mixin.\n\n @typedef {Object} CoralMixin\n\n @private\n\n @param {Object} target\n The target prototype or instance to apply the mixin to.\n @param {Object} options\n Options for this mixin.\n @param {Coral~PropertyDescriptor.properties} options.properties\n The properties object as passed to <code>Coral.register</code>. This can be modified in place.\n */\n\n/**\n A utility belt.\n\n @type {Commons}\n */\nconst commons = new Commons();\n\nexport default commons;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Commons.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2392,
    "kind": "variable",
    "name": "nextID",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~nextID",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2393,
    "kind": "function",
    "name": "cleanOption",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~cleanOption",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 19,
    "undocument": true,
    "params": [
      {
        "name": "name",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2394,
    "kind": "variable",
    "name": "TRANSITION_DURATION_THRESHOLD",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~TRANSITION_DURATION_THRESHOLD",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "type": {
      "types": [
        "number"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2395,
    "kind": "variable",
    "name": "FOCUSABLE_ELEMENTS",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~FOCUSABLE_ELEMENTS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 28,
    "undocument": true,
    "type": {
      "types": [
        "string[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2396,
    "kind": "variable",
    "name": "CORAL_COMPONENTS",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~CORAL_COMPONENTS",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 46,
    "undocument": true,
    "type": {
      "types": [
        "*[]"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2397,
    "kind": "function",
    "name": "cssTimeToMilliseconds",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~cssTimeToMilliseconds",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Converts CSS time to milliseconds. It supports both s and ms units. If the provided value has an unrecogenized unit,\nzero will be returned.",
    "lineNumber": 57,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Number} the time in milliseconds."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "time",
        "description": "The time string to convert to milliseconds."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": "the time in milliseconds."
    },
    "ignore": true
  },
  {
    "__docId__": 2398,
    "kind": "function",
    "name": "returnFirst",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~returnFirst",
    "access": "private",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "",
    "lineNumber": 82,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "first",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "second",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Function"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 2399,
    "kind": "function",
    "name": "isFunction",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~isFunction",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Check if the provided object is a function",
    "lineNumber": 101,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} Whether the provided object is a function."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "object",
        "description": "The object to test"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "Whether the provided object is a function."
    }
  },
  {
    "__docId__": 2400,
    "kind": "function",
    "name": "testUserAgent",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~testUserAgent",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Check if the provided regular expression matches the brand.",
    "lineNumber": 113,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} Whether user agent matches the regular expression."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "RegExp"
        ],
        "spread": false,
        "optional": false,
        "name": "re",
        "description": "A regular expression to evaluate against the user agent string."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "Whether user agent matches the regular expression."
    }
  },
  {
    "__docId__": 2401,
    "kind": "class",
    "name": "Commons",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Utility belt.",
    "lineNumber": 127,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2402,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 129,
    "ignore": true
  },
  {
    "__docId__": 2403,
    "kind": "member",
    "name": "_resizeObserverMap",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_resizeObserverMap",
    "access": "private",
    "description": null,
    "lineNumber": 131,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2404,
    "kind": "member",
    "name": "_resizeObserver",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_resizeObserver",
    "access": "private",
    "description": null,
    "lineNumber": 133,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2405,
    "kind": "member",
    "name": "_focusableElementsSelector",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_focusableElementsSelector",
    "access": "private",
    "description": null,
    "lineNumber": 146,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2406,
    "kind": "member",
    "name": "_tabbableElementsSelector",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_tabbableElementsSelector",
    "access": "private",
    "description": null,
    "lineNumber": 149,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2407,
    "kind": "member",
    "name": "_coralSelector",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_coralSelector",
    "access": "private",
    "description": null,
    "lineNumber": 151,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 2408,
    "kind": "member",
    "name": "_script",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_script",
    "access": "private",
    "description": null,
    "lineNumber": 156,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2410,
    "kind": "member",
    "name": "options",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#options",
    "access": "public",
    "description": "Returns Coral global options retrieved on the <code><script></code> data attributes including:\n- <code>[data-coral-icons]</code>: source folder of the SVG icons. If the icon collections have a custom name,\nthey have to be loaded manually using {@link Icon.load}.\n- <code>[data-coral-icons-external]</code>: Whether SVG icons are always referenced as external resource. Possible values are \"on\" (default), \"off\" or \"js\" to load icons from a script.\n- <code>[data-coral-typekit]</code>: custom typekit id used to load the fonts.\n- <code>[data-coral-logging]</code>: defines logging level. Possible values are \"on\" (default) or \"off\".",
    "lineNumber": 173,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object}\nThe global options object."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "The global options object."
    },
    "modality": "readonly",
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2411,
    "kind": "method",
    "name": "_log",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_log",
    "access": "private",
    "description": "Utility function for logging.",
    "lineNumber": 194,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "level",
        "description": "Logging level"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "args",
        "description": "Logging message"
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2412,
    "kind": "method",
    "name": "extend",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#extend",
    "access": "public",
    "description": "Copy the properties from all provided objects into the first object.",
    "lineNumber": 211,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object}\nThe destination object, <code>dest</code>"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "dest",
        "description": "The object to copy properties to"
      },
      {
        "nullable": null,
        "types": [
          "...Object"
        ],
        "spread": true,
        "optional": false,
        "name": "source",
        "description": "An object to copy properties from. Additional objects can be passed as subsequent arguments."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "The destination object, <code>dest</code>"
    }
  },
  {
    "__docId__": 2413,
    "kind": "method",
    "name": "augment",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#augment",
    "access": "public",
    "description": "Copy the properties from the source object to the destination object, but calls the callback if the property is\nalready present on the destination object.",
    "lineNumber": 237,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object}\nThe destination object, <code>dest</code>"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "dest",
        "description": "The object to copy properties to"
      },
      {
        "nullable": null,
        "types": [
          "...Object"
        ],
        "spread": true,
        "optional": false,
        "name": "source",
        "description": "An object to copy properties from. Additional objects can be passed as subsequent arguments."
      },
      {
        "nullable": null,
        "types": [
          "CommonsHandleCollision"
        ],
        "spread": false,
        "optional": true,
        "name": "handleCollision",
        "description": "Called if the property being copied is already present on the destination.\nThe return value will be used as the property value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "The destination object, <code>dest</code>"
    }
  },
  {
    "__docId__": 2414,
    "kind": "method",
    "name": "swapKeysAndValues",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#swapKeysAndValues",
    "access": "public",
    "description": "Return a new object with the swapped keys and values of the provided object.",
    "lineNumber": 281,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object}\nAn object with its keys as the values and values as the keys of the source object."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "obj",
        "description": "The object to copy."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "An object with its keys as the values and values as the keys of the source object."
    }
  },
  {
    "__docId__": 2415,
    "kind": "method",
    "name": "nextFrame",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#nextFrame",
    "access": "public",
    "description": "Execute the provided callback on the next animation frame.",
    "lineNumber": 295,
    "params": [
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "onNextFrame",
        "description": "The callback to execute."
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2416,
    "kind": "method",
    "name": "transitionEnd",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#transitionEnd",
    "access": "public",
    "description": "Execute the provided callback once a CSS transition has ended. This method listens for the next transitionEnd event\non the given DOM element. In case the provided element does not have a transition defined, the callback will be\ncalled in the next macrotask to allow a normal application execution flow. It cannot be used to listen continuously\non transitionEnd events.",
    "lineNumber": 313,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The DOM element that is affected by the CSS transition."
      },
      {
        "nullable": null,
        "types": [
          "CommonsTransitionEndCallback"
        ],
        "spread": false,
        "optional": false,
        "name": "onTransitionEndCallback",
        "description": "The callback to execute."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2417,
    "kind": "method",
    "name": "_define",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_define",
    "access": "private",
    "description": "Register a Coral component as Custom Element V1",
    "lineNumber": 383,
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "name",
        "description": "Custom element namespace"
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "constructor",
        "description": "Constructor for the custom element"
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "options",
        "description": "E.g for built-in custom elements"
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2418,
    "kind": "method",
    "name": "ready",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#ready",
    "access": "public",
    "description": "Checks if Coral components and all nested Coral components are defined as Custom Elements.",
    "see": [
      "https://developer.mozilla.org/en-US/docs/Web/Web_Components/Custom_Elements"
    ],
    "lineNumber": 398,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The element that should be watched."
      },
      {
        "nullable": null,
        "types": [
          "CommonsReadyCallback"
        ],
        "spread": false,
        "optional": false,
        "name": "onDefined",
        "description": "The callback to call when all components are ready."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2420,
    "kind": "method",
    "name": "setSubProperty",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#setSubProperty",
    "access": "public",
    "description": "Assign an object given a nested path",
    "lineNumber": 465,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "root",
        "description": "The root object on which the path should be traversed."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "path",
        "description": "The path at which the object should be assignment."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "obj",
        "description": "The object to assign at path."
      }
    ],
    "throws": [
      {
        "types": [
          "*"
        ],
        "description": "Will throw an error if the path is not present on the object."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2421,
    "kind": "method",
    "name": "getSubProperty",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#getSubProperty",
    "access": "public",
    "description": "Get the value of the property at the given nested path.",
    "lineNumber": 502,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{*}\nThe value of the provided property."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "root",
        "description": "The root object on which the path should be traversed."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "path",
        "description": "The path of the sub-property to return."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*"
      ],
      "spread": false,
      "description": "The value of the provided property."
    },
    "throws": [
      {
        "types": [
          "*"
        ],
        "description": "Will throw an error if the path is not present on the object."
      }
    ]
  },
  {
    "__docId__": 2422,
    "kind": "method",
    "name": "_applyMixin",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#_applyMixin",
    "access": "private",
    "description": "Apply a mixin to the given object.",
    "lineNumber": 535,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "target",
        "description": "The object to apply the mixin to."
      },
      {
        "nullable": null,
        "types": [
          "Object",
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "mixin",
        "description": "The mixin to apply."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "options",
        "description": "An object to pass to functional mixins."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2423,
    "kind": "method",
    "name": "mixin",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#mixin",
    "access": "private",
    "description": "Mix a set of mixins to a target object.",
    "lineNumber": 559,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "target",
        "description": "The target prototype or instance on which to apply mixins."
      },
      {
        "nullable": null,
        "types": [
          "Object|CoralMixin|Array<Object|CoralMixin>"
        ],
        "spread": false,
        "optional": false,
        "name": "mixins",
        "description": "A mixin or set of mixins to apply."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "options",
        "description": "An object that will be passed to functional mixins as the second argument (options)."
      }
    ],
    "ignore": true,
    "return": null
  },
  {
    "__docId__": 2424,
    "kind": "method",
    "name": "getUID",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#getUID",
    "access": "public",
    "description": "Get a unique ID.",
    "lineNumber": 574,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} unique identifier."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "unique identifier."
    },
    "params": []
  },
  {
    "__docId__": 2425,
    "kind": "method",
    "name": "callAll",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#callAll",
    "access": "public",
    "description": "Call all of the provided functions, in order, returning the return value of the specified function.",
    "lineNumber": 589,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Function} The aggregate function."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "...Function"
        ],
        "spread": true,
        "optional": false,
        "name": "func",
        "description": "A function to call"
      },
      {
        "nullable": null,
        "types": [
          "Number"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "0",
        "defaultRaw": 0,
        "name": "nth",
        "description": "A zero-based index indicating the noth argument to return the value of.\nIf the nth argument is not a function, <code>null</code> will be returned."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Function"
      ],
      "spread": false,
      "description": "The aggregate function."
    }
  },
  {
    "__docId__": 2426,
    "kind": "method",
    "name": "addResizeListener",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#addResizeListener",
    "access": "public",
    "description": "Adds a resize listener to the given element.",
    "lineNumber": 647,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The element to add the resize event to."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "onResize",
        "description": "The resize callback."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2427,
    "kind": "method",
    "name": "removeResizeListener",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#removeResizeListener",
    "access": "public",
    "description": "Removes a resize listener from the given element.",
    "lineNumber": 667,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "element",
        "description": "The element to remove the resize event from."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "onResize",
        "description": "The resize callback."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2428,
    "kind": "member",
    "name": "FOCUSABLE_ELEMENT_SELECTOR",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#FOCUSABLE_ELEMENT_SELECTOR",
    "access": "public",
    "description": "Caution: the selector doesn't verify if elements are visible.\n<ul><li><code>read-only</code></li></ul>",
    "see": [
      "https://www.w3.org/TR/html5/editing.html#focus-management"
    ],
    "lineNumber": 689,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2429,
    "kind": "member",
    "name": "TABBABLE_ELEMENT_SELECTOR",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#TABBABLE_ELEMENT_SELECTOR",
    "access": "public",
    "description": "Caution: the selector doesn't verify if elements are visible.\n<ul><li><code>read-only</code></li></ul>",
    "see": [
      "https://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute"
    ],
    "lineNumber": 700,
    "unknown": [
      {
        "tagName": "@readonly",
        "tagValue": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2430,
    "kind": "method",
    "name": "isAndroid",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons#isAndroid",
    "access": "public",
    "description": null,
    "lineNumber": 704,
    "undocument": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2431,
    "kind": "variable",
    "name": "commons",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Commons.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Commons.js~commons",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{commons}",
    "description": null,
    "lineNumber": 773,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-utils/src/scripts/Commons.js~Commons"
      ]
    }
  },
  {
    "__docId__": 2432,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Events.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport commons from './Commons';\nimport Vent from '@adobe/vent';\n\n/**\n Events helper.\n */\nclass Events {\n  /**\n   @param {HTMLElement|String} elementOrSelector\n   The element or selector indicating the element to use as the delegation root.\n   */\n  constructor(elementOrSelector) {\n    this._vent = new Vent(elementOrSelector);\n  }\n\n  /**\n   Add an event listener.\n\n   @param {String} eventName\n   The event name to listen for, including optional namespace(s).\n   @param {String} [selector]\n   The selector to use for event delegation.\n   @param {Function} handler\n   The function that will be called when the event is fired.\n   @param {Boolean} [useCapture]\n   Whether or not to listen during the capturing or bubbling phase.\n   @returns {Events} this, chainable.\n   */\n  on(eventName, selector, handler, useCapture) {\n    this._vent.on(eventName, selector, handler, useCapture);\n    return this;\n  }\n\n  /**\n   Remove an event listener.\n\n   @param {String} [eventName]\n   The event name to stop listening for, including optional namespace(s).\n   @param {String} [selector]\n   The selector that was used for event delegation.\n   @param {Function} [handler]\n   The function that was passed to <code>on()</code>.\n   @param {Boolean} [useCapture]\n   Only remove listeners with <code>useCapture</code> set to the value passed in.\n   @returns {Event} this, chainable.\n   */\n  off(eventName, selector, handler, useCapture) {\n    this._vent.off(eventName, selector, handler, useCapture);\n    return this;\n  }\n\n  /**\n   Dispatch a custom event at the root element.\n\n   @param {String} eventName\n   The name of the event to dispatch.\n   @param {Object} [options]\n   CustomEvent options.\n   @param {Object} [options.bubbles=true]\n   Whether the event should bubble.\n   @param {Object} [options.cancelable=true]\n   Whether the event should be cancelable.\n   @param {Object} [options.detail]\n   Data to pass to handlers as <code>event.detail</code>\n   @returns {CustomEvent} dispatched event.\n   */\n  dispatch(eventName, options) {\n    return this._vent.dispatch(eventName, options);\n  }\n\n  /**\n   Destroy this instance, removing all events and references.\n   */\n  destroy() {\n    this._vent.destroy();\n  }\n\n  /**\n   * @ignore\n   * @param {MouseEvent | TouchEvent} event\n   * @returns {boolean}\n   * Keyboards, Assistive Technologies, and element.click() all produce a \"virtual\"\n   * click event. This is a method of inferring such clicks. Every browser except\n   * IE 11 only sets a zero value of \"detail\" for click events that are \"virtual\".\n   * However, IE 11 uses a zero value for all click events. For IE 11 we rely on\n   * the quirk that it produces click events that are of type PointerEvent, and\n   * where only the \"virtual\" click lacks a pointerType field.\n   *\n   * Original licensing for the following method can be found in the\n   * NOTICE file in the root directory of this source tree.\n   * See https://github.com/facebook/react/blob/3c713d513195a53788b3f8bb4b70279d68b15bcc/packages/react-interactions/events/src/dom/shared/index.js#L74-L87\n   */\n  isVirtualEvent(event) {\n    // JAWS/NVDA with Firefox.\n    if (event.mozInputSource === 0 && event.isTrusted) {\n      return true;\n    }\n\n    // Android TalkBack's detail value varies depending on the event listener providing the event so we have specific logic here instead\n    // If pointerType is defined, event is from a click listener. For events from mousedown listener, detail === 0 is a sufficient check\n    // to detect TalkBack virtual clicks.\n    if (commons.isAndroid() && event.pointerType) {\n      return event.type === 'click' && event.buttons === 1;\n    }\n\n    return event.detail === 0 && !event.pointerType;\n  }\n}\n\n/**\n An enhanced event helper.\n\n @type {Events}\n */\nconst events = new Events(window);\n\nexport default events;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Events.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2433,
    "kind": "class",
    "name": "Events",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Events helper.",
    "lineNumber": 19,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2434,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#constructor",
    "access": "public",
    "description": "",
    "lineNumber": 24,
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement",
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "elementOrSelector",
        "description": "The element or selector indicating the element to use as the delegation root."
      }
    ]
  },
  {
    "__docId__": 2435,
    "kind": "member",
    "name": "_vent",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#_vent",
    "access": "private",
    "description": null,
    "lineNumber": 25,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2436,
    "kind": "method",
    "name": "on",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#on",
    "access": "public",
    "description": "Add an event listener.",
    "lineNumber": 41,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Events} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventName",
        "description": "The event name to listen for, including optional namespace(s)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "The selector to use for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "handler",
        "description": "The function that will be called when the event is fired."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "name": "useCapture",
        "description": "Whether or not to listen during the capturing or bubbling phase."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Events"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2437,
    "kind": "method",
    "name": "off",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#off",
    "access": "public",
    "description": "Remove an event listener.",
    "lineNumber": 59,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Event} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "eventName",
        "description": "The event name to stop listening for, including optional namespace(s)."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "The selector that was used for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": true,
        "name": "handler",
        "description": "The function that was passed to <code>on()</code>."
      },
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": true,
        "name": "useCapture",
        "description": "Only remove listeners with <code>useCapture</code> set to the value passed in."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Event"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2438,
    "kind": "method",
    "name": "dispatch",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#dispatch",
    "access": "public",
    "description": "Dispatch a custom event at the root element.",
    "lineNumber": 79,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{CustomEvent} dispatched event."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventName",
        "description": "The name of the event to dispatch."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "name": "options",
        "description": "CustomEvent options."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "true",
        "defaultRaw": true,
        "name": "options.bubbles",
        "description": "Whether the event should bubble."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "true",
        "defaultRaw": true,
        "name": "options.cancelable",
        "description": "Whether the event should be cancelable."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "name": "options.detail",
        "description": "Data to pass to handlers as <code>event.detail</code>"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "CustomEvent"
      ],
      "spread": false,
      "description": "dispatched event."
    }
  },
  {
    "__docId__": 2439,
    "kind": "method",
    "name": "destroy",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#destroy",
    "access": "public",
    "description": "Destroy this instance, removing all events and references.",
    "lineNumber": 86,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2440,
    "kind": "method",
    "name": "isVirtualEvent",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js~Events",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~Events#isVirtualEvent",
    "access": "public",
    "description": "",
    "lineNumber": 105,
    "ignore": true,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{boolean}\nKeyboards, Assistive Technologies, and element.click() all produce a \"virtual\"\nclick event. This is a method of inferring such clicks. Every browser except\nIE 11 only sets a zero value of \"detail\" for click events that are \"virtual\".\nHowever, IE 11 uses a zero value for all click events. For IE 11 we rely on\nthe quirk that it produces click events that are of type PointerEvent, and\nwhere only the \"virtual\" click lacks a pointerType field.\n\nOriginal licensing for the following method can be found in the\nNOTICE file in the root directory of this source tree.\nSee https://github.com/facebook/react/blob/3c713d513195a53788b3f8bb4b70279d68b15bcc/packages/react-interactions/events/src/dom/shared/index.js#L74-L87"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "MouseEvent ",
          " TouchEvent"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "boolean"
      ],
      "spread": false,
      "description": "Keyboards, Assistive Technologies, and element.click() all produce a \"virtual\"\nclick event. This is a method of inferring such clicks. Every browser except\nIE 11 only sets a zero value of \"detail\" for click events that are \"virtual\".\nHowever, IE 11 uses a zero value for all click events. For IE 11 we rely on\nthe quirk that it produces click events that are of type PointerEvent, and\nwhere only the \"virtual\" click lacks a pointerType field.\n\nOriginal licensing for the following method can be found in the\nNOTICE file in the root directory of this source tree.\nSee https://github.com/facebook/react/blob/3c713d513195a53788b3f8bb4b70279d68b15bcc/packages/react-interactions/events/src/dom/shared/index.js#L74-L87"
    }
  },
  {
    "__docId__": 2441,
    "kind": "variable",
    "name": "events",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Events.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Events.js~events",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{events}",
    "description": null,
    "lineNumber": 129,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-utils/src/scripts/Events.js~Events"
      ]
    }
  },
  {
    "__docId__": 2442,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Enumeration for {@link i18n} locales.\n\n @typedef {Object} I18nLocalesEnum\n\n @property {String} en\n English (U.S.)\n @property {String} en-us\n English (U.S.)\n @property {String} cs\n Czech (Czechia)\n @property {String} cs-cz\n Czech (Czechia)\n @property {String} da\n Danish (Denmark)\n @property {String} da-dk\n Danish (Denmark)\n @property {String} de\n German (Germany)\n @property {String} de-de\n German (Germany)\n @property {String} es\n Spanish (Spain)\n @property {String} es-es\n Spanish (Spain)\n @property {String} fi\n Finnish (Finland)\n @property {String} fi-fi\n Finnish (Finland)\n @property {String} fr\n French (France)\n @property {String} fr-fr\n French (France)\n @property {String} it\n Italian (Italy)\n @property {String} it-it\n Italian (Italy)\n @property {String} ja\n Japanese (Japan)\n @property {String} ja-jp\n Japanese (Japan)\n @property {String} ko\n Korean (Korea)\n @property {String} ko-kr\n Korean (Korea)\n @property {String} nb\n Norwegian Bokmål (Norway)\n @property {String} nb-no\n Norwegian Bokmål (Norway)\n @property {String} nl\n Dutch (Netherlands)\n @property {String} nl-nl\n Dutch (Netherlands)\n @property {String} pl\n Polish (Poland)\n @property {String} pl-pl\n Polish (Poland)\n @property {String} pt\n Portuguese (Brazil)\n @property {String} pt-br\n Portuguese (Brazil)\n @property {String} ru\n Russian (Russia)\n @property {String} ru-ru\n Russian (Russia)\n @property {String} sv\n Swedish (Sweden)\n @property {String} sv-se\n Swedish (Sweden)\n @property {String} tr\n Turkish (Turkey)\n @property {String} tr-tr\n Turkish (Turkey)\n @property {String} zh-cn\n Simplified Chinese\n @property {String} zh-hans-cn\n Simplified Chinese\n @property {String} zh-hans\n Simplified Chinese\n @property {String} zh-tw\n Traditional Chinese\n @property {String} zh-hant-tw\n Traditional Chinese\n @property {String} zh-hant\n Traditional Chinese\n */\nconst locales = {\n  'en': 'en-US',\n  'en-us': 'en-US',\n  'cs': 'cs-CZ',\n  'cs-cz': 'cs-CZ',\n  'da': 'da-DK',\n  'da-dk': 'da-DK',\n  'de': 'de-DE',\n  'de-de': 'de-DE',\n  'es': 'es-ES',\n  'es-es': 'es-ES',\n  'fi': 'fi-FI',\n  'fi-fi': 'fi-FI',\n  'fr': 'fr-FR',\n  'fr-fr': 'fr-FR',\n  'it': 'it-IT',\n  'it-it': 'it-IT',\n  'ja': 'ja-JP',\n  'ja-jp': 'ja-JP',\n  'ko': 'ko-KR',\n  'ko-kr': 'ko-KR',\n  'nb': 'nb-NO',\n  'nb-no': 'nb-NO',\n  'nl': 'nl-NL',\n  'pl': 'pl-PL',\n  'pl-pl': 'pl-PL',\n  'nl-nl': 'nl-NL',\n  'pt': 'pt-BR',\n  'pt-br': 'pt-BR',\n  'ru': 'ru-RU',\n  'ru-ru': 'ru-RU',\n  'sv': 'sv-SE',\n  'sv-se': 'sv-SE',\n  'tr': 'tr-TR',\n  'tr-tr': 'tr-TR',\n  'zh-cn': 'zh-CN',\n  'zh-hans-cn': 'zh-CN',\n  'zh-hans': 'zh-CN',\n  'zh-tw': 'zh-TW',\n  'zh-hant-tw': 'zh-TW',\n  'zh-hant': 'zh-TW'\n};\n\n/**\n Used to store i18n strings.\n\n @type {Object}\n @property {String} strings.generic\n */\nconst strings = {\n  generic: {}\n};\n\n/**\n I18n service to get/set localized strings.\n */\nclass I18nProvider {\n  /**\n   @param {Object} [options]\n   Options for this combo handler.\n   @param {String} [options.locale]\n   The <code>locale</code> property defines the locale of the I18nProvider.\n   */\n  constructor(options) {\n    options = options || {};\n\n    // Default locale\n    this._locale = 'en-US';\n\n    if (options.locale) {\n      this._locale = options.locale;\n    }\n\n    this._evaluate = /(\\{.+?\\})/g;\n  }\n\n  /**\n   Sets a localized string.\n\n   @param {String} key the key to set\n   @param {String} value the value associated with the given key.\n   @example\n   Coral.i18n.set('English string', 'Translated string');\n   Coral.i18n.set('English string: {0}', 'Translated string: {0}');\n   Coral.i18n.set('English string: {0}, {1}, and {2}', 'Translated string: {2}, {0}, and {1}');\n   Coral.i18n.set('English string: {name}', 'Translated string: {name}');\n   Coral.i18n.set('English string: {name1}, {name2}, and {name3}', 'Translated string: {name3}, {name1}, and {name2}');\n   */\n\n  /**\n   Sets multiple localized strings.\n\n   @param {Array<String, String>} map  a key-value map to add to the strings dictionary.\n   @example\n   Coral.i18n.set([\n   ['English string 1', 'Translated string 1'],\n   ['English string 2', 'Translated string 2'],\n   ['English string 1 with {0} items','Translated string 1 with {0} items'],\n   ['English string 2 with {0} items','Translated string 2 with {0} items'],\n   ['English string 1: {0}, {1}, and {2}','Translated string 1: {2}, {0}, and {1}'],\n   ['English string 2: {0}, {1}, and {2}','Translated string 2: {2}, {0}, and {1}'],\n   ['English string 1: {name}', 'Translated string 1: {name}'],\n   ['English string 2: {name}', 'Translated string 2: {name}'],\n   ['English string 1: {name1}, {name2}, and {name3}', 'Translated string 1: {name3}, {name1}, and {name2}'],\n   ['English string 2: {name1}, {name2}, and {name3}', 'Translated string 2: {name3}, {name1}, and {name2}']\n   ]);\n   */\n\n  /**\n   Sets a localized string, using translation hint.\n\n   @param {String} key the key to set\n   @param {String} value the value associated with the given key.\n   @param {String} translation_hint the translation hint associated with the given key.\n   @example\n   Coral.i18n.set('English string', 'Translated string 1', 'Translation hint 1');\n   Coral.i18n.set('English string', 'Translated string 2', 'Translation hint 2');\n   Coral.i18n.set('English string with {0} items' , 'Translated string 1 with {0} items', 'Translation hint 1');\n   Coral.i18n.set('English string with {0} items' , 'Translated string 2 with {0} items', 'Translation hint 2');\n   Coral.i18n.set('English string: {0}, {1}, and {2}', 'Translated string 1: {2}, {0}, and {1}', 'Translation hint 1');\n   Coral.i18n.set('English string: {0}, {1}, and {2}', 'Translated string 2: {2}, {0}, and {1}', 'Translation hint 2');\n   Coral.i18n.set('English string: {name}', 'Translated string 1: {name}', 'Translation hint 1');\n   Coral.i18n.set('English string: {name}', 'Translated string 2: {name}', 'Translation hint 2');\n   Coral.i18n.set('English string: {name1}, {name2}, and {name3}', 'Translated string 1: {name3}, {name1}, and {name2}', 'Translation hint 1');\n   Coral.i18n.set('English string: {name1}, {name2}, and {name3}', 'Translated string 2: {name3}, {name1}, and {name2}', 'Translation hint 2');\n   */\n\n  /**\n   Sets multiple localized strings, using translation hints.\n\n   @param {Array<String, String, String>} map\n   A key-value object map to add to the strings dictionary.\n   @example\n   Coral.i18n.set([\n   ['English string', 'Translated string 1', 'Translation hint 1'],\n   ['English string', 'Translated string 2', 'Translation hint 2'],\n   ['English string with {0} items', 'Translated string 1 with {0} items', 'Translation hint 1'],\n   ['English string with {0} items', 'Translated string 2 with {0} items', 'Translation hint 2'],\n   ['English string with {0}, {1} and {2} items', 'Translated string 1 with {0}, {1} and {2} items', 'Translation hint 1'],\n   ['English string with {0}, {1} and {2} items', 'Translated string 2 with {0}, {1} and {2} items', 'Translation hint 2'],\n   ['English string: {name}', 'Translated string 1: {name}', 'Translation hint 1'],\n   ['English string: {name}', 'Translated string 2: {name}', 'Translation hint 2'],\n   ['English string: {name1}, {name2}, and {name3}', 'Translated string 1: {name3}, {name1}, and {name2}', 'Translation hint 1'],\n   ['English string: {name1}, {name2}, and {name3}', 'Translated string 2: {name3}, {name1}, and {name2}', 'Translation hint 2']\n   ]);\n   */\n  // eslint-disable-next-line func-names\n  set(...args) {\n    strings.generic[this._locale] = strings.generic[this._locale] || {};\n\n    let key, value, translationHint;\n    if (args.length === 0) {\n      // Return empty string if called without arguments\n      return '';\n    } else if (args.length === 1) {\n      if (!args[0]) {\n        throw new Error('Coral.i18n.set: Single argument must be an array of arrays of key/value/(translation hint).');\n      }\n      // multiple keys\n      else if (typeof args[0] === 'object' && typeof args[0][0] === 'object') {\n        for (let i = 0 ; i < args[0].length ; i++) {\n          key = args[0][i][0];\n          value = args[0][i][1];\n          translationHint = args[0][i][2];\n\n          if (translationHint) {\n            key = `${key}/[translation hint:${translationHint.replace(/&period;/g, '.')}]`;\n          }\n          strings.generic[this._locale][key] = value;\n        }\n      } else {\n        throw new Error('Coral.i18n.set: Single argument must be an array of key-value pairs.');\n      }\n    }\n    // single key, no translation hint\n    else if (args.length === 2) {\n      if (typeof args[0] === 'string' && !!args[0] && typeof args[1] === 'string' && !!args[1]) {\n        key = args[0];\n        value = args[1];\n        strings.generic[this._locale][key] = value;\n      } else {\n        throw new Error('Coral.i18n.set: Both arguments must be non-empty string values.');\n      }\n    }\n    // single key, with translation hint\n    else if (args.length === 3) {\n      if (typeof args[0] === 'string' && typeof args[1] === 'string' && typeof args[2] === 'string') {\n        key = args[0];\n        value = args[1];\n        translationHint = args[2];\n\n        if (translationHint !== 'null') {\n          key = `${key}/[translation hint:${translationHint.replace(/&period;/g, '.')}]`;\n        }\n\n        strings.generic[this._locale][key] = value;\n      } else {\n        throw new Error('Coral.i18n.set: All arguments must be of string type.');\n      }\n    } else {\n      throw new Error('Coral.i18n.set: Too many arguments provided.');\n    }\n\n    return this;\n  }\n\n  /**\n   Gets a localized string, using named arguments, and translation hint.\n\n   @param {String} key the key of the string to retrieve\n   @param {Object} args one more named arguments\n   @param {String} translation_hint context information for translators\n   @returns {String} the localized string with arguments\n   @example\n   Coral.i18n.get('English string: {name}', { name: 'foo' }, 'Translation hint 1'); // => 'Translated string 1: foo'\n   Coral.i18n.get('English string: {name}', { name: 'foo' }, 'Translation hint 2'); // => 'Translated string 2: foo'\n   Coral.i18n.get('English string: {name1}, {name2}, and {name3}', { name1: 'foo', name2: 'bar', name3: 'qux' }, 'Translation hint 1'); // => 'Translated string 1: qux, foo, and bar'\n   Coral.i18n.get('English string: {name1}, {name2}, and {name3}', { name1: 'foo', name2: 'bar', name3: 'qux' }, 'Translation hint 2'); // => 'Translated string 2: qux, foo, and bar'\n   */\n\n  /**\n   Gets a localized string, using arguments, and translation hint.\n\n   @param {String} key the key of the string to retrieve\n   @param {String} args one more arguments\n   @param {String} translation_hint context information for translators\n   @returns {String} the localized string with arguments\n   @example\n   Coral.i18n.get('English string: {0}', 10, 'Translation hint 1'); // => 'Translated string 1: 10')\n   Coral.i18n.get('English string: {0}', 10, 'Translation hint 2'); // => 'Translated string 2: 10')\n   Coral.i18n.get('English string: {0}, {1}, and {2}', 10, 20, 30, 'Translation hint 1'); // => 'Translated string 1: 30, 10, and 20'\n   Coral.i18n.get('English string: {0}, {1}, and {2}', 10, 20, 30, 'Translation hint 2'); // => 'Translated string 2: 30, 10, and 20'\n   */\n\n  /**\n   Gets a localized string, using translation hint.\n\n   @param {String} key the key of the string to retrieve\n   @param {String} translation_hint context information for translators\n   @returns {String} the localized string\n   @example\n   Coral.i18n.get('English string', 'Translation hint 1'); // => 'Translated string 1'\n   Coral.i18n.get('English string', 'Translation hint 2'); // => 'Translated string 2'\n   */\n\n  /**\n   Gets a localized string, using named arguments.\n\n   @param {String} key the key of the string to retrieve\n   @param {Object} args one more named arguments\n   @returns {String} the localized string with arguments\n   @example\n   Coral.i18n.get('English string: {name}', { name: 'foo' }); // => 'Translated string: foo'\n   Coral.i18n.get('English string: {name1}, {name2}, and {name3}', { name1: 'foo', name2: 'bar', name3: 'qux' }); // => 'Translated string: qux, foo, and bar'\n   */\n\n  /**\n   Gets a localized string, using arguments.\n\n   @param {String} key the key of the string to retrieve\n   @param {String} args one more arguments\n   @returns {String} the localized string with arguments\n   @example\n   Coral.i18n.get('English string: {0}', 10); // => 'Translated string: 10'\n   Coral.i18n.get('English string: {0}, {1}, and {2}', 10, 20, 30); // => 'Translated string: 30, 10, and 20'\n   */\n  /**\n   Gets a localized string.\n\n   @param {String} key the key of the string to retrieve\n   @returns {String} the localized string\n   @example\n   Coral.i18n.get('English string'); // => 'Translated String'\n   */\n  // eslint-disable-next-line func-names\n  get(...args) {\n    if (args.length === 0) {\n      // Return empty string if called without arguments\n      return '';\n    }\n\n    // The first argument is always the key\n    // Aladdin server stores periods in keys as HTML entities, so we need to match this\n    let key = args[0].replace('.', '&period;');\n\n    // The number of required variables can be determined by parsing the string\n    const placeholderMatches = key.match(this._evaluate);\n    const variablePlaceholderCount = placeholderMatches ? placeholderMatches.length : 0;\n\n    // The hint we'll use to translate\n    let translationHint = '';\n\n    let variables = {};\n    let variableCount = 0;\n    let i;\n\n    // Verify the number of provided arguments matches the placeholder count\n    if (args[1] !== null && typeof args[1] === 'object') {\n      variables = args[1];\n\n      // Check if provided variables object is complete\n      let placeholderName = '';\n      for (i = 0 ; i < placeholderMatches.length ; i++) {\n        placeholderName = placeholderMatches[i].slice(1).slice(0, -1);\n        if (variables[placeholderName] === null || typeof variables[placeholderName] === 'undefined') {\n          throw new Error(`Coral.i18n.get: Named key \"${placeholderName}\" not present in provided object.`);\n        }\n      }\n\n      // If an additional argument is present, it's the translation hint\n      if (typeof args[2] === 'string') {\n        translationHint = args[2];\n      }\n    } else {\n      // Assume no translation hint\n      variableCount = args.length - 1;\n\n      if (variableCount === variablePlaceholderCount + 1) {\n        // If we've got an extra argument, assume it's a translation hint\n        translationHint = args[args.length - 1];\n      } else if (variableCount !== variablePlaceholderCount) {\n        throw new Error(`Coral.i18n.get: Number of variable placeholders (${variablePlaceholderCount}) does not match number of variables (${variableCount}).`);\n      }\n\n      // Build variables object\n      for (i = 0 ; i < variableCount ; i++) {\n        variables[i] = args[i + 1];\n      }\n    }\n\n    // Include translation hint\n    if (translationHint) {\n      key = `${key}/[translation hint:${translationHint}]`;\n    }\n\n    // Fetch the string\n    let str = key;\n    for (const component in strings) {\n      if (typeof strings[component] !== 'undefined' &&\n        typeof strings[component][this._locale] !== 'undefined') {\n        str = strings[component][this._locale][key] || str;\n      }\n    }\n\n    // Optimization for a string with no placeholder\n    // e.g. Coral.i18n.get('English string');\n    if (variablePlaceholderCount === 0) {\n      return str;\n    }\n\n    // Replace all variables\n    return str.replace(this._evaluate, (name) => {\n      name = name.slice(1).slice(0, -1);\n      return variables[name];\n    });\n\n    // @todo use .toLocaleString(Coral.i18n.locale) in a future release\n  }\n\n  /**\n   I18n current locale value. See {@link I18nLocalesEnum}.\n   @type {String}\n   */\n  get locale() {\n    return this._locale;\n  }\n\n  set locale(newLocale) {\n    this._locale = newLocale;\n  }\n}\n\n// sets default locale, based on document lang attribute, if it exists, or en-US otherwise\nconst docLang = document.documentElement.lang.toLowerCase();\nconst locale = locales[docLang] || 'en-US';\n\n/**\n An i18n service.\n\n @type {I18nProvider}\n */\nconst i18n = new I18nProvider({locale});\n\nexport {i18n, strings};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2443,
    "kind": "typedef",
    "name": "I18nLocalesEnum",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nLocalesEnum",
    "access": "public",
    "description": "Enumeration for {@link i18n} locales.",
    "lineNumber": 99,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "en",
        "description": "English (U.S.)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "en-us",
        "description": "English (U.S.)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "cs",
        "description": "Czech (Czechia)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "cs-cz",
        "description": "Czech (Czechia)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "da",
        "description": "Danish (Denmark)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "da-dk",
        "description": "Danish (Denmark)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "de",
        "description": "German (Germany)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "de-de",
        "description": "German (Germany)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "es",
        "description": "Spanish (Spain)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "es-es",
        "description": "Spanish (Spain)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "fi",
        "description": "Finnish (Finland)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "fi-fi",
        "description": "Finnish (Finland)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "fr",
        "description": "French (France)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "fr-fr",
        "description": "French (France)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "it",
        "description": "Italian (Italy)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "it-it",
        "description": "Italian (Italy)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ja",
        "description": "Japanese (Japan)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ja-jp",
        "description": "Japanese (Japan)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ko",
        "description": "Korean (Korea)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ko-kr",
        "description": "Korean (Korea)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "nb",
        "description": "Norwegian Bokmål (Norway)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "nb-no",
        "description": "Norwegian Bokmål (Norway)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "nl",
        "description": "Dutch (Netherlands)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "nl-nl",
        "description": "Dutch (Netherlands)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "pl",
        "description": "Polish (Poland)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "pl-pl",
        "description": "Polish (Poland)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "pt",
        "description": "Portuguese (Brazil)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "pt-br",
        "description": "Portuguese (Brazil)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ru",
        "description": "Russian (Russia)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "ru-ru",
        "description": "Russian (Russia)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "sv",
        "description": "Swedish (Sweden)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "sv-se",
        "description": "Swedish (Sweden)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "tr",
        "description": "Turkish (Turkey)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "tr-tr",
        "description": "Turkish (Turkey)"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-cn",
        "description": "Simplified Chinese"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-hans-cn",
        "description": "Simplified Chinese"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-hans",
        "description": "Simplified Chinese"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-tw",
        "description": "Traditional Chinese"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-hant-tw",
        "description": "Traditional Chinese"
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "zh-hant",
        "description": "Traditional Chinese"
      }
    ],
    "type": {
      "types": [
        "Object"
      ],
      "optional": false,
      "name": "I18nLocalesEnum"
    }
  },
  {
    "__docId__": 2444,
    "kind": "variable",
    "name": "docLang",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~docLang",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 472,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2445,
    "kind": "variable",
    "name": "locale",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~locale",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 473,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2446,
    "kind": "variable",
    "name": "i18n",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~i18n",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{i18n}",
    "description": "An i18n service.",
    "lineNumber": 480,
    "type": {
      "nullable": null,
      "types": [
        "I18nProvider"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 2447,
    "kind": "class",
    "name": "I18nProvider",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "I18n service to get/set localized strings.",
    "lineNumber": 155,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2448,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#constructor",
    "access": "public",
    "description": "",
    "lineNumber": 162,
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "name": "options",
        "description": "Options for this combo handler."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "options.locale",
        "description": "The <code>locale</code> property defines the locale of the I18nProvider."
      }
    ]
  },
  {
    "__docId__": 2449,
    "kind": "member",
    "name": "_locale",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#_locale",
    "access": "private",
    "description": null,
    "lineNumber": 166,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "string"
      ]
    }
  },
  {
    "__docId__": 2451,
    "kind": "member",
    "name": "_evaluate",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#_evaluate",
    "access": "private",
    "description": null,
    "lineNumber": 172,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "undefined"
      ]
    }
  },
  {
    "__docId__": 2452,
    "kind": "method",
    "name": "set",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#set",
    "access": "public",
    "description": "Sets multiple localized strings, using translation hints.",
    "examples": [
      "Coral.i18n.set([\n['English string', 'Translated string 1', 'Translation hint 1'],\n['English string', 'Translated string 2', 'Translation hint 2'],\n['English string with {0} items', 'Translated string 1 with {0} items', 'Translation hint 1'],\n['English string with {0} items', 'Translated string 2 with {0} items', 'Translation hint 2'],\n['English string with {0}, {1} and {2} items', 'Translated string 1 with {0}, {1} and {2} items', 'Translation hint 1'],\n['English string with {0}, {1} and {2} items', 'Translated string 2 with {0}, {1} and {2} items', 'Translation hint 2'],\n['English string: {name}', 'Translated string 1: {name}', 'Translation hint 1'],\n['English string: {name}', 'Translated string 2: {name}', 'Translation hint 2'],\n['English string: {name1}, {name2}, and {name3}', 'Translated string 1: {name3}, {name1}, and {name2}', 'Translation hint 1'],\n['English string: {name1}, {name2}, and {name3}', 'Translated string 2: {name3}, {name1}, and {name2}', 'Translation hint 2']\n]);"
    ],
    "lineNumber": 246,
    "params": [
      {
        "nullable": null,
        "types": [
          "Array<String, String, String>"
        ],
        "spread": false,
        "optional": false,
        "name": "map",
        "description": "A key-value object map to add to the strings dictionary."
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2453,
    "kind": "method",
    "name": "get",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#get",
    "access": "public",
    "description": "Gets a localized string.",
    "examples": [
      "Coral.i18n.get('English string'); // => 'Translated String'"
    ],
    "lineNumber": 374,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} the localized string"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "key",
        "description": "the key of the string to retrieve"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "the localized string"
    }
  },
  {
    "__docId__": 2454,
    "kind": "member",
    "name": "locale",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~I18nProvider#locale",
    "access": "public",
    "description": "I18n current locale value. See {@link I18nLocalesEnum}.",
    "lineNumber": 462,
    "type": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": null
    },
    "modality": "both"
  },
  {
    "__docId__": 2457,
    "kind": "variable",
    "name": "strings",
    "memberof": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/I18nProvider.js~strings",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{strings}",
    "description": "Used to store i18n strings.",
    "lineNumber": 148,
    "properties": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "strings.generic",
        "description": ""
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 2458,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport commons from './Commons';\n\n/**\n A map of modifier names to their corresponding keycodes.\n @ignore\n */\nconst modifierCodes = {\n  '⇧': 16,\n  'shift': 16,\n  '⌥': 18,\n  'alt': 18,\n  'option': 18,\n  '⌃': 17,\n  'ctrl': 17,\n  'control': 17,\n  '⌘': 91,\n  'cmd': 91,\n  'command': 91,\n  'meta': 91\n};\n\n/**\n Used to check if a key is a modifier.\n @ignore\n */\nconst modifierCodeMap = {\n  16: true,\n  17: true,\n  18: true,\n  91: true,\n  224: true\n};\n\n/**\n A list of modifier event property names in sorted key code order. Used to add keycodes for modifiers.\n @ignore\n */\nconst modifierEventPropertyNames = [\n  'shiftKey',\n  'ctrlKey',\n  'altKey',\n  'metaKey'\n];\n\n/**\n A map of key codes to normalize. These are duplicate keys such as the number pad.\n @ignore\n */\nconst normalizedCodes = {\n  // Numpad 0-9\n  96: 48,\n  97: 49,\n  98: 50,\n  99: 51,\n  100: 52,\n  101: 53,\n  102: 54,\n  103: 55,\n  104: 56,\n  105: 57\n};\n\n// These keys are also implicitely used external\nconst specialKeyCodes = {\n  backspace: 8,\n  tab: 9,\n  // real event key is \"enter\" this will be mapped internally\n  return: 13,\n  pause: 19,\n  capslock: 20,\n  esc: 27,\n  escape: 27,\n  // real event key is \" \" this will be mapped internally\n  space: 32,\n  pageup: 33,\n  pagedown: 34,\n  end: 35,\n  home: 36,\n  // real event key is \"arrowLeft\" this will be mapped internally\n  left: 37,\n  // real event key is \"arrowUp\" this will be mapped internally\n  up: 38,\n  // real event key is \"arrowRight\" this will be mapped internally\n  right: 39,\n  // real event key is \"arrowDown\" this will be mapped internally\n  down: 40,\n  insert: 45,\n  del: 46,\n  delete: 46,\n  period: 190,\n  plus: 107,\n  minus: 189,\n  f1: 112,\n  f2: 113,\n  f3: 114,\n  f4: 115,\n  f5: 116,\n  f6: 117,\n  f7: 118,\n  f8: 119,\n  f9: 120,\n  f10: 121,\n  f11: 122,\n  f12: 123,\n  f13: 124,\n  f14: 125,\n  f15: 126,\n  f16: 127,\n  f17: 128,\n  f18: 129,\n  f19: 130,\n  numlock: 144,\n  scroll: 145\n};\n\n// Match a namespaced event, such as ctrl+r.myNS\nconst namespaceRE = /(.*?)(\\..+)$/;\n// Match a selector that requires context\nconst needsContextRE = /^[\\x20\\t\\r\\n\\f]*[>+~]/;\n\n/**\n The set of tags to ignore hot keys when focused within for the default filter.\n\n @ignore\n */\nconst restrictedTagNames = {\n  INPUT: true,\n  SELECT: true,\n  TEXTAREA: true,\n  // Support alphanumeric search\n  'CORAL-SELECTLIST-ITEM': true\n};\n\n/**\n Normalize duplicate codes.\n @ignore\n */\nfunction normalizeCode(code) {\n  return normalizedCodes[code] || code;\n}\n\nfunction mapSpecialEventKeyToSpecialAPIDefinition(eventKey) {\n  // The official event.key is not compatible with this API special key registration, so map them\n  switch (eventKey) {\n    case 'enter':\n      return 'return';\n    case ' ':\n      return 'space';\n    case 'arrowup':\n      return 'up';\n    case 'arrowdown':\n      return 'down';\n    case 'arrowleft':\n      return 'left';\n    case 'arrowright':\n      return 'right';\n    default:\n      return eventKey;\n  }\n}\n\n/**\n Convert a key to its character code representation.\n\n @ignore\n\n @param key\n @return {*|Number}\n */\nfunction keyToCode(key) {\n  key = mapSpecialEventKeyToSpecialAPIDefinition(key.toLowerCase());\n\n  // Map special string representations to their character code equivalent\n  const code = specialKeyCodes[key] || modifierCodes[key];\n\n  if (!code && key.length > 1) {\n    throw new Error(`Coral.Keys: Key ${key} not recognized`);\n  }\n\n  // Return the special code from the map or the char code repesenting the character\n  return code || key.toUpperCase().charCodeAt(0);\n}\n\nfunction cleanupFilteredListeners(keycombo, listeners, event) {\n  const result = [];\n  if (!listeners || !event.key || keycombo.indexOf('+') > 0) {\n    return listeners;\n  }\n\n  // Check there is no registration conflict for same code registrations\n  // For example: \".\" keyCharCode is 46 and \"delete\" keyCode is also 46\n  const key = mapSpecialEventKeyToSpecialAPIDefinition(event.key.toLowerCase());\n  for (let i = 0 ; i < listeners.length ; i++) {\n    if (listeners[i].originalString.indexOf(key) === 0 || key.indexOf(listeners[i].originalString) === 0) {\n      result.push(listeners[i]);\n    }\n  }\n  return result;\n}\n\n/**\n Handle key combination events.\n */\nclass Keys {\n  /**\n   @param {*} elOrSelector\n   The selector or element to listen for keyboard events on. This should be the common parent of all\n   elements you wish to listen for events on.\n   @param {Object} [options]\n   Options for this combo handler.\n   @param {Function} [options.context]\n   The desired value of the <code>this</code> keyword context when executing listeners. Defaults to the element on\n   which the event is listened for.\n   @param {Function} [options.preventDefault=false]\n   Whether to prevent the default behavior when a key combo is matched.\n   @param {Function} [options.stopPropagation=false]\n   Whether to stop propagation when a key combo is matched.\n   @param {Function} [options.filter]\n   The filter function for keyboard events. This can be used to stop events from being triggered when they originate\n   from specific elements. Defaults to {@link Keys.filterInputs}.\n   */\n  constructor(elOrSelector, options) {\n    options = options || {};\n\n    if (typeof elOrSelector === 'undefined') {\n      throw new Error(`Coral.Keys: Cannot create a combo handler for ${elOrSelector}`);\n    }\n\n    // Cache the element object\n    this._el = typeof elOrSelector === 'string' ? document.querySelector(elOrSelector) : elOrSelector;\n\n    // Use provided context\n    this._context = options.context;\n\n    /**\n     The filter function to use when evaluating keypresses\n     */\n    this._filter = options.filter || this.constructor.filterInputs;\n\n    /**\n     Whether to prevent default\n     */\n    this._preventDefault = options.preventDefault || false;\n\n    /**\n     Whether to stop propagation and prevent default\n     */\n    this._stopPropagation = options.stopPropagation || false;\n\n    /**\n     A map of key code combinations to arrays of listener functions\n     */\n    this._keyListeners = [];\n\n    /**\n     A an array of key sequences objects\n     */\n    this._keySequences = [];\n\n    /**\n     The sorted array of currently pressed keycodes\n     */\n    this._currentKeys = [];\n\n    /**\n     The joined string representation of currently pressed keycodes\n     */\n    this._currentKeyCombo = [];\n\n    /**\n     The timeout that corresponds to sequences\n     */\n    this._sequenceTimeout = null;\n\n    this._handleKeyDown = this._handleKeyDown.bind(this);\n    this._handleKeyUp = this._handleKeyUp.bind(this);\n    this._resetSequence = this._resetSequence.bind(this);\n    this.reset = this.reset.bind(this);\n\n    // Initialize immediately\n    this.init();\n  }\n\n  _resetSequence() {\n    window.clearTimeout(this._sequenceTimeout);\n    this._keySequences.forEach((sequence) => {\n      // Reset each sequence\n      sequence.currentPart = 0;\n    });\n  }\n\n  _setCurrentKeyCombo(event) {\n    // Build string for modifiers\n    const currentModifiers = [];\n    for (let i = 0 ; i < modifierEventPropertyNames.length ; i++) {\n      const propName = modifierEventPropertyNames[i];\n\n      if (event[propName]) {\n        currentModifiers.push(modifierCodes[propName.slice(0, -3)]);\n      }\n    }\n\n    // Store current key combo\n    this._currentKeyCombo = this._currentKeys.concat(currentModifiers).sort().join('+');\n  }\n\n  /**\n   Reset the state of this instance. This resets the currently pressed keys.\n\n   @function reset\n\n   @returns {Keys} this, chainable.\n   */\n  reset() {\n    // Only reset variables related to currently pressed keys\n    // Don't mess with sequences\n    this._currentKeys = [];\n    this._currentKeyCombo = '';\n\n    return this;\n  }\n\n  _processSequences() {\n    const activeSequenceListeners = [];\n\n    // Check each sequence's state\n    this._keySequences.forEach((sequence) => {\n      if (sequence.parts[sequence.currentPart] === this._currentKeyCombo) {\n        // If the current key combo in the sequence was pressed, increment the pointer\n        sequence.currentPart++;\n      } else {\n        // Reset the sequence if a key was encountered out of sequence\n        sequence.currentPart = 0;\n      }\n\n      if (sequence.currentPart === sequence.parts.length) {\n        // If we've reached the end of the sequence, add it to the list of active sequences\n        activeSequenceListeners.push(sequence);\n\n        // Reset the sequence's state so it can be triggered again\n        sequence.currentPart = 0;\n      }\n    });\n\n    return activeSequenceListeners;\n  }\n\n  _executeListeners(event, keyup) {\n    // Don't do anything if we don't have any keys pressed\n    if (!this._currentKeyCombo) {\n      return;\n    }\n\n    // Evaluate whether we should filter this keypress\n    if (!this._filter(event)) {\n      return;\n    }\n\n    const target = event.target || event.srcElement;\n    const doc = Object.prototype.toString.call(event.currentTarget) === '[object Window]' ? event.currentTarget.document : event.currentTarget;\n\n    let listeners = [];\n\n    // Execute listeners associated with the current key combination\n    let comboListeners = this._keyListeners[this._currentKeyCombo];\n    comboListeners = cleanupFilteredListeners(this._currentKeyCombo, comboListeners, event);\n\n    // If it is a combo key combination but we listen on the final key combination result or on special single char like \"/\"\n    // E.g. we listen on \"/\" but the user presses \"Shift+7\" on a german-swiss keyboard\n    // or we listen on \"/\" on the single key event on a US layout keyboard\n    if (!keyup && !comboListeners) {\n      if (event.key) {\n        comboListeners = this._keyListeners[event.key.charCodeAt(0)];\n        comboListeners = cleanupFilteredListeners(this._currentKeyCombo, comboListeners, event);\n      }\n    }\n\n    let sequenceListeners;\n    if (!keyup) {\n      // Process sequences and get listeners associated with the current sequence\n      // Don't do this on keyup as this breaks sequences with modifiers\n      sequenceListeners = this._processSequences();\n    }\n\n    if (comboListeners && comboListeners.length) {\n      listeners = listeners.concat(comboListeners);\n    }\n\n    if (sequenceListeners && sequenceListeners.length) {\n      listeners = listeners.concat(sequenceListeners);\n    }\n\n    if (listeners && listeners.length) {\n      for (let i = 0 ; i < listeners.length ; i++) {\n        const listener = listeners[i];\n\n        // Perform event delegation\n        if (listener.selector) {\n          let selector = '';\n\n          // This allows us to match when the delegation selector includes context\n          if (listener.needsContext) {\n            doc.id = doc.id || commons.getUID();\n            selector = `#${doc.id} `;\n          }\n\n          const matches = Array.prototype.indexOf.call(doc.querySelectorAll(selector + listener.selector), target) >= 0;\n\n          // Skip if the originating element doesn't match the selector\n          if (!matches) {\n            continue;\n          }\n        }\n\n        // Add data to event object\n        if (typeof listener.data !== 'undefined') {\n          event.data = listener.data;\n        }\n\n        // Add matchedTarget\n        event.matchedTarget = target;\n\n        // Add keys that triggered the event\n        event.keys = listener.originalString;\n\n        listener.listener.call(this._context || doc, event);\n      }\n\n      // Don't do the default thing\n      if (this._preventDefault) {\n        event.preventDefault();\n      }\n      if (this._stopPropagation) {\n        event.stopPropagation();\n      }\n    }\n  }\n\n  _handleKeyDown(event) {\n    window.clearTimeout(this._sequenceTimeout);\n    this._sequenceTimeout = window.setTimeout(this._resetSequence, this.constructor.sequenceTime);\n\n    // Store pressed key in array\n    const key = normalizeCode(event.keyCode);\n\n    // Don't do anything when a modifier is pressed\n    if (modifierCodeMap[key]) {\n      return;\n    }\n\n    if (this._currentKeys.indexOf(key) === -1) {\n      this._currentKeys.push(key);\n\n      this._setCurrentKeyCombo(event);\n    }\n\n    this._executeListeners(event);\n\n    // Workaround: keyup events are never triggered while the command key is down, so reset the list of keys\n    if (event.metaKey) {\n      this.reset();\n    }\n\n    if (!event.target.parentNode) {\n      // Workaround: keyup events are never triggered if the element does not have a parent node\n      this.reset();\n    }\n  }\n\n  _handleKeyUp(event) {\n    const key = normalizeCode(event.keyCode);\n\n    if (modifierCodeMap[key]) {\n      // Workaround: keyup events are not triggered when command key is down on Mac, so if the command key is\n      // released, consider all keys released\n      // Test: comment this out, press K, press L, press Command, release L, release Command, then release K -- L is\n      // triggered. This also prevents handlers for related key combos to be triggered\n      // Test: comment this out, press Control, press Alt, press A, press S, release Alt, release S -- Control+A is\n      // triggered\n      this.reset();\n\n      // We don't ever want to execute handlers when a modifier is released, and we can't since they don't end up in\n      // currentKeys. If we weren't doing the index check below, that could result in key combo handlers for ctrl+r to\n      // be triggered when someone released alt first after triggering ctrl+alt+r. In any case, return to avoid the\n      // uselss extra work\n      return;\n    }\n\n    // Remove key from array\n    const index = this._currentKeys.indexOf(key);\n    if (index !== -1) {\n      this._currentKeys.splice(index, 1);\n\n      // If too many keys are pressed, then one is removed, make sure to check for a match\n      this._setCurrentKeyCombo(event);\n      this._executeListeners(event, true);\n    }\n  }\n\n  _keySequenceStringToArray(keyCombo) {\n    return keyCombo.toString().split('-').map(this._keyComboToCodeString);\n  }\n\n  /**\n   Add a key combo listener.\n\n   @function on\n   @param {String} keyCombo\n   The key combination to listen for, such as <code>'ctrl-f'</code>.\n   @param {String} [selector]\n   A selector to use for event delegation.\n   @param {String} [data]\n   Data to pass to listeners as <code>event.data</code>.\n   @param {Function} listener\n   The listener to execute when this key combination is pressed. Executes on keydown, or, if too many keys are\n   pressed and one is released, resulting in the correct key combination, executes on keyup.\n\n   @returns {Keys} this, chainable.\n   */\n  on(keyCombo, selector, data, listener) {\n    // keyCombo can be a map of keyCombos to handlers\n    if (typeof keyCombo === 'object') {\n      // ( keyCombo-Object, selector, data )\n      if (typeof selector !== 'string') {\n        // ( keyCombo-Object, data )\n        // ( keyCombo-Object, null, data )\n        data = data || selector;\n        selector = undefined;\n      }\n      for (const combo in keyCombo) {\n        this.on(combo, selector, data, keyCombo[combo]);\n      }\n      return this;\n    }\n\n    if (typeof data === 'undefined' && typeof listener === 'undefined') {\n      // ( keyCombo, listener )\n      listener = selector;\n      data = selector = undefined;\n    } else if (typeof listener === 'undefined') {\n      if (typeof selector === 'string') {\n        // ( keyCombo, selector, listener )\n        listener = data;\n        data = undefined;\n      } else {\n        // ( keyCombo, data, listener )\n        listener = data;\n        data = selector;\n        selector = undefined;\n      }\n    }\n\n    if (typeof listener !== 'function') {\n      throw new Error(`Coral.Keys: Cannot add listener of type ${typeof listener}`);\n    }\n\n    let namespace;\n    const namespaceMatch = namespaceRE.exec(keyCombo);\n    if (namespaceMatch) {\n      keyCombo = namespaceMatch[1];\n      namespace = namespaceMatch[2];\n    }\n\n    // Determine if this selector needs context when evaluating event delegation\n    // A selector needs context when it includes things like >, ~, :first-child, etc\n    const needsContext = selector ? needsContextRE.test(selector) : false;\n\n    // Check if the string is a sequence or a keypress\n    if (keyCombo.toString().indexOf('-') !== -1 && keyCombo.toString().length > 1) {\n      // It's a sequence!\n\n      // Divide it into its parts and convert to a code string\n      const sequenceParts = this._keySequenceStringToArray(keyCombo);\n\n      // Store the listener and associated information in the list for this sequence\n      this._keySequences.push({\n        originalString: keyCombo,\n        currentPart: 0,\n        parts: sequenceParts,\n        needsContext: needsContext,\n        selector: selector,\n        listener: listener,\n        data: data,\n        namespace: namespace\n      });\n    } else {\n      const originalString = keyCombo.toString();\n\n      // It's a key combo!\n      keyCombo = this._keyComboToCodeString(keyCombo);\n\n      const listeners = this._keyListeners[keyCombo] = this._keyListeners[keyCombo] || [];\n\n      // Store the listener and associated information in the list for this keyCombo\n      listeners.push({\n        originalString: originalString,\n        // Determine if this selector needs context when evaluating event delegation\n        // A selector needs context when it includes things like >, ~, :first-child, etc\n        needsContext: selector ? needsContextRE.test(selector) : false,\n        selector: selector,\n        listener: listener,\n        data: data,\n        namespace: namespace\n      });\n    }\n\n    return this;\n  }\n\n  _offByKeyComboString(keyComboString, namespace, selector, listener) {\n    let i;\n    const listeners = this._keyListeners[keyComboString];\n\n    if (listeners && listeners.length) {\n      if (typeof selector === 'undefined' && typeof listener === 'undefined' && typeof namespace === 'undefined') {\n        // Unbind all listeners for this key combo\n        listeners.length = 0;\n      } else if (typeof listener === 'undefined') {\n        // Unbind all listeners of a specific selector and or namespace\n        for (i = 0 ; i < listeners.length ; i++) {\n          // This comparison works because selector and namespace are undefined by default\n          if (listeners[i].selector === selector && listeners[i].namespace === namespace) {\n            listeners.splice(i, 1);\n            i--;\n          }\n        }\n      } else {\n        // Unbind a specific listener, optionally on a specific selector and specific namespace\n        for (i = 0 ; i < listeners.length ; i++) {\n          if (listeners[i].listener === listener &&\n            listeners[i].selector === selector &&\n            listeners[i].namespace === namespace) {\n            listeners.splice(i, 1);\n            i--;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   Remove a key combo listener.\n\n   @function off\n   @param {String} keyCombo\n   The key combination to listen for, such as <code>'ctrl-f'</code>.\n   @param {String} [selector]\n   A selector to use for event delegation.\n   @param {Function} listener\n   The listener that was passed to on.\n\n   @returns {Keys} this, chainable.\n   */\n  off(keyCombo, selector, listener) {\n    if (typeof listener === 'undefined') {\n      listener = selector;\n      selector = undefined;\n    }\n\n    let i;\n    let namespace;\n    const namespaceMatch = namespaceRE.exec(keyCombo);\n    if (namespaceMatch) {\n      keyCombo = namespaceMatch[1];\n      namespace = namespaceMatch[2];\n    }\n\n    if (keyCombo === '' && namespace !== undefined) {\n      // If we have a namespace by no keyCombo, remove all events of the namespace for each key combo\n      for (keyCombo in this._keyListeners) {\n        this._offByKeyComboString(keyCombo, namespace, selector, listener);\n      }\n\n      // Remove sequences\n      for (i = 0 ; i < this._keySequences.length ; i++) {\n        if (this._keySequences[i].namespace === namespace) {\n          this._keySequences.splice(i, 1);\n          i--;\n        }\n      }\n\n      return this;\n    }\n\n    if (keyCombo.indexOf('-') !== -1) {\n      // Unbind a specific key sequence listener, optionally on a specific selector and specific namespace\n      for (i = 0 ; i < this._keySequences.length ; i++) {\n        if (\n          (keyCombo === undefined || this._keySequences[i].originalString === keyCombo) &&\n          (listener === undefined || this._keySequences[i].listener === listener) &&\n          (selector === undefined || this._keySequences[i].selector === selector) &&\n          (namespace === undefined || this._keySequences[i].namespace === namespace)\n        ) {\n          this._keySequences.splice(i, 1);\n          i--;\n        }\n      }\n    } else {\n      keyCombo = this._keyComboToCodeString(keyCombo);\n\n      this._offByKeyComboString(keyCombo, namespace, selector, listener);\n    }\n\n    return this;\n  }\n\n  /**\n   Destroy this instance. This removes all event listeners, references, and state.\n\n   @function destroy\n   @param {Boolean} globalsOnly\n   Whether only global listeners should be removed\n\n   @returns {Keys} this, chainable.\n   */\n  destroy(globalsOnly) {\n    if (!globalsOnly) {\n      this._keyListeners = null;\n      this._currentKeys = null;\n      this._currentKeyCombo = null;\n\n      this._el.removeEventListener('keydown', this._handleKeyDown);\n    }\n\n    window.removeEventListener('keyup', this._handleKeyUp, true);\n    window.removeEventListener('focus', this.reset);\n\n    return this;\n  }\n\n  /**\n   Initialize an instance created without the <code>new</code> keyword or revive a destroyed instance. This method\n   will be called automatically if an instance is created with <code>new Coral.keys</code>.\n\n   @function init\n   @param {Boolean} globalsOnly\n   Whether only global listeners should be added\n\n   @returns {Keys} this, chainable.\n   */\n  init(globalsOnly) {\n    if (!globalsOnly) {\n      // Reset all variable states\n      this._currentKeys = [];\n      this._currentKeyCombo = '';\n      this._keyListeners = {};\n      this._keySequences = [];\n\n      this._el.addEventListener('keydown', this._handleKeyDown);\n    }\n\n    // Remove window event listeners first to avoid memory leak\n    this.destroy(true);\n\n    // Watching on capture so it is immune to stopPropagation(). It's very important this event\n    // is handled so key entries previously added on keydown can be cleared out.\n    // If multiple identical EventListeners are registered on the same EventTarget with the same parameters the\n    // duplicate instances are discarded. They do not cause the EventListener to be called twice.\n    window.addEventListener('keyup', this._handleKeyUp, true);\n    window.addEventListener('focus', this.reset);\n\n    return this;\n  }\n\n  /**\n   The default keycombo event filter function. Ignores key combos triggered on input, select, and textarea.\n\n   @param event\n   The event passed\n\n   @returns {Boolean} True, if event.target is not editable and event.target.tagname is not restricted\n   */\n  static filterInputs(event) {\n    // Escape keycode doesn't have to be filtered\n    if (event.keyCode === specialKeyCodes.escape) {\n      return true;\n    }\n\n    const target = event.target;\n    const tagName = target.tagName;\n    const isContentEditable = target.isContentEditable;\n    const isRestrictedTag = restrictedTagNames[tagName];\n    return !isContentEditable && !isRestrictedTag;\n  }\n\n  /**\n   Convert a key to its character code representation.\n\n   @param {String} key\n   The key character that needs to be converted. If the String contains more than one character, an error will be\n   produced.\n\n   @returns {Number} The character code of the given String.\n   */\n  static keyToCode(key) {\n    return keyToCode(key);\n  }\n\n  /**\n   The time allowed between keypresses for a sequence in miliseconds\n   @type {Number}\n   @default 1500\n   */\n  static get sequenceTime() {\n    return 1500;\n  }\n\n  /**\n   Convert a combination of keys separated by + into the corresponding code string.\n   @ignore\n   */\n  _keyComboToCodeString(keyCombo) {\n    // if single \"+\"\n    if (keyCombo === '+') {\n      return keyToCode(keyCombo);\n    }\n\n    return keyCombo\n      // Convert to string so numbers are supported\n      .toString()\n      .split('+')\n      .map(keyToCode)\n      // Sort keys for easy comparison\n      .sort()\n      .join('+');\n  }\n}\n\n/**\n A key listener for global hotkeys is exposed for document eventing handling.\n\n @type {Keys}\n */\n// Register against the documentElement, <html>, so event delegation works\nconst keys = new Keys(document.documentElement, {\n  // Don't let global hotkeys trigger default actions\n  stopPropagation: true,\n  preventDefault: true\n});\n\nexport {keys, Keys};\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Keys.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2459,
    "kind": "variable",
    "name": "modifierCodes",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~modifierCodes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "A map of modifier names to their corresponding keycodes.",
    "lineNumber": 19,
    "ignore": true,
    "type": {
      "types": [
        "{\"⇧\": number, \"shift\": number, \"⌥\": number, \"alt\": number, \"option\": number, \"⌃\": number, \"ctrl\": number, \"control\": number, \"⌘\": number, \"cmd\": number, \"command\": number, \"meta\": number}"
      ]
    }
  },
  {
    "__docId__": 2460,
    "kind": "variable",
    "name": "modifierCodeMap",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~modifierCodeMap",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Used to check if a key is a modifier.",
    "lineNumber": 38,
    "ignore": true,
    "type": {
      "types": [
        "{\"16\": boolean, \"17\": boolean, \"18\": boolean, \"91\": boolean, \"224\": boolean}"
      ]
    }
  },
  {
    "__docId__": 2461,
    "kind": "variable",
    "name": "modifierEventPropertyNames",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~modifierEventPropertyNames",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "A list of modifier event property names in sorted key code order. Used to add keycodes for modifiers.",
    "lineNumber": 50,
    "ignore": true,
    "type": {
      "types": [
        "string[]"
      ]
    }
  },
  {
    "__docId__": 2462,
    "kind": "variable",
    "name": "normalizedCodes",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~normalizedCodes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "A map of key codes to normalize. These are duplicate keys such as the number pad.",
    "lineNumber": 61,
    "ignore": true,
    "type": {
      "types": [
        "{\"96\": number, \"97\": number, \"98\": number, \"99\": number, \"100\": number, \"101\": number, \"102\": number, \"103\": number, \"104\": number, \"105\": number}"
      ]
    }
  },
  {
    "__docId__": 2463,
    "kind": "variable",
    "name": "specialKeyCodes",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~specialKeyCodes",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 76,
    "undocument": true,
    "type": {
      "types": [
        "{\"backspace\": number, \"tab\": number, \"return\": number, \"pause\": number, \"capslock\": number, \"esc\": number, \"escape\": number, \"space\": number, \"pageup\": number, \"pagedown\": number, \"end\": number, \"home\": number, \"left\": number, \"up\": number, \"right\": number, \"down\": number, \"insert\": number, \"del\": number, \"delete\": number, \"period\": number, \"plus\": number, \"minus\": number, \"f1\": number, \"f2\": number, \"f3\": number, \"f4\": number, \"f5\": number, \"f6\": number, \"f7\": number, \"f8\": number, \"f9\": number, \"f10\": number, \"f11\": number, \"f12\": number, \"f13\": number, \"f14\": number, \"f15\": number, \"f16\": number, \"f17\": number, \"f18\": number, \"f19\": number, \"numlock\": number, \"scroll\": number}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2464,
    "kind": "variable",
    "name": "namespaceRE",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~namespaceRE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 129,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2465,
    "kind": "variable",
    "name": "needsContextRE",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~needsContextRE",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 131,
    "undocument": true,
    "type": {
      "types": [
        "undefined"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2466,
    "kind": "variable",
    "name": "restrictedTagNames",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~restrictedTagNames",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "The set of tags to ignore hot keys when focused within for the default filter.",
    "lineNumber": 138,
    "ignore": true,
    "type": {
      "types": [
        "{\"INPUT\": boolean, \"SELECT\": boolean, \"TEXTAREA\": boolean, \"CORAL-SELECTLIST-ITEM\": boolean}"
      ]
    }
  },
  {
    "__docId__": 2467,
    "kind": "function",
    "name": "normalizeCode",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~normalizeCode",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Normalize duplicate codes.",
    "lineNumber": 150,
    "ignore": true,
    "params": [
      {
        "name": "code",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2468,
    "kind": "function",
    "name": "mapSpecialEventKeyToSpecialAPIDefinition",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~mapSpecialEventKeyToSpecialAPIDefinition",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 154,
    "undocument": true,
    "params": [
      {
        "name": "eventKey",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2469,
    "kind": "function",
    "name": "keyToCode",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~keyToCode",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Convert a key to its character code representation.",
    "lineNumber": 182,
    "ignore": true,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "key",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "*",
        "Number"
      ],
      "spread": false,
      "description": ""
    }
  },
  {
    "__docId__": 2470,
    "kind": "function",
    "name": "cleanupFilteredListeners",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~cleanupFilteredListeners",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 196,
    "undocument": true,
    "params": [
      {
        "name": "keycombo",
        "types": [
          "*"
        ]
      },
      {
        "name": "listeners",
        "types": [
          "*"
        ]
      },
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2471,
    "kind": "variable",
    "name": "keys",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~keys",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{keys}",
    "description": "A key listener for global hotkeys is exposed for document eventing handling.",
    "lineNumber": 847,
    "type": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": null
    }
  },
  {
    "__docId__": 2472,
    "kind": "class",
    "name": "Keys",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Handle key combination events.",
    "lineNumber": 216,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2473,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#constructor",
    "access": "public",
    "description": "",
    "lineNumber": 234,
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "elOrSelector",
        "description": "The selector or element to listen for keyboard events on. This should be the common parent of all\nelements you wish to listen for events on."
      },
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": true,
        "name": "options",
        "description": "Options for this combo handler."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": true,
        "name": "options.context",
        "description": "The desired value of the <code>this</code> keyword context when executing listeners. Defaults to the element on\nwhich the event is listened for."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "false",
        "defaultRaw": false,
        "name": "options.preventDefault",
        "description": "Whether to prevent the default behavior when a key combo is matched."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": true,
        "defaultValue": "false",
        "defaultRaw": false,
        "name": "options.stopPropagation",
        "description": "Whether to stop propagation when a key combo is matched."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": true,
        "name": "options.filter",
        "description": "The filter function for keyboard events. This can be used to stop events from being triggered when they originate\nfrom specific elements. Defaults to {@link Keys.filterInputs}."
      }
    ]
  },
  {
    "__docId__": 2474,
    "kind": "member",
    "name": "_el",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_el",
    "access": "private",
    "description": null,
    "lineNumber": 242,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2475,
    "kind": "member",
    "name": "_context",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_context",
    "access": "private",
    "description": null,
    "lineNumber": 245,
    "undocument": true,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2476,
    "kind": "member",
    "name": "_filter",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_filter",
    "access": "private",
    "description": "The filter function to use when evaluating keypresses",
    "lineNumber": 250,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2477,
    "kind": "member",
    "name": "_preventDefault",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_preventDefault",
    "access": "private",
    "description": "Whether to prevent default",
    "lineNumber": 255,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2478,
    "kind": "member",
    "name": "_stopPropagation",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_stopPropagation",
    "access": "private",
    "description": "Whether to stop propagation and prevent default",
    "lineNumber": 260,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2479,
    "kind": "member",
    "name": "_keyListeners",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_keyListeners",
    "access": "private",
    "description": "A map of key code combinations to arrays of listener functions",
    "lineNumber": 265,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2480,
    "kind": "member",
    "name": "_keySequences",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_keySequences",
    "access": "private",
    "description": "A an array of key sequences objects",
    "lineNumber": 270,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2481,
    "kind": "member",
    "name": "_currentKeys",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_currentKeys",
    "access": "private",
    "description": "The sorted array of currently pressed keycodes",
    "lineNumber": 275,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2482,
    "kind": "member",
    "name": "_currentKeyCombo",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_currentKeyCombo",
    "access": "private",
    "description": "The joined string representation of currently pressed keycodes",
    "lineNumber": 280,
    "ignore": true,
    "type": {
      "types": [
        "*[]"
      ]
    }
  },
  {
    "__docId__": 2483,
    "kind": "member",
    "name": "_sequenceTimeout",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_sequenceTimeout",
    "access": "private",
    "description": "The timeout that corresponds to sequences",
    "lineNumber": 285,
    "ignore": true,
    "type": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2488,
    "kind": "method",
    "name": "_resetSequence",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_resetSequence",
    "access": "private",
    "description": null,
    "lineNumber": 296,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": null
  },
  {
    "__docId__": 2489,
    "kind": "method",
    "name": "_setCurrentKeyCombo",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_setCurrentKeyCombo",
    "access": "private",
    "description": null,
    "lineNumber": 304,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2491,
    "kind": "method",
    "name": "reset",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#reset",
    "access": "public",
    "description": "Reset the state of this instance. This resets the currently pressed keys.",
    "lineNumber": 326,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "reset"
      },
      {
        "tagName": "@returns",
        "tagValue": "{Keys} this, chainable."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": "this, chainable."
    },
    "params": []
  },
  {
    "__docId__": 2494,
    "kind": "method",
    "name": "_processSequences",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_processSequences",
    "access": "private",
    "description": null,
    "lineNumber": 335,
    "undocument": true,
    "ignore": true,
    "params": [],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2495,
    "kind": "method",
    "name": "_executeListeners",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_executeListeners",
    "access": "private",
    "description": null,
    "lineNumber": 360,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      },
      {
        "name": "keyup",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2496,
    "kind": "method",
    "name": "_handleKeyDown",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_handleKeyDown",
    "access": "private",
    "description": null,
    "lineNumber": 451,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2498,
    "kind": "method",
    "name": "_handleKeyUp",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_handleKeyUp",
    "access": "private",
    "description": null,
    "lineNumber": 482,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "event",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2499,
    "kind": "method",
    "name": "_keySequenceStringToArray",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_keySequenceStringToArray",
    "access": "private",
    "description": null,
    "lineNumber": 512,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "keyCombo",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2500,
    "kind": "method",
    "name": "on",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#on",
    "access": "public",
    "description": "Add a key combo listener.",
    "lineNumber": 532,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "on"
      },
      {
        "tagName": "@returns",
        "tagValue": "{Keys} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "keyCombo",
        "description": "The key combination to listen for, such as <code>'ctrl-f'</code>."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "A selector to use for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "data",
        "description": "Data to pass to listeners as <code>event.data</code>."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "listener",
        "description": "The listener to execute when this key combination is pressed. Executes on keydown, or, if too many keys are\npressed and one is released, resulting in the correct key combination, executes on keyup."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2501,
    "kind": "method",
    "name": "_offByKeyComboString",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_offByKeyComboString",
    "access": "private",
    "description": null,
    "lineNumber": 622,
    "undocument": true,
    "ignore": true,
    "params": [
      {
        "name": "keyComboString",
        "types": [
          "*"
        ]
      },
      {
        "name": "namespace",
        "types": [
          "*"
        ]
      },
      {
        "name": "selector",
        "types": [
          "*"
        ]
      },
      {
        "name": "listener",
        "types": [
          "*"
        ]
      }
    ],
    "return": null
  },
  {
    "__docId__": 2502,
    "kind": "method",
    "name": "off",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#off",
    "access": "public",
    "description": "Remove a key combo listener.",
    "lineNumber": 666,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "off"
      },
      {
        "tagName": "@returns",
        "tagValue": "{Keys} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "keyCombo",
        "description": "The key combination to listen for, such as <code>'ctrl-f'</code>."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": true,
        "name": "selector",
        "description": "A selector to use for event delegation."
      },
      {
        "nullable": null,
        "types": [
          "Function"
        ],
        "spread": false,
        "optional": false,
        "name": "listener",
        "description": "The listener that was passed to on."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2503,
    "kind": "method",
    "name": "destroy",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#destroy",
    "access": "public",
    "description": "Destroy this instance. This removes all event listeners, references, and state.",
    "lineNumber": 728,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "destroy"
      },
      {
        "tagName": "@returns",
        "tagValue": "{Keys} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "globalsOnly",
        "description": "Whether only global listeners should be removed"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2507,
    "kind": "method",
    "name": "init",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#init",
    "access": "public",
    "description": "Initialize an instance created without the <code>new</code> keyword or revive a destroyed instance. This method\nwill be called automatically if an instance is created with <code>new Coral.keys</code>.",
    "lineNumber": 753,
    "unknown": [
      {
        "tagName": "@function",
        "tagValue": "init"
      },
      {
        "tagName": "@returns",
        "tagValue": "{Keys} this, chainable."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Boolean"
        ],
        "spread": false,
        "optional": false,
        "name": "globalsOnly",
        "description": "Whether only global listeners should be added"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Keys"
      ],
      "spread": false,
      "description": "this, chainable."
    }
  },
  {
    "__docId__": 2512,
    "kind": "method",
    "name": "filterInputs",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys.filterInputs",
    "access": "public",
    "description": "The default keycombo event filter function. Ignores key combos triggered on input, select, and textarea.",
    "lineNumber": 785,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} True, if event.target is not editable and event.target.tagname is not restricted"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": "The event passed"
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "True, if event.target is not editable and event.target.tagname is not restricted"
    }
  },
  {
    "__docId__": 2513,
    "kind": "method",
    "name": "keyToCode",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys.keyToCode",
    "access": "public",
    "description": "Convert a key to its character code representation.",
    "lineNumber": 807,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Number} The character code of the given String."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "key",
        "description": "The key character that needs to be converted. If the String contains more than one character, an error will be\nproduced."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": "The character code of the given String."
    }
  },
  {
    "__docId__": 2514,
    "kind": "member",
    "name": "sequenceTime",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys.sequenceTime",
    "access": "public",
    "description": "The time allowed between keypresses for a sequence in miliseconds\n<ul><li><code>1500</code> by default.</li></ul>",
    "lineNumber": 816,
    "unknown": [
      {
        "tagName": "@default",
        "tagValue": "1500"
      }
    ],
    "type": {
      "nullable": null,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": null
    },
    "modality": "readonly"
  },
  {
    "__docId__": 2515,
    "kind": "method",
    "name": "_keyComboToCodeString",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Keys.js~Keys#_keyComboToCodeString",
    "access": "private",
    "description": "Convert a combination of keys separated by + into the corresponding code string.",
    "lineNumber": 824,
    "ignore": true,
    "params": [
      {
        "name": "keyCombo",
        "types": [
          "*"
        ]
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2516,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Tracking.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Signature function used to track the usage of Coral components. By default, there is no out of the box\n implementation as tracking is agnostic of the underlying technology.\n\n You need to implement a new tracker and add it with: <code>Coral.tracking.addListener(fn(){ });</code>\n\n The <code>fn()</code> callback will receive multiple arguments:\n * <code>trackData</code> - an object with fixed structure e.g. <code>{type: \"button\", eventType: \"click\", element: \"save settings\", feature: \"sites\"}</code>\n * <code>event</code> - the CustomEvent or MouseEvent details object.\n * <code>component</code> - the component reference object.\n\n Using the above data you can map it to your own analytics tracker.\n */\nclass Tracking {\n  /* @ignore */\n  constructor() {\n    /**\n     All registered trackers.\n\n     @type {Array<Function>}\n     */\n    this._trackers = [];\n  }\n\n  /**\n   Returns <code>true</code> if the tracking is disabled for the given component, otherwise false.\n\n   @param {HTMLElement} component\n   @returns {Boolean}\n   */\n  _isTrackingDisabledForComponent(component) {\n    return component &&\n      typeof component.tracking !== 'undefined' &&\n      component.tracking === component.constructor.tracking.OFF;\n  }\n\n  /**\n   Get tracking annotations from the parent Component to which the event was bound.\n\n   @param {BaseComponent} component\n   @returns {{trackingElement: String, trackingElement: String}}\n   */\n  _getTrackingDataFromComponentAttr(component) {\n    if (this._isTrackingDisabledForComponent(component)) {\n      return {\n        trackingElement: '',\n        trackingFeature: ''\n      };\n    }\n\n    // Eg. from DOM trackingfeature=\"sites\"\n    const trackingFeature = component.trackingFeature || '';\n\n    // Eg. from DOM trackingelement=\"rail toggle\"\n    const trackingElement = component.trackingElement || '';\n\n    return {trackingFeature, trackingElement};\n  }\n\n  /**\n   Returns a tracking data object that can be used to compile data to send to an actual Analytics tracker.\n\n   @param {String} eventType\n   @param {String} targetType\n   @param {CustomEvent} event\n   @param {BaseComponent} component\n   @param {BaseComponent} childComponent\n   @returns {Object} An object with the tracking data.\n   */\n  _createTrackingData(eventType, targetType, event, component, childComponent) {\n    const parentComponentType = (component.getAttribute('is') || component.tagName).toLowerCase();\n\n    // Gather data into the Coral Tracking structure.\n    const trackDataFromAttr = this._getTrackingDataFromComponentAttr(component);\n\n    // Compile data\n    /**\n     The default Coral tracking data object\n     filled with values from root Component and child Component (if exists).\n     @type {{targetType: string, targetElement: string, eventType: string, rootElement: string, rootFeature: string, rootType: string}}\n     */\n    return {\n      targetType: targetType || parentComponentType || '',\n      targetElement: childComponent && childComponent.trackingElement ? childComponent.trackingElement : component.trackingElement,\n      eventType: eventType || event.type,\n      rootElement: trackDataFromAttr.trackingElement,\n      rootFeature: trackDataFromAttr.trackingFeature,\n      rootType: parentComponentType\n    };\n  }\n\n  /**\n   Add a tracking callback. This will be invoked every time a tracking event is emitted.\n\n   @param {TrackingCallback} trackingCallback\n   The callback to execute.\n   */\n  addListener(trackingCallback) {\n    if (typeof trackingCallback !== 'function') {\n      throw new Error('Coral.Tracking: Tracker must be a function callback.');\n    }\n\n    if (this._trackers.indexOf(trackingCallback) !== -1) {\n      throw new Error('Coral.Tracking: Tracker callback cannot be added twice.');\n    }\n\n    this._trackers.push(trackingCallback);\n  }\n\n  /**\n   Removes a tracker.\n\n   @param {TrackingCallback} trackingCallback\n   */\n  removeListener(trackingCallback) {\n    this._trackers = this._trackers.filter(trackerFn => trackerFn !== trackingCallback);\n  }\n\n  /**\n   Notify all trackers subscribed.\n\n   @param {String} eventType\n   Eg. click, select, etc.\n   @param {String} targetType\n   Eg. cycle button, cycle button item, etc.\n   @param {CustomEvent} event\n   @param {BaseComponent} component\n   @param {BaseComponent} childComponent\n   Optional, in case the event occurred on a child component.\n   @returns {Boolean} if the event was dispatch to at least 1 tracker.\n   */\n  track(eventType, targetType, event, component, childComponent) {\n    if (\n      this._trackers.length === 0 ||\n      this._isTrackingDisabledForComponent(component) ||\n      this._isTrackingDisabledForComponent(childComponent)\n    ) {\n      return false;\n    }\n\n    const args = Array.prototype.slice.call(arguments, [2]);\n\n    const trackingData = this._createTrackingData(eventType, targetType, event, component, childComponent);\n    this._trackers.forEach((trackerFn) => {\n      trackerFn.apply(null, [trackingData].concat(args));\n    });\n\n    return true;\n  }\n}\n\n/**\n Executes the callback when ever there is an interaction inside the component that needs to be tracked. This can be used\n to get insight on how users interact with the page and the features that available.\n\n @typedef {function} TrackingCallback\n\n @param {Object} trackData\n Object containing the data to be tracked. It contains the properties <code>type</code>, <code>eventType</code>,\n <code>element</code> and <code>feature</code>.\n @param {CustomEvent} event\n Underlying event that was generated by the user\n @param {HTMLElement} component\n Component that triggered the tracking event.\n */\n/**\n Tracking API to get insight on component usage.\n\n @type {Tracking}\n */\nconst tracking = new Tracking();\nexport default tracking;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Tracking.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2517,
    "kind": "class",
    "name": "Tracking",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Signature function used to track the usage of Coral components. By default, there is no out of the box\nimplementation as tracking is agnostic of the underlying technology.\n\nYou need to implement a new tracker and add it with: <code>Coral.tracking.addListener(fn(){ });</code>\n\nThe <code>fn()</code> callback will receive multiple arguments:\n<code>trackData</code> - an object with fixed structure e.g. <code>{type: \"button\", eventType: \"click\", element: \"save settings\", feature: \"sites\"}</code>\n<code>event</code> - the CustomEvent or MouseEvent details object.\n<code>component</code> - the component reference object.\n\nUsing the above data you can map it to your own analytics tracker.",
    "lineNumber": 26,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2518,
    "kind": "constructor",
    "name": "constructor",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#constructor",
    "access": "public",
    "description": null,
    "lineNumber": 28,
    "undocument": true
  },
  {
    "__docId__": 2519,
    "kind": "member",
    "name": "_trackers",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#_trackers",
    "access": "private",
    "description": "All registered trackers.",
    "lineNumber": 34,
    "type": {
      "nullable": null,
      "types": [
        "Array<Function>"
      ],
      "spread": false,
      "description": null
    },
    "ignore": true
  },
  {
    "__docId__": 2520,
    "kind": "method",
    "name": "_isTrackingDisabledForComponent",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#_isTrackingDisabledForComponent",
    "access": "private",
    "description": "Returns <code>true</code> if the tracking is disabled for the given component, otherwise false.",
    "lineNumber": 43,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "HTMLElement"
        ],
        "spread": false,
        "optional": false,
        "name": "component",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 2521,
    "kind": "method",
    "name": "_getTrackingDataFromComponentAttr",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#_getTrackingDataFromComponentAttr",
    "access": "private",
    "description": "Get tracking annotations from the parent Component to which the event was bound.",
    "lineNumber": 55,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{{trackingElement: String, trackingElement: String}}"
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "component",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "{trackingElement: String, trackingElement: String}"
      ],
      "spread": false,
      "description": ""
    },
    "ignore": true
  },
  {
    "__docId__": 2522,
    "kind": "method",
    "name": "_createTrackingData",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#_createTrackingData",
    "access": "private",
    "description": "Returns a tracking data object that can be used to compile data to send to an actual Analytics tracker.",
    "lineNumber": 82,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Object} An object with the tracking data."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventType",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "targetType",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "CustomEvent"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "component",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "childComponent",
        "description": ""
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Object"
      ],
      "spread": false,
      "description": "An object with the tracking data."
    },
    "ignore": true
  },
  {
    "__docId__": 2523,
    "kind": "method",
    "name": "addListener",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#addListener",
    "access": "public",
    "description": "Add a tracking callback. This will be invoked every time a tracking event is emitted.",
    "lineNumber": 110,
    "params": [
      {
        "nullable": null,
        "types": [
          "TrackingCallback"
        ],
        "spread": false,
        "optional": false,
        "name": "trackingCallback",
        "description": "The callback to execute."
      }
    ],
    "return": null
  },
  {
    "__docId__": 2524,
    "kind": "method",
    "name": "removeListener",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#removeListener",
    "access": "public",
    "description": "Removes a tracker.",
    "lineNumber": 127,
    "params": [
      {
        "nullable": null,
        "types": [
          "TrackingCallback"
        ],
        "spread": false,
        "optional": false,
        "name": "trackingCallback",
        "description": ""
      }
    ],
    "return": null
  },
  {
    "__docId__": 2526,
    "kind": "method",
    "name": "track",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking#track",
    "access": "public",
    "description": "Notify all trackers subscribed.",
    "lineNumber": 144,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} if the event was dispatch to at least 1 tracker."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "eventType",
        "description": "Eg. click, select, etc."
      },
      {
        "nullable": null,
        "types": [
          "String"
        ],
        "spread": false,
        "optional": false,
        "name": "targetType",
        "description": "Eg. cycle button, cycle button item, etc."
      },
      {
        "nullable": null,
        "types": [
          "CustomEvent"
        ],
        "spread": false,
        "optional": false,
        "name": "event",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "component",
        "description": ""
      },
      {
        "nullable": null,
        "types": [
          "BaseComponent"
        ],
        "spread": false,
        "optional": false,
        "name": "childComponent",
        "description": "Optional, in case the event occurred on a child component."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "if the event was dispatch to at least 1 tracker."
    }
  },
  {
    "__docId__": 2527,
    "kind": "variable",
    "name": "tracking",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Tracking.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Tracking.js~tracking",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{tracking}",
    "description": null,
    "lineNumber": 184,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-utils/src/scripts/Tracking.js~Tracking"
      ]
    }
  },
  {
    "__docId__": 2528,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Transformation.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n Set of property value transformation functions.\n */\nclass Transformation {\n  /**\n   Transform the provided value into a boolean. Follows the behavior of JavaScript thruty/falsy.\n\n   @param {*} value\n   The value to convert to Boolean.\n\n   @returns {Boolean} The corresponding boolean value.\n   */\n  boolean(value) {\n    return !!value;\n  }\n\n  /**\n   Transform the provided value into a boolean. Follows the behavior of the HTML specification, in which the existence of\n   the attribute indicates <code>true</code> regardless of the attribute's value. If the value is a boolean, it ignores\n   the transformation.\n\n   @param {*} value\n   The value to convert to Boolean.\n\n   @returns {Boolean} The corresponding boolean value.\n   */\n  booleanAttr(value) {\n    return typeof value === 'boolean' ? value : !(value === null || typeof value === 'undefined');\n  }\n\n  /**\n   Transforms the provided value into a floating point number.\n\n   @param {*} value\n   The value to convert to a Number.\n\n   @returns {?Number} The corresponding number or <code>null</code> if the passed value cannot be converted to a number.\n   */\n  number(value) {\n    value = parseFloat(value);\n    return isNaN(value) ? null : value;\n  }\n\n  /**\n   Transforms the provided value into a floating number. The conversion is strict in the sense that if non numeric values\n   are detected, <code>null</code> is returned instead.\n\n   @param {*} value\n   The value to be converted to a Number.\n\n   @retuns {?Number} The corresponding number or <code>null</code> if the passed value cannot be converted to number.\n   */\n  float(value) {\n    if (/^(-|\\+)?([0-9]+(\\.[0-9]+)?|Infinity)$/.test(value)) {\n      return Number(value);\n    }\n\n    return null;\n  }\n\n  /**\n   Transform the provided value into a string. When given <code>null</code> or <code>undefined</code> it will be\n   converted to an empty string(\"\").\n\n   @param {*} value\n   The value to convert to String.\n\n   @returns {String} The corresponding string value.\n   */\n  string(value) {\n    if (value === null || typeof value === 'undefined') {\n      return '';\n    }\n\n    return typeof value === 'string' ? value : String(value);\n  }\n}\n\n/**\n A type transform utility.\n\n @type {Transformation}\n */\nconst transform = new Transformation();\n\nexport default transform;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Transformation.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2529,
    "kind": "class",
    "name": "Transformation",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Set of property value transformation functions.",
    "lineNumber": 16,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2530,
    "kind": "method",
    "name": "boolean",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation#boolean",
    "access": "public",
    "description": "Transform the provided value into a boolean. Follows the behavior of JavaScript thruty/falsy.",
    "lineNumber": 25,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} The corresponding boolean value."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The value to convert to Boolean."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "The corresponding boolean value."
    }
  },
  {
    "__docId__": 2531,
    "kind": "method",
    "name": "booleanAttr",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation#booleanAttr",
    "access": "public",
    "description": "Transform the provided value into a boolean. Follows the behavior of the HTML specification, in which the existence of\nthe attribute indicates <code>true</code> regardless of the attribute's value. If the value is a boolean, it ignores\nthe transformation.",
    "lineNumber": 39,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} The corresponding boolean value."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The value to convert to Boolean."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "The corresponding boolean value."
    }
  },
  {
    "__docId__": 2532,
    "kind": "method",
    "name": "number",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation#number",
    "access": "public",
    "description": "Transforms the provided value into a floating point number.",
    "lineNumber": 51,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{?Number} The corresponding number or <code>null</code> if the passed value cannot be converted to a number."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The value to convert to a Number."
      }
    ],
    "return": {
      "nullable": true,
      "types": [
        "Number"
      ],
      "spread": false,
      "description": "The corresponding number or <code>null</code> if the passed value cannot be converted to a number."
    }
  },
  {
    "__docId__": 2533,
    "kind": "method",
    "name": "float",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation#float",
    "access": "public",
    "description": "Transforms the provided value into a floating number. The conversion is strict in the sense that if non numeric values\nare detected, <code>null</code> is returned instead.",
    "lineNumber": 65,
    "unknown": [
      {
        "tagName": "@retuns",
        "tagValue": "{?Number} The corresponding number or <code>null</code> if the passed value cannot be converted to number."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The value to be converted to a Number."
      }
    ],
    "return": {
      "types": [
        "*"
      ]
    }
  },
  {
    "__docId__": 2534,
    "kind": "method",
    "name": "string",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation#string",
    "access": "public",
    "description": "Transform the provided value into a string. When given <code>null</code> or <code>undefined</code> it will be\nconverted to an empty string(\"\").",
    "lineNumber": 82,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{String} The corresponding string value."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "value",
        "description": "The value to convert to String."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "String"
      ],
      "spread": false,
      "description": "The corresponding string value."
    }
  },
  {
    "__docId__": 2535,
    "kind": "variable",
    "name": "transform",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Transformation.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Transformation.js~transform",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{transform}",
    "description": null,
    "lineNumber": 98,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-utils/src/scripts/Transformation.js~Transformation"
      ]
    }
  },
  {
    "__docId__": 2536,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Typekit.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport commons from './Commons';\nimport events from './Events';\n\nlet typeKitId = commons && commons.options.typekit;\nif (!typeKitId) {\n  // On pageload, determine to current pages language setting.\n  // If it is english language or unset use the 1st Adobe font web project id (smaller size),\n  // otherwise use the 2nd kit with all the language settings (larger size)\n  typeKitId = document.querySelector('[lang]:not([lang^=\"en\"])') === null ? 'mge7bvf' : 'rok6rmo';\n}\n\nconst config = {\n  kitId: typeKitId,\n  scriptTimeout: 3000,\n  active: () => {\n    events.dispatch('coral-commons:_webfontactive');\n  }\n};\n\nif (!window.Typekit) { // we load the typescript only once\n  const h = document.getElementsByTagName('html')[0];\n  h.classList.add('wf-loading');\n\n  const t = window.setTimeout(() => {\n    h.classList.remove('wf-loading');\n    h.classList.add('wf-inactive');\n  }, config.scriptTimeout);\n\n  const tk = document.createElement('script');\n  let d = false;\n\n  // Always load over https\n  tk.src = `https://use.typekit.net/${config.kitId}.js`;\n  tk.type = 'text/javascript';\n  tk.async = 'true';\n  tk.onload = tk.onreadystatechange = function () {\n    const a = this.readyState;\n    if (d || a && a !== 'complete' && a !== 'loaded') {\n      return;\n    }\n\n    d = true;\n    clearTimeout(t);\n\n    try {\n      window.Typekit.load(config);\n    } catch (b) {\n    }\n  };\n\n  const s = document.getElementsByTagName('script')[0];\n  s.parentNode.insertBefore(tk, s);\n} else {\n  // If Typekit is loaded externally, listen with a MO for active fonts\n  const root = document.documentElement;\n  if (root.className.indexOf('wf-inactive') !== -1 || root.className.indexOf('wf-loading') !== -1) {\n    const webFontLoadObserver = new MutationObserver(() => {\n      if (root.className.indexOf('wf-active') !== -1) {\n        webFontLoadObserver.disconnect();\n        events.dispatch('coral-commons:_webfontactive');\n      }\n    });\n\n    // Watch for class changes\n    webFontLoadObserver.observe(root, {\n      attributes: true,\n      attributeFilter: ['class']\n    });\n  }\n}\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Typekit.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2537,
    "kind": "variable",
    "name": "typeKitId",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Typekit.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Typekit.js~typeKitId",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 16,
    "undocument": true,
    "type": {
      "types": [
        "*"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2538,
    "kind": "variable",
    "name": "config",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Typekit.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Typekit.js~config",
    "access": "public",
    "export": false,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": null,
    "lineNumber": 24,
    "undocument": true,
    "type": {
      "types": [
        "{\"kitId\": *, \"scriptTimeout\": number, \"active\": *}"
      ]
    },
    "ignore": true
  },
  {
    "__docId__": 2539,
    "kind": "file",
    "name": "coral-spectrum/coral-utils/src/scripts/Validation.js",
    "content": "/**\n * Copyright 2019 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport commons from './Commons';\n\n/**\n Set of property value validation functions.\n */\nclass Validation {\n  /**\n   Ensures that the value has changed.\n\n   @param {*} newValue\n   The new value.\n   @param {*} oldValue\n   The existing value.\n\n   @returns {Boolean} <code>true</code> if the values are different.\n   */\n  valueMustChange(newValue, oldValue) {\n    // We can use exact equality here as validation functions are called after transform. Thus, the input value will be\n    // converted to the same type as a stored value\n    return newValue !== oldValue;\n  }\n\n  /**\n   Ensures that the new value is within the enumeration. The enumeration can be given as an array of values or as a\n   key/value Object. Take into consideration that enumerations are case sensitive.\n\n   @example // Enumeration as Array\n   Coral.validate.enumeration(['xs', 's', 'm', 'l']);\n   @example // Enumeration as Object\n   Coral.validate.enumeration({EXTRA_SMALL : 'xs', SMALL : 's', MEDIUM : 'm', LARGE : 'l'});\n   @param {Object} enumeration\n   Object that represents an enum.\n\n   @returns {ValidationFunction}\n   a validation function that ensures that the given value is within the enumeration.\n   */\n  enumeration(enumeration) {\n    // Reverses the enumeration, so that we can check that the variable new value exists inside\n    const enumReversed = commons.swapKeysAndValues(enumeration);\n\n    // Returns a new function that matches the newValue, oldValue signature\n    return (newValue) => typeof enumReversed[newValue] !== 'undefined';\n  }\n}\n\n/**\n Signature of the function used to validate new input. It accepts a newValue and an oldValue which are used to\n determine if the newValue is valid.\n\n @typedef {function} ValidationFunction\n\n @param {*} newValue\n The new value to validate.\n @param {*} oldValue\n The existing value.\n\n @returns {Boolean} <code>true</code> if the validation succeeded, otherwise <code>false</code>.\n */\n\n/**\n A property transform utility.\n\n @type {Validation}\n */\nconst validate = new Validation();\n\nexport default validate;\n",
    "static": true,
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-utils/src/scripts/Validation.js",
    "access": "public",
    "description": null,
    "lineNumber": 1
  },
  {
    "__docId__": 2540,
    "kind": "class",
    "name": "Validation",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Validation.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": null,
    "description": "Set of property value validation functions.",
    "lineNumber": 18,
    "pseudoExport": true,
    "interface": false
  },
  {
    "__docId__": 2541,
    "kind": "method",
    "name": "valueMustChange",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation#valueMustChange",
    "access": "public",
    "description": "Ensures that the value has changed.",
    "lineNumber": 29,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{Boolean} <code>true</code> if the values are different."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "newValue",
        "description": "The new value."
      },
      {
        "nullable": null,
        "types": [
          "*"
        ],
        "spread": false,
        "optional": false,
        "name": "oldValue",
        "description": "The existing value."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "Boolean"
      ],
      "spread": false,
      "description": "<code>true</code> if the values are different."
    }
  },
  {
    "__docId__": 2542,
    "kind": "method",
    "name": "enumeration",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation",
    "generator": false,
    "async": false,
    "static": false,
    "longname": "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation#enumeration",
    "access": "public",
    "description": "Ensures that the new value is within the enumeration. The enumeration can be given as an array of values or as a\nkey/value Object. Take into consideration that enumerations are case sensitive.",
    "examples": [
      "// Enumeration as Array\nCoral.validate.enumeration(['xs', 's', 'm', 'l']);",
      "// Enumeration as Object\nCoral.validate.enumeration({EXTRA_SMALL : 'xs', SMALL : 's', MEDIUM : 'm', LARGE : 'l'});"
    ],
    "lineNumber": 49,
    "unknown": [
      {
        "tagName": "@returns",
        "tagValue": "{ValidationFunction}\na validation function that ensures that the given value is within the enumeration."
      }
    ],
    "params": [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "enumeration",
        "description": "Object that represents an enum."
      }
    ],
    "return": {
      "nullable": null,
      "types": [
        "ValidationFunction"
      ],
      "spread": false,
      "description": "a validation function that ensures that the given value is within the enumeration."
    }
  },
  {
    "__docId__": 2543,
    "kind": "variable",
    "name": "validate",
    "memberof": "coral-spectrum/coral-utils/src/scripts/Validation.js",
    "static": true,
    "longname": "coral-spectrum/coral-utils/src/scripts/Validation.js~validate",
    "access": "public",
    "export": true,
    "importPath": "@adobe/coral-spectrum",
    "importStyle": "{validate}",
    "description": null,
    "lineNumber": 79,
    "undocument": true,
    "type": {
      "types": [
        "coral-spectrum/coral-utils/src/scripts/Validation.js~Validation"
      ]
    }
  },
  {
    "kind": "index",
    "content": "> Checkout [Spectrum Web Components](https://github.com/adobe/spectrum-web-components) which is a future-looking project to develop Adobe Spectrum design language based around web components, ES-Modules, and modern browser standards.\n\n# Coral Spectrum ![Build Status](https://github.com/adobe/coral-spectrum/workflows/Unit%20Tests%20and%20Accessibility%20CI/badge.svg)\n\nA JavaScript library of Web Components following Spectrum design patterns.\n\n# Important\nPlease follow the [Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). To easily comply, it is recommended to use [cz-cli](https://github.com/commitizen/cz-cli).\n\n## Showcase\n\n#### [Component Examples](http://opensource.adobe.com/coral-spectrum/examples)\nTo see all components in action. These are only examples and don't cover all scenarios.\n\n#### [API References](http://opensource.adobe.com/coral-spectrum/documentation/identifiers.html)\nCovers the API for all components including properties, events and more.\n\n#### [Playground](http://opensource.adobe.com/coral-spectrum/playground)\nExperiment and preview code with the latest Coral Spectrum version.\nCode can be shared by copy pasting the URL. The playground is sandboxed to prevent security risks.\n\n## Spectrum\n\nThe current default theme is is an implementation of the [Spectrum](https://spectrum.adobe.com) design\nspecifications, Adobe’s design system. Spectrum provides elements and tools to help product teams work more\nefficiently, and to make Adobe’s applications more cohesive.\n\nCoral Spectrum leverages the [Spectrum CSS](https://github.com/adobe/spectrum-css) framework to style\ncomponents including the [Spectrum SVG icons](https://spectrum.adobe.com/page/icons).\n\n## Angular, React, Vue.js compatibility\n\nOur vision is to create consistent Adobe experiences by providing a complete, easy to use library of HTML components\ncompatible with [major frameworks](https://custom-elements-everywhere.com/).\n\nTo reach the goal, Coral Spectrum derives from [Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) with\n[native support](https://caniuse.com/#feat=custom-elementsv1) thanks to broad collaboration between browser vendors.\nThe use of custom elements gives us the ability to hide many implementation details from the consumer, allowing much\nmore freedom to change the underlying markup that supports those elements.\nThis makes the exposed API smaller and more explicit, resulting in a lower risk of updates to Coral Spectrum needing to\nintroduce breaking changes.\n\n## Browser support\n\nCoral Spectrum is designed to support the following browsers:\n* Chrome (latest)\n* Safari (latest)\n* Firefox (latest)\n* Edge (latest)\n* IE 11\n* iOS 7+\n* Android 4.4+\n\n## Theme (light, dark, lightest, darkest)\n\nThe default Coral Spectrum styles cascade from `coral--light`, `coral--lightest`, `coral--dark` and `coral--darkest` theme, so that class must be specified at a higher level.\n\n```html\n<body class=\"coral--light\">\n    <!-- light theme -->\n    <div class=\"container\"></div>\n    <div class=\"coral--dark\">\n        <!-- dark theme -->\n    </div>\n</body>\n```\n\n## Large scale support\n\nFor mobile, Spectrum has a larger scale that enables larger tap targets on all controls. To enable it, the class `coral--large` must be specified at a higher level.\n\n```html\n<body class=\"coral--light coral--large\">\n   <!-- light theme -->\n   <!-- large scale -->\n</body>\n```\n\n## Built-in Accessibility and Keyboard support\n\nHaving an inaccessible application can mean thousands of dollars of fines if you land a government contract.\nIt also means alienating an entire segment of society by making your application completely unusable to them.\nTo help you avoid this, we’ve made it a rule that every Coral Spectrum component should be accessible.\n\n## Internationalization support\n\nCoral Spectrum provides a robust internal system for internationalization of its strings.\nThis is done via an internal Adobe process.\n\nSupported languages are :\n\nLanguage family | Language tag | Language variant\n--- | --- | ---\nEnglish | en-US | American English\nFrench | fr-FR | Standard French\nGerman | de-DE | Standard German\nItalian | it-IT | Standard Italian\nSpanish | es-ES | Castilian Spanish\nPortuguese | pt-BR | Brazilian Portuguese\nJapanese | ja-JP | Standard Japanese\nKorean | ko-KR | Standard Korean\nChinese | zh-CN | Mainland China, simplified characters\nChinese | zh-TW | Taiwan, traditional characters\nDutch | nl-NL | Netherlands Dutch\nDanish | da-DK | Standard Danish\nFinnish | fi-FI | Standard Finnish\nNorwegian | no-NO | Standard Norwegian\nSwedish | sv-SE | Standard Swedish\nCzech | cs-CZ | Standard Czech\nPolish | pl-PL | Standard Polish\nRussian | ru-RU | Standard Russian\nTurkish | tr-TR | Standard Turkish\n\n## Using Coral Spectrum\n\n### Easiest way via a CDN\n\nThe easiest way to consume Coral Spectrum is to use a CDN e.g. copy these lines into your html file.\n\n```html\n<head>\n  <!-- 4.x.x means latest major 4 version release, adjust version if you need a specific one -->\n  <link rel=\"stylesheet\" href=\"https://unpkg.com/@adobe/coral-spectrum@4.x.x/dist/css/coral.min.css\">\n  <script src=\"https://unpkg.com/@adobe/coral-spectrum@4.x.x/dist/js/coral.min.js\" data-coral-icons-external=\"js\"></script>\n</head>\n<body class=\"coral--light\">\n  <button is=\"coral-button\" icon=\"add\">My Button</button>\n</body>\n```\n\n### Copying the distribution files\n\nYou can download a packaged/published version of `@adobe/coral-spectrum` from npm:\n\n```\nnpm pack @adobe/coral-spectrum\n```\n\nAfter you've unzipped the downloaded package, look for the `dist` folder and :\n* Copy the files from `dist/css`, `dist/js` and `dist/resources` in your project.\n* Reference the files in your page e.g\n\n```html\n<link rel=\"stylesheet\" href=\"css/coral.min.css\">\n<script src=\"js/coral.min.js\"></script>\n```\n\n### Including entire library with a bundler like parcel\n\n`npm install @adobe/coral-spectrum`\n\nthen in your main js, use:\n\n```\nrequire(\"@adobe/coral-spectrum/dist/js/coral.js\");\nrequire(\"@adobe/coral-spectrum/dist/css/coral.css\");\n```\n\n### Including only the components you need\n\nIf your project only requires a few components, you can use a module bundler like [Webpack](https://webpack.js.org/) to only import the components needed.\nBelow is an example of a Webpack config:\n\n```js\nconst path = require('path');\nconst MiniCssExtractPlugin = require('mini-css-extract-plugin');\nconst OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');\n\nmodule.exports = {\n  mode: 'production',\n  devtool: 'source-map',\n  entry: './src/index.js',\n  output: {\n    filename: 'bundle.min.js',\n    path: path.resolve(__dirname, 'dist')\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        use: {\n          loader: 'babel-loader',\n          options: {\n            presets: ['@babel/preset-env']\n          }\n        }\n      },\n      {\n        test: /\\.svg$/,\n        use: [\n          {\n            loader: 'file-loader',\n            options: {\n              name: 'icons/[name].[ext]'\n            },\n          },\n        ]\n      },\n      {\n        test: /\\.css$/,\n        use: [MiniCssExtractPlugin.loader, 'css-loader']\n      }\n    ]\n  },\n  plugins: [\n    new MiniCssExtractPlugin({\n      filename: 'style.min.css'\n    }),\n    new OptimizeCssAssetsPlugin({\n      assetNameRegExp: /style\\.min\\.css$/g,\n      cssProcessor: require('cssnano'),\n      cssProcessorPluginOptions: {\n        preset: ['default', { discardComments: { removeAll: true } }],\n      }\n    })\n  ]\n};\n```\n\nThen in your `index.js` file, you can import and use single components :\n\n```js\n// Import Component\nimport {Button} from '@adobe/coral-spectrum/coral-component-button';\n\nconst button = new Button();\n```\n\nIf icons are not displayed, ensure the path to the styles and icons are set e.g. :\n\n```html\n<link rel=\"stylesheet\" href=\"dist/style.min.css\">\n<script data-coral-icons=\"dist/icons/\" src=\"dist/bundle.min.js\"></script>\n```\n\nIf icons still do not display, you can try setting them to display as inline\nSVGs, instead of external resources. Coral Spectrum will default to external\nresources on browsers other than IE11. Using the previous example, this option\ncan be set with:\n\n```html\n<link rel=\"stylesheet\" href=\"dist/style.min.css\">\n<script data-coral-icons=\"dist/icons/\" data-coral-icons-external=\"off\" src=\"dist/bundle.min.js\"></script>\n```\n\n**Note:** Calendar, Clock and Datepicker components will leverage [moment.js](http://momentjs.com/) if available.\n\n## Contributing\n\nCheck out the [contributing guidelines](https://github.com/adobe/coral-spectrum/blob/master/.github/CONTRIBUTING.md).\n\n### Building and Testing\n\nRun the following commands first :\n```\nnpm install -g gulp-cli\nnpm install\n```\n\nYou can use below tasks to get started:\n* `gulp` to generate the build in the `dist` folder and run the dev server on `localhost:9001` by default.\n* `gulp build` to generate the build in the `dist` folder.\n* `gulp dev` to run the dev server on `localhost:9001` by default.\n* `gulp test` to run the tests. Test reports are in `dist/coverage`.\n* `gulp docs` to build the documentation in `dist/documentation`.\n* `gulp axe` to run the accessibility checks.\n\nEach component can be built independently e.g. `cd coral-component-button && gulp`.\n\n### Releasing\n#### Automatic release:\nMerging the PR to master will trigger an automatic release Github Action. It is important to follow [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). It is recommended to use [cz-cli](https://github.com/commitizen/cz-cli) for easy commits.\nOnly **fix** and **feat** can trigger a release. If you want to skip release [add \\[skip release\\] or \\[release skip\\] to the commit message](https://semantic-release.gitbook.io/semantic-release/support/faq#can-i-exclude-commits-from-the-analysis)\n#### Manual releasing:\nWe are currently releasing this package on `npm`.\n\nBefore we get started, clean up your dependencies with the following command :\n\n```\ngit checkout master\nrm -rf node_modules && npm install\n```\n\nThen run `gulp release`. You'll be asked to bump the version (minor version bump by default). Coral Spectrum is following\n[semantic versioning](https://docs.npmjs.com/about-semantic-versioning) (either patch, minor or major).\n\nThe command will take care of increasing, tagging the version and publishing the package to `npm`.\n\nIf everything went well, run `gulp deploy` to publish the documentation on the `gh-pages` branch else revert the version bump.\n",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/README.md",
    "name": "./README.md",
    "static": true,
    "access": "public"
  },
  {
    "kind": "packageJSON",
    "content": "{\n  \"name\": \"@adobe/coral-spectrum\",\n  \"description\": \"Coral Spectrum is a JavaScript library of Web Components following Spectrum design patterns.\",\n  \"version\": \"4.21.10\",\n  \"homepage\": \"https://github.com/adobe/coral-spectrum#readme\",\n  \"license\": \"Apache-2.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/adobe/coral-spectrum\"\n  },\n  \"author\": {\n    \"name\": \"Stephan Ringel\",\n    \"url\": \"https://github.com/icaraps\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Larry Davis\",\n      \"url\": \"https://github.com/lazd\"\n    },\n    {\n      \"name\": \"Oscar Bolanos\",\n      \"url\": \"https://github.com/joekukish\"\n    },\n    {\n      \"name\": \"Frank Karstens\",\n      \"url\": \"https://github.com/karstens\"\n    },\n    {\n      \"name\": \"Aaron Brownlee\",\n      \"url\": \"https://github.com/misterbrownlee\"\n    }\n  ],\n  \"bugs\": {\n    \"url\": \"https://github.com/adobe/coral-spectrum/issues\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"node scripts/spectrum-css.js\",\n    \"build\": \"gulp build && gulp karma && gulp examples && gulp axe && gulp minify-css && gulp minify-js\",\n    \"playground\": \"cd coral-component-playground && gulp build && cd .. && gulp playground\",\n    \"docs\": \"gulp docs\",\n    \"semantic-release\": \"semantic-release\"\n  },\n  \"dependencies\": {\n    \"@adobe/focus-ring-polyfill\": \"0.1.5\",\n    \"@adobe/spectrum-css\": \"2.18.0\",\n    \"@adobe/vent\": \"1.0.0\",\n    \"@ctrl/tinycolor\": \"^3.3.3\",\n    \"core-js\": \"3.6.4\",\n    \"document-register-element\": \"1.14.3\",\n    \"normalize.css\": \"8.0.1\",\n    \"popper.js\": \"1.16.1\",\n    \"resize-observer-polyfill\": \"1.5.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.10.2\",\n    \"@babel/preset-env\": \"^7.10.2\",\n    \"@semantic-release/changelog\": \"^5.0.1\",\n    \"@semantic-release/git\": \"^9.0.0\",\n    \"@semantic-release/github\": \"^7.0.7\",\n    \"babel-eslint\": \"^10.0.3\",\n    \"browserslist\": \"^4.8.5\",\n    \"chai\": \"^4.0.2\",\n    \"codemirror\": \"^5.52.2\",\n    \"commitizen\": \"^4.2.1\",\n    \"cz-conventional-changelog\": \"^3.3.0\",\n    \"deflate-js\": \"0.2.3\",\n    \"del\": \"^4.1.1\",\n    \"esdoc\": \"^1.0.3\",\n    \"esdoc-accessor-plugin\": \"^1.0.0\",\n    \"esdoc-importpath-plugin\": \"^1.0.1\",\n    \"esdoc-inject-script-plugin\": \"^1.0.0\",\n    \"esdoc-inject-style-plugin\": \"^1.0.0\",\n    \"esdoc-member-plugin\": \"^1.0.0\",\n    \"esdoc-standard-plugin\": \"^1.0.0\",\n    \"eslint-config-standard\": \"^12.0.0\",\n    \"eslint-plugin-babel\": \"^5.3.0\",\n    \"eslint-plugin-import\": \"^2.20.0\",\n    \"eslint-plugin-node\": \"^8.0.1\",\n    \"eslint-plugin-promise\": \"^4.2.1\",\n    \"eslint-plugin-standard\": \"^4.0.1\",\n    \"fancy-log\": \"^1.3.3\",\n    \"fs-extra\": \"^7.0.1\",\n    \"glob-all\": \"^3.2.1\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-axe-webdriver\": \"^3.1.3\",\n    \"gulp-bump\": \"^3.1.3\",\n    \"gulp-clean-css\": \"^4.2.0\",\n    \"gulp-domly\": \"^0.1.0\",\n    \"gulp-eslint\": \"^6.0.0\",\n    \"gulp-gh-pages\": \"^0.6.0-6\",\n    \"gulp-git\": \"^2.10.0\",\n    \"gulp-merge-json\": \"^1.0.0\",\n    \"gulp-modify-file\": \"^1.0.0\",\n    \"gulp-plumber\": \"^1.1.0\",\n    \"gulp-postcss\": \"^8.0.0\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-stylus\": \"^2.6.0\",\n    \"http-server\": \"^0.12.3\",\n    \"inquirer\": \"^6.5.2\",\n    \"karma\": \"^5.0.9\",\n    \"karma-chrome-launcher\": \"^2.2.0\",\n    \"karma-coverage-istanbul-reporter\": \"^2.1.1\",\n    \"karma-firefox-launcher\": \"^1.3.0\",\n    \"karma-html2js-preprocessor\": \"^1.1.0\",\n    \"karma-mocha\": \"^2.0.1\",\n    \"karma-mocha-reporter\": \"^2.2.5\",\n    \"karma-rollup-preprocessor\": \"^7.0.3\",\n    \"karma-sinon-chai\": \"^2.0.2\",\n    \"minimist\": \"^1.2.0\",\n    \"mocha\": \"^7.2.0\",\n    \"moment\": \"^2.24.0\",\n    \"plugin-error\": \"^1.0.1\",\n    \"postcss-css-variables\": \"^0.13.0\",\n    \"postcss-merge-rules\": \"^4.0.3\",\n    \"request\": \"^2.81.0\",\n    \"rollup\": \"^1.29.1\",\n    \"rollup-plugin-babel\": \"^4.3.3\",\n    \"rollup-plugin-commonjs\": \"^9.3.4\",\n    \"rollup-plugin-istanbul\": \"^2.0.1\",\n    \"rollup-plugin-json\": \"^4.0.0\",\n    \"rollup-plugin-node-resolve\": \"^4.2.4\",\n    \"rollup-plugin-postcss\": \"^2.0.4\",\n    \"rollup-plugin-terser\": \"^5.2.0\",\n    \"rollup-pluginutils\": \"^2.8.2\",\n    \"semantic-release\": \"^17.1.1\",\n    \"semver\": \"^6.3.0\",\n    \"sinon\": \"^7.5.0\",\n    \"sinon-chai\": \"^3.4.0\",\n    \"stylus-svg\": \"^1.1.2\",\n    \"through2\": \"^3.0.1\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"./node_modules/cz-conventional-changelog\"\n    }\n  }\n}\n",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/package.json",
    "name": "package.json",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manualIndex",
    "globalIndex": true,
    "content": "# Meet Coral Spectrum\n\nCoral Spectrum is a JavaScript library of Web Components following Spectrum design patterns.\n\n<img class=\"logo\" src=\"./manual/asset/spectrum_illustration_2x.png\">\n\n## Showcase\n\nAll components can be seen in action <a href=\"../examples\" target=\"_blank\">here</a>. These are only examples and \ndon't cover all scenarios. The API documentation can be found in the <a href=\"./identifiers.html\" target=\"_blank\">references</a>.    \nA playground is available <a href=\"../playground\" target=\"_blank\">here</a> to experiment and preview code with the latest Coral Spectrum version.\nCode can be shared by copy pasting the URL. The playground is sandboxed to prevent security risks.\n\n## Spectrum\n\nThe current default theme is is an implementation of the [Spectrum](https://spectrum.adobe.com) design \nspecifications, Adobe’s design system. Spectrum provides elements and tools to help product teams work more \nefficiently, and to make Adobe’s applications more cohesive.\n \nCoral Spectrum leverages the [Spectrum CSS](https://github.com/adobe/spectrum-css) framework to style \ncomponents including the [Spectrum SVG icons](https://spectrum.adobe.com/page/icons). \n\n## Angular, React, Vue.js compatibility\n\nOur vision is to create consistent Adobe experiences by providing a complete, easy to use library of HTML components \ncompatible with [major frameworks](https://custom-elements-everywhere.com/).\n\nTo reach the goal, Coral Spectrum derives from [Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) with \n[native support](https://caniuse.com/#feat=custom-elementsv1) thanks to broad collaboration between browser vendors. \nThe use of custom elements gives us the ability to hide many implementation details from the consumer, allowing much \nmore freedom to change the underlying markup that supports those elements. \nThis makes the exposed API smaller and more explicit, resulting in a lower risk of updates to Coral Spectrum needing to \nintroduce breaking changes.\n\n---\n\n### [» Overview](./manual/overview.html)\nVision and goals\n### [» Manual](./manual/manual.html)\nGet you started. How to consume and build the project\n### [» Upgrade](./manual/upgrade.html)\nHelping you upgrade from CoralUI3\n### [» Styles](./manual/styles.html)\nTheme, public CSS and Typekit\n### [» Architecture](./manual/architecture.html)\nTechnical decisions behind the architecture\n### [» Contribution](./manual/contribution.html)\nOpen development principles\n",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/index.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/index.md",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manualAsset",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/assets",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/assets",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/README.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/README.md",
    "content": "> Checkout [Spectrum Web Components](https://github.com/adobe/spectrum-web-components) which is a future-looking project to develop Adobe Spectrum design language based around web components, ES-Modules, and modern browser standards.\n\n# Coral Spectrum ![Build Status](https://github.com/adobe/coral-spectrum/workflows/Unit%20Tests%20and%20Accessibility%20CI/badge.svg)\n\nA JavaScript library of Web Components following Spectrum design patterns.\n\n# Important\nPlease follow the [Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). To easily comply, it is recommended to use [cz-cli](https://github.com/commitizen/cz-cli).\n\n## Showcase\n\n#### [Component Examples](http://opensource.adobe.com/coral-spectrum/examples)\nTo see all components in action. These are only examples and don't cover all scenarios.\n\n#### [API References](http://opensource.adobe.com/coral-spectrum/documentation/identifiers.html)\nCovers the API for all components including properties, events and more.\n\n#### [Playground](http://opensource.adobe.com/coral-spectrum/playground)\nExperiment and preview code with the latest Coral Spectrum version.\nCode can be shared by copy pasting the URL. The playground is sandboxed to prevent security risks.\n\n## Spectrum\n\nThe current default theme is is an implementation of the [Spectrum](https://spectrum.adobe.com) design\nspecifications, Adobe’s design system. Spectrum provides elements and tools to help product teams work more\nefficiently, and to make Adobe’s applications more cohesive.\n\nCoral Spectrum leverages the [Spectrum CSS](https://github.com/adobe/spectrum-css) framework to style\ncomponents including the [Spectrum SVG icons](https://spectrum.adobe.com/page/icons).\n\n## Angular, React, Vue.js compatibility\n\nOur vision is to create consistent Adobe experiences by providing a complete, easy to use library of HTML components\ncompatible with [major frameworks](https://custom-elements-everywhere.com/).\n\nTo reach the goal, Coral Spectrum derives from [Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) with\n[native support](https://caniuse.com/#feat=custom-elementsv1) thanks to broad collaboration between browser vendors.\nThe use of custom elements gives us the ability to hide many implementation details from the consumer, allowing much\nmore freedom to change the underlying markup that supports those elements.\nThis makes the exposed API smaller and more explicit, resulting in a lower risk of updates to Coral Spectrum needing to\nintroduce breaking changes.\n\n## Browser support\n\nCoral Spectrum is designed to support the following browsers:\n* Chrome (latest)\n* Safari (latest)\n* Firefox (latest)\n* Edge (latest)\n* IE 11\n* iOS 7+\n* Android 4.4+\n\n## Theme (light, dark, lightest, darkest)\n\nThe default Coral Spectrum styles cascade from `coral--light`, `coral--lightest`, `coral--dark` and `coral--darkest` theme, so that class must be specified at a higher level.\n\n```html\n<body class=\"coral--light\">\n    <!-- light theme -->\n    <div class=\"container\"></div>\n    <div class=\"coral--dark\">\n        <!-- dark theme -->\n    </div>\n</body>\n```\n\n## Large scale support\n\nFor mobile, Spectrum has a larger scale that enables larger tap targets on all controls. To enable it, the class `coral--large` must be specified at a higher level.\n\n```html\n<body class=\"coral--light coral--large\">\n   <!-- light theme -->\n   <!-- large scale -->\n</body>\n```\n\n## Built-in Accessibility and Keyboard support\n\nHaving an inaccessible application can mean thousands of dollars of fines if you land a government contract.\nIt also means alienating an entire segment of society by making your application completely unusable to them.\nTo help you avoid this, we’ve made it a rule that every Coral Spectrum component should be accessible.\n\n## Internationalization support\n\nCoral Spectrum provides a robust internal system for internationalization of its strings.\nThis is done via an internal Adobe process.\n\nSupported languages are :\n\nLanguage family | Language tag | Language variant\n--- | --- | ---\nEnglish | en-US | American English\nFrench | fr-FR | Standard French\nGerman | de-DE | Standard German\nItalian | it-IT | Standard Italian\nSpanish | es-ES | Castilian Spanish\nPortuguese | pt-BR | Brazilian Portuguese\nJapanese | ja-JP | Standard Japanese\nKorean | ko-KR | Standard Korean\nChinese | zh-CN | Mainland China, simplified characters\nChinese | zh-TW | Taiwan, traditional characters\nDutch | nl-NL | Netherlands Dutch\nDanish | da-DK | Standard Danish\nFinnish | fi-FI | Standard Finnish\nNorwegian | no-NO | Standard Norwegian\nSwedish | sv-SE | Standard Swedish\nCzech | cs-CZ | Standard Czech\nPolish | pl-PL | Standard Polish\nRussian | ru-RU | Standard Russian\nTurkish | tr-TR | Standard Turkish\n\n## Using Coral Spectrum\n\n### Easiest way via a CDN\n\nThe easiest way to consume Coral Spectrum is to use a CDN e.g. copy these lines into your html file.\n\n```html\n<head>\n  <!-- 4.x.x means latest major 4 version release, adjust version if you need a specific one -->\n  <link rel=\"stylesheet\" href=\"https://unpkg.com/@adobe/coral-spectrum@4.x.x/dist/css/coral.min.css\">\n  <script src=\"https://unpkg.com/@adobe/coral-spectrum@4.x.x/dist/js/coral.min.js\" data-coral-icons-external=\"js\"></script>\n</head>\n<body class=\"coral--light\">\n  <button is=\"coral-button\" icon=\"add\">My Button</button>\n</body>\n```\n\n### Copying the distribution files\n\nYou can download a packaged/published version of `@adobe/coral-spectrum` from npm:\n\n```\nnpm pack @adobe/coral-spectrum\n```\n\nAfter you've unzipped the downloaded package, look for the `dist` folder and :\n* Copy the files from `dist/css`, `dist/js` and `dist/resources` in your project.\n* Reference the files in your page e.g\n\n```html\n<link rel=\"stylesheet\" href=\"css/coral.min.css\">\n<script src=\"js/coral.min.js\"></script>\n```\n\n### Including entire library with a bundler like parcel\n\n`npm install @adobe/coral-spectrum`\n\nthen in your main js, use:\n\n```\nrequire(\"@adobe/coral-spectrum/dist/js/coral.js\");\nrequire(\"@adobe/coral-spectrum/dist/css/coral.css\");\n```\n\n### Including only the components you need\n\nIf your project only requires a few components, you can use a module bundler like [Webpack](https://webpack.js.org/) to only import the components needed.\nBelow is an example of a Webpack config:\n\n```js\nconst path = require('path');\nconst MiniCssExtractPlugin = require('mini-css-extract-plugin');\nconst OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');\n\nmodule.exports = {\n  mode: 'production',\n  devtool: 'source-map',\n  entry: './src/index.js',\n  output: {\n    filename: 'bundle.min.js',\n    path: path.resolve(__dirname, 'dist')\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        use: {\n          loader: 'babel-loader',\n          options: {\n            presets: ['@babel/preset-env']\n          }\n        }\n      },\n      {\n        test: /\\.svg$/,\n        use: [\n          {\n            loader: 'file-loader',\n            options: {\n              name: 'icons/[name].[ext]'\n            },\n          },\n        ]\n      },\n      {\n        test: /\\.css$/,\n        use: [MiniCssExtractPlugin.loader, 'css-loader']\n      }\n    ]\n  },\n  plugins: [\n    new MiniCssExtractPlugin({\n      filename: 'style.min.css'\n    }),\n    new OptimizeCssAssetsPlugin({\n      assetNameRegExp: /style\\.min\\.css$/g,\n      cssProcessor: require('cssnano'),\n      cssProcessorPluginOptions: {\n        preset: ['default', { discardComments: { removeAll: true } }],\n      }\n    })\n  ]\n};\n```\n\nThen in your `index.js` file, you can import and use single components :\n\n```js\n// Import Component\nimport {Button} from '@adobe/coral-spectrum/coral-component-button';\n\nconst button = new Button();\n```\n\nIf icons are not displayed, ensure the path to the styles and icons are set e.g. :\n\n```html\n<link rel=\"stylesheet\" href=\"dist/style.min.css\">\n<script data-coral-icons=\"dist/icons/\" src=\"dist/bundle.min.js\"></script>\n```\n\nIf icons still do not display, you can try setting them to display as inline\nSVGs, instead of external resources. Coral Spectrum will default to external\nresources on browsers other than IE11. Using the previous example, this option\ncan be set with:\n\n```html\n<link rel=\"stylesheet\" href=\"dist/style.min.css\">\n<script data-coral-icons=\"dist/icons/\" data-coral-icons-external=\"off\" src=\"dist/bundle.min.js\"></script>\n```\n\n**Note:** Calendar, Clock and Datepicker components will leverage [moment.js](http://momentjs.com/) if available.\n\n## Contributing\n\nCheck out the [contributing guidelines](https://github.com/adobe/coral-spectrum/blob/master/.github/CONTRIBUTING.md).\n\n### Building and Testing\n\nRun the following commands first :\n```\nnpm install -g gulp-cli\nnpm install\n```\n\nYou can use below tasks to get started:\n* `gulp` to generate the build in the `dist` folder and run the dev server on `localhost:9001` by default.\n* `gulp build` to generate the build in the `dist` folder.\n* `gulp dev` to run the dev server on `localhost:9001` by default.\n* `gulp test` to run the tests. Test reports are in `dist/coverage`.\n* `gulp docs` to build the documentation in `dist/documentation`.\n* `gulp axe` to run the accessibility checks.\n\nEach component can be built independently e.g. `cd coral-component-button && gulp`.\n\n### Releasing\n#### Automatic release:\nMerging the PR to master will trigger an automatic release Github Action. It is important to follow [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). It is recommended to use [cz-cli](https://github.com/commitizen/cz-cli) for easy commits.\nOnly **fix** and **feat** can trigger a release. If you want to skip release [add \\[skip release\\] or \\[release skip\\] to the commit message](https://semantic-release.gitbook.io/semantic-release/support/faq#can-i-exclude-commits-from-the-analysis)\n#### Manual releasing:\nWe are currently releasing this package on `npm`.\n\nBefore we get started, clean up your dependencies with the following command :\n\n```\ngit checkout master\nrm -rf node_modules && npm install\n```\n\nThen run `gulp release`. You'll be asked to bump the version (minor version bump by default). Coral Spectrum is following\n[semantic versioning](https://docs.npmjs.com/about-semantic-versioning) (either patch, minor or major).\n\nThe command will take care of increasing, tagging the version and publishing the package to `npm`.\n\nIf everything went well, run `gulp deploy` to publish the documentation on the `gh-pages` branch else revert the version bump.\n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/overview.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/overview.md",
    "content": "# Overview\n\n## Introduction\n\nCoral Spectrum has roots as an internal Open Development project, with core volunteers working on this problem since 2012. \nAs of 2016, the effort has become part of the One Adobe & Cloud Platform effort, which means building a full Coral Spectrum \nteam that includes Exec Leadership, PgM, PM, EM, Dev, and QE members. Coral Spectrum is also becoming a One Adobe Technical \nStandard, meaning it will be used as the default platform for web projects.\n\n## Unified Experience\n\nOur vision is to create consistent Adobe experiences by providing a complete, easy to use library of HTML components. \nStandardization on Coral Spectrum allows teams to reduce code duplication and variation and encourages company wide collaboration. \nThis reduction in effort means teams can focus on meeting customer needs, not reinventing the wheel. Use of Coral Spectrum also \nenables easy, unified design updates, and provides a library that is under Adobe’s full control.\n\n## Enhanced API\n\nCoral Spectrum's components are essentially extended DOM elements. We enhance the existing API with additional functionality, \nas well as providing some patterns that aren't available with native HTML alone. Since we expose a JavaScript API that’s \nbased on the native DOM API and has all of the same methods as any other HTML element instance, anyone familiar with the \nDOM already knows most of the API works. \n\nMost API is available via markup, so don’t have to write JavaScript for most basic uses. All you have to do is write \nthe markup for a component, just like you would a normal HTML element.\n\n## Future Thinking\n\nCoral Spectrum is pushing the web forward by leveraging the [Web Components](https://www.webcomponents.org/introduction) specification. \nHowever, given the landscape of browser implementation and the state of the polyfill ecosystem, we decided to only implement \n[Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) at this time.\n\nA strong advantage Coral Spectrum derives from custom elements is the ability to hide many implementation details from the consumer. \nMore to the point, we found that designs become closely tied to their markup. The use of custom elements allows much more \nfreedom to change the underlying markup that supports those elements. This makes the exposed API smaller and more explicit, \nresulting in a lower risk of updates to Coral Spectrum needing to introduce breaking changes.\n\nIn addition, every Coral component is an HTML element. This give us the ability to create components from markup or JavaScript \nand lets us treat them like any other native element, setting properties, appending them in the DOM, etc. \n\n## Spectrum\n\nThe current default theme is is an implementation of the [Spectrum](https://spectrum.adobe.com) design specifications, Adobe’s design system.\nSpectrum provides elements and tools to help product teams work more efficiently, and to make Adobe’s applications more cohesive.\n\nCoral Spectrum leverages the [Spectrum CSS](https://github.com/adobe/spectrum-css) framework to style \ncomponents including the [Spectrum SVG icons](https://spectrum.adobe.com/page/icons).   \n\n## Built-in Accessibility and Keyboard support \n\nHaving an inaccessible application can mean thousands of dollars of fines if you land a government contract. \nIt also means alienating an entire segment of society by making your application completely unusable to them. \nTo help you avoid this, we’ve made it a rule that every Coral Spectrum component should be accessible. We’ve also built a few \nthings into Coral Spectrum to make implementing accessibility easier for component authors and consumers alike.\n \n## Internationalization support\n \nCoral Spectrum provides a robust internal system for internationalization of its strings. \nThis is done via an internal Adobe process.\n \nSupported languages are :\n\nLanguage family | Language tag | Language variant\n--- | --- | ---\nEnglish | en-US | American English\nFrench | fr-FR | Standard French\nGerman | de-DE | Standard German\nItalian | it-IT | Standard Italian\nSpanish | es-ES | Castilian Spanish\nPortuguese | pt-BR | Brazilian Portuguese\nJapanese | ja-JP | Standard Japanese\nKorean | ko-KR | Standard Korean\nChinese | zh-CN | Mainland China, simplified characters\nChinese | zh-TW | Taiwan, traditional characters\nDutch | nl-NL | Netherlands Dutch\nDanish | da-DK | Standard Danish\nFinnish | fi-FI | Standard Finnish\nNorwegian | no-NO | Standard Norwegian\nSwedish | sv-SE | Standard Swedish\nCzech | cs-CZ | Standard Czech\nPolish | pl-PL | Standard Polish\nRussian | ru-RU | Standard Russian\nTurkish | tr-TR | Standard Turkish\n\n## Browser Support\n\nCoral Spectrum is designed to support the following browsers:\n* Chrome (latest)\n* Safari (latest)\n* Firefox (latest)\n* Edge (latest)\n* IE 11\n* iOS 7+\n* Android 4.4+\n\n## Backwards Compatibility\n\nCoral Spectrum ships by default a compatibility package to support the CoralUI 3.x way to register elements `Coral.register`. \nCustom Coral components using Custom Elements v0 are therefore still supported although we highly encourage to migrate \nto Custom Elements v1 as it'll become the Web standard. \n\n\n\n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/manual.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/manual.md",
    "content": "# Manual\n\n## Using Coral Spectrum\n\n### Easiest way via a CDN\n\nThe easiest way to consume Coral Spectrum is to use a CDN e.g. copy these lines into your html file. \n\n```\n<head>\n  <!-- Adjust version accordingly -->\n  <link rel=\"stylesheet\" href=\"https://unpkg.com/@adobe/coral-spectrum@4.5.0/dist/css/coral.min.css\">\n  <script src=\"https://unpkg.com/@adobe/coral-spectrum@4.5.0/dist/js/coral.min.js\" data-coral-icons-external=\"js\"></script>\n</head>\n<body class=\"coral--light\">\n  <button is=\"coral-button\" icon=\"add\">My Button</button>\n</body> \n``` \n\n### Copying the distribution files\n\nYou can also download the distribution package of the \nlatest release by running `npm i @adobe/coral-spectrum`. It includes all components and styles.\n \nAfter you've unzipped the package, look for the `dist` folder and :\n* Copy the files from `dist/css`, `dist/js` and `dist/resources` in your project.\n* Reference the files in your page with :\n```\n<link rel=\"stylesheet\" href=\"css/coral.min.css\">\n<script src=\"js/coral.min.js\"></script>\n```\n\n### Using a bundler like Webpack\n  \nIf your project only requires a few components, you can use a module bundler like [Webpack](https://webpack.js.org/) to only import the components needed. \nBelow is an example of a Webpack config:\n\n```\nconst path = require('path');\nconst MiniCssExtractPlugin = require('mini-css-extract-plugin');\nconst OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');\n\nmodule.exports = {\n  mode: 'production',\n  devtool: 'source-map',\n  entry: './src/index.js',\n  output: {\n    filename: 'bundle.min.js',\n    path: path.resolve(__dirname, 'dist')\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        use: {\n          loader: 'babel-loader',\n          options: {\n            presets: ['@babel/preset-env']\n          }\n        }\n      },\n      {\n        test: /\\.svg$/,\n        use: [\n          {\n            loader: 'file-loader',\n            options: {\n              name: 'icons/[name].[ext]'\n            },\n          },\n        ]\n      },\n      {\n        test: /\\.css$/,\n        use: [MiniCssExtractPlugin.loader, 'css-loader']\n      }\n    ]\n  },\n  plugins: [\n    new MiniCssExtractPlugin({\n      filename: 'style.min.css'\n    }),\n    new OptimizeCssAssetsPlugin({\n      assetNameRegExp: /style\\.min\\.css$/g,\n      cssProcessor: require('cssnano'),\n      cssProcessorPluginOptions: {\n        preset: ['default', { discardComments: { removeAll: true } }],\n      }\n    })\n  ]\n};  \n```\n\nThen in your `index.js` file, you can import and use single components :\n \n```\n// Import Component\nimport {Button} from '@adobe/coral-spectrum/coral-component-button';\n\nconst button = new Button();\n```\n\nIf icons are not displayed, ensure the path to the styles and icons are set e.g. :\n\n```\n<link rel=\"stylesheet\" href=\"dist/style.min.css\">\n<script data-coral-icons=\"dist/icons/\" src=\"dist/bundle.min.js\"></script>\n```\n\n**Note:** Calendar, Clock and Datepicker components will leverage [moment.js](http://momentjs.com/) if available.\n\n## Building and Testing\n\nRun the following commands first :\n```\nnpm install -g gulp-cli\nnpm install\n```   \n \nYou can use below tasks to get started:\n* `gulp` to generate the build in the `dist` folder and run the dev server on `localhost:9001` by default.\n* `gulp build` to generate the build in the `dist` folder.\n* `gulp dev` to run the dev server on `localhost:9001` by default. \n* `gulp test` to run the tests. Test reports are in `dist/coverage`.\n* `gulp docs` to build the documentation in `dist/documentation`. \n* `gulp axe` to run the accessibility checks.\n\nEach component can be built independently e.g. `cd coral-component-button && gulp`.\n\n## Releasing\n\nWe are currently releasing this package on `npm`.\n\nBefore we get started, clean up your dependencies with the following command :\n\n```\ngit checkout master\nrm -rf node_modules && npm install\n```\n\nThen run `gulp release`. You'll be asked to bump the version (minor version bump by default). Coral Spectrum is following\n[semantic versioning](https://docs.npmjs.com/about-semantic-versioning) (either patch, minor or major).\n\nThe command will take care of increasing, tagging the version and publishing the package to `npm`.     \n\nIf everything went well, run `gulp deploy` to publish the documentation on the `gh-pages` branch else revert the version bump.\n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/upgrade.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/upgrade.md",
    "content": "# Upgrade  \n\n## From CoralUI3 to Coral Spectrum\n\n### Custom Elements v1\n\nCoralUI 3.x relies on Custom Elements v0 which is an outdated spec which won't be implemented natively in major browsers while \nCoral Spectrum derives from [Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) with \n[native support](https://caniuse.com/#feat=custom-elementsv1) thanks to broad collaboration between browser vendors. \nThe use of custom elements gives us the ability to hide many implementation details from the consumer, allowing much \nmore freedom to change the underlying markup that supports those elements. \nThis makes the exposed API smaller and more explicit, resulting in a lower risk of updates to Coral Spectrum needing to \nintroduce breaking changes.\n\n### Spectrum\n\nThe current default theme is is an implementation of the [Spectrum](https://spectrum.adobe.com) design \nspecifications, Adobe’s design system. Spectrum provides elements and tools to help product teams work more \nefficiently, and to make Adobe’s applications more cohesive.\n\nFrom the Adobe Design perspective, there's a long standing directive which prohibits AD to design any New Product \nusing anything less than the latest Spectrum theme. The concern in the Design Org is so high that there is an actual \nlive form where AD is asked to enter products in order to be evaluated for Spectrum Theme Compliance. \nNeedless to say, the Spectrum Theme is the only theme currently being supported and updated, with designers from all EC \ncontributing to its features.\n \nCoral Spectrum leverages the [Spectrum CSS](https://github.com/adobe/spectrum-css) framework to style \ncomponents including the [Spectrum SVG icons](https://spectrum.adobe.com/page/icons).\n\n### Performance\n\nCoralUI3 components are upgraded asynchronously due to limitation of Custom Elements v0. Custom Elements v1 are upgraded synchronously \nif the definition is loaded before any usage of the component. \n\nEssentially this means that users will be able to view the components rendered faster when the page loads with Coral Spectrum than with CoralUI3. \nCode-wise, it means that `Coral.commons.ready()` becomes obsolete in most cases.\n\nOn the other hand, all Coral Spectrum parent-child components are using asynchronous Mutation Observers replacing the \nslow and synchronous events `coral-component:attached` and `coral-component:detached`.\n\nAlso, new technologies were introduced to take advantage of browsers new capabilities to reduce performance issues for \ncertain components (e.g resizeListenerObserver for Coral.ActionBar). \n\nThe performance boost is visible by the test execution time:  \n\n*CoralUI 3 UTs results*\n\n```\nHeadlessChrome 70.0.3538 (Mac OS X 10.13.6): 3516 tests executed (2 mins 28.947 secs / 1 min 43.192 secs)\nFirefox 63.0.0 (Mac OS X 10.13.0): 3516 tests executed (2 mins 14.507 secs / 1 min 35.82 secs)\n```\n\n*Coral Spectrum UTs results (contains more tests due to full clone node support but still performs faster)*\n\n```\nHeadlessChrome 70.0.3538 (Mac OS X 10.13.6): 4481 tests executed (49.697 secs / 30.759 secs)\nFirefox 63.0.0 (Mac OS X 10.13.0): Executed 4481 tests executed (1 min 1.791 secs / 36.38 secs)\n```\n\n### Overlay mechanism\n\nCoralUI3's positioning system for overlays was based on jQueryUI which is known to have limited functionality compared \nto today's existing solutions. Replacing it by a modern solution (PopperJS) has proven that it can solve common \noverlay/positioning issues previously occurring with CoralUI3.\n\n## Upgrade changes\n\n### Custom Elements v1 \n\nA major change in v1 is that component initialization is now done in an ES6 class constructor. The list of \n[Requirements for custom element constructors](http://w3c.github.io/webcomponents/spec/custom/#custom-element-conformance) \nprohibits a new component from setting attributes or adding child nodes in its constructor. \n \n**Let's have a look at a concrete example**\n \nWith 3.x you could do following: \n```\nvar alert = new Coral.Alert();\nvar header = alert.querySelector('coral-alert-header');\nheader.textContent = 'Info';\n```\n \nWith Coral Spectrum and Custom Elements v1, this is not possible anymore since the tag is empty when created. You'll have\nto use the JavaScript API provided by the component instead.\n\n```\nvar alert = new Coral.Alert();\nvar header = alert.header; // Use the JS API to access the content zone\nheader.textContent = 'Info';\n```\n\n### Spectrum  \n \nDue to the new Spectrum design, some components were updated to accommodate design pattern changes:\n \n#### Selection pattern for Table, ColumnView and Masonry\n \nThe concept of selectable thumbnails for Table and ColumnView was replaced with checkboxes. Masonry still supports the old\nway of selection since Card selection via checkbox was not implemented yet. \n \n#### SVG Icons\n\nCoral Spectrum ships SVG icons that need to be loaded first before being displayed. \nThere are several ways to load the icons: \n* Reuse the same file structure as in the `dist` folder with `css/coral.css`, `js/coral.js` and `resources/*.svg`.   \n* Add `data-coral-icons=\"PATH_TO_RESOURCES_FOLDER\"` to the `<script>` loading Coral Spectrum. See [options](../class/coral-spectrum/coral-utils/src/scripts/Commons.js~Commons.html#instance-member-options) for details.\n* Use [Coral.Icon#load](../class/coral-spectrum/coral-component-icon/src/scripts/Icon.js~Icon.html#static-method-load) to load the icon set on demand.\n\n#### Unsupported styles \n\nSome components e.g Wait lost their variants due to the Spectrum update. For compatibility reasons, the APIs were left\nuntouched but will fallback to default supported options.   \n   \nBelow the full list of unsupported options: \n\nComponent | Property | Value\n--- | --- | ---\nAccordion | `variant` | `QUIET`, `LARGE`\nAlert | `size` | `LARGE`\nAnchorButton | `size` | `LARGE`\nAutocomplete | `icon` |\nButton | `size` | `LARGE`\nPopover | `icon` |\nProgress | `size` | `LARGE`\nProgress | `labelPosition` | `BOTTOM`\nSearch | `icon` |\nSlider | `vertical` | \nSlider | `tooltips` |\nTable | `variant` | `LIST`\nTag | `color` | `LIGHT_BLUE`, `PERIWINKLE`, `CYAN`, `PLUM`, `FUCHSIA`, `MAGENTA`, `TANGERINE`, `YELLOW`, `CHARTREUSE`, `KELLY_GREEN`, `SEA_FOAM`\nTooltip | `variant` | `WARNING`\nTooltip | `variant` | `INSPECT`\nWait | `variant` | `DOTS`\n\n#### Internal private markup and classes\n\nDue to the Spectrum CSS update, the internals of components changed e.g classes \nor internal markup is different.\n\nFor instance the example below will produce a different result in Coral Spectrum compared to CoralUI3:  \n```\n<button is=\"coral-button\" icon=\"add\">Button</button>\n```  \n\n*produces in CoralUI3*\n\n``` \n<button is=\"coral-button\" icon=\"add\" class=\"coral3-Button coral3-Button--secondary\" size=\"M\" variant=\"secondary\">\n    <coral-icon class=\"coral3-Icon coral3-Icon--sizeS coral3-Icon--add\" icon=\"add\" size=\"S\" alt=\"\"></coral-icon>\n    <coral-button-label>Button</coral-button-label>\n</button>\n```\n\n*produces in Coral Spectrum*\n\n```\n<button is=\"coral-button\" icon=\"add\" variant=\"default\" class=\"_coral-Button _coral-Button--primary\" size=\"M\">\n  <coral-icon size=\"S\" class=\"_coral-Icon--sizeS _coral-Icon\" icon=\"add\" alt=\"\">\n    <svg focusable=\"false\" aria-hidden=\"true\" class=\"_coral-Icon--svg _coral-Icon\">\n      <use xlink:href=\"#spectrum-icon-18-Add\"></use>\n    </svg>\n  </coral-icon>\n  <coral-button-label>Button</coral-button-label>\n</button>\n```\n\n### Parent-child component events\n\nCoral Spectrum parent-child components are relying on Mutation Observers for child mutation detection (ie. child node addition/removal).\nMutation Observers are asynchronous therefore parent-child component events triggered on child mutation are triggered asynchronously e.g. :\n\n```\nvar cyclebutton = document.body.appendChild(new Coral.CycleButton());\ncyclebutton.items.add({selected: true})\ndocument.body.addEventListener('coral-cyclebutton:change', function() {\n  // This will be called in the next frame although it was registered after. This might be unexpected and confusing.\n});\n\n// In above situation, it's recommended to add the child component in a first step and append the parent component to the DOM in a second step\nvar cyclebutton = new Coral.CycleButton();\ncyclebutton.items.add({selected: true});\ndocument.body.appendChild(cyclebutton);\ndocument.body.addEventListener('coral-cyclebutton:change', function() {\n  // This won't be called in the next frame because the event is silenced on purpose     \n});\n```\n\n### Dependencies\n\nCoral Spectrum has a few dependencies and polyfills. Some are actually written and maintained by the Coral Spectrum team, and are included \nwithout being considered an external dependency.\n\nThese dependencies are:\n* [Spectrum CSS](https://github.com/adobe/spectrum-css) for the Spectrum theme and icons\n* [Custom Elements v1 polyfill](https://github.com/webcomponents/custom-elements/) with built-in components support\n* [Promise polyfill](https://www.npmjs.com/package/promise-polyfill) for IE11 support\n* [CustomEvent polyfill](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill) for IE11 support\n* [ResizeObserver polyfill](https://github.com/que-etc/resize-observer-polyfill) to detect element size changes\n* Element `closest(), matches(), remove() and classList` polyfills for IE11 support\n* [DOMly](https://github.com/lazd/domly) to render HTML templates\n* [Vent](https://github.com/adobe/vent) for DOM event delegation\n* [PopperJS](https://popper.js.org/) to manage poppers\n* [Typekit](https://typekit.com/) to load Adobe Clean fonts\n\n**Note:** Calendar, Clock and Datepicker components will leverage [moment.js](http://momentjs.com/) if loaded on the page. \n\n### API changes\n\n* `window.CustomElements` is removed, `use window.customElements` instead.\n* `Coral.mixins.*` is removed.\n* `coral-component:attached` is removed.\n* `coral-component:detached` is removed.\n* `alignMy` and `alignAt` are deprecated, use `placement` instead.\n\n## Compatibility with CoralUI3\n\n### Coral.register\n\nCoral Spectrum ships by default a compatibility package to support the 3.x way to register elements `Coral.register`.\nUnfortunately, components registered with `Coral.register` can't extend Coral components e.g :\n```\nCoral.register({\n    name: 'Element',\n    namespace: 'X',\n    tagName: 'x-element',\n    extend: Coral.Alert\n});\n```\nwill not extend `Coral.Alert`. In general, it's not recommended to extend Coral components.\n\nYou can still extend other components defined via `Coral.register`:\n ```\nCoral.register({\n    name: 'Alert',\n    namespace: X,\n    tagName: 'x-alert'\n});\n Coral.register({\n    name: 'Element',\n    namespace: X,\n    tagName: 'x-element',\n    extend: X.Alert\n});\n```\nIdeally, you should not use `Coral.register` to define Custom Elements. The recommended approach is to use the native ES6 \nbehavior : \n ```\nclass Alert extends HTMLElement {}\n// Set Alert on the X namespace \nX.Alert = Alert;\n// Define the custom element\ncustomElements.define('x-alert', X.Alert);\n\nclass Element extends Alert {}\nX.Element = Element;\ncustomElements.define('x-element', X.Element);\n ```\n \n### Coral.commons.ready\nAgain, the recommended approach is to use the native behavior :\n \n```\nwindow.customElements.whenDefined('x-element', callback);\n ``` \n **Caution**: not every Coral components is a Custom Element, some components are simple lightweight tags. They are used \nfor content zones and are referenced as <code>Function</code> in the documentation. \n\n### Off-line Custom Elements v0 creation\n \nAnother caveat is the creation of Custom Elements v0 via `innerHTML`. This is natively not supported. The compatibility\npackage provides a helper script to support this use case :\n \n```\ndocument.registerElement(\"x-element\", {\n  prototype: Prototype\n});\n    \nd = document.createElement('div');\nd.innerHTML = '<x-element></x-element>'; \n // The component is not initialized above. The workaround is to use the helper script instead as below : \ndocument.registerElement.innerHTML(d, '<x-element></x-element>'); \n``` \n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/styles.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/styles.md",
    "content": "# Styles\n\n## Theme (light, dark, lightest, darkest)\n\nThe default Coral Spectrum styles cascade from `coral--light`, `coral--lightest`, `coral--dark` and `coral--darkest` theme, so that class must be specified at a higher level.\n\n```\n<body class=\"coral--light\">\n    <!-- light theme -->\n    <div class=\"container\"></div>\n    <div class=\"coral--dark\">\n        <!-- dark theme -->\n    </div>\n</body>\n```\n\n## Large scale support\n\nFor mobile, Spectrum has a larger scale that enables larger tap targets on all controls. To enable it, the class `coral--large` must be specified at a higher level.\n\n```\n<body class=\"coral--light coral--large\">\n   <!-- light theme -->\n   <!-- large scale -->\n</body>\n```\n\n## CSS utility classes\n\nCoral Spectrum provides some CSS utility classes that can be applied to any DOM element. \n\n### u-coral-clearFix\n\nApplies the clearfix hack.\n\n### u-coral-noBorder\n\nRemoves all the borders of an element.\n\n### u-coral-noScroll\n\nStops an element from scrolling.\n\n### u-coral-screenReaderOnly\n\nHides elements from visual browsers.\n\n### u-coral-closedHand\n\nA closed hand cursor that indicates an item is current grabbed.\n\n### u-coral-openHand\n\nAn open hand cursor to indicate that an item can be grabbed.\n\n### u-coral-pullLeft\n\nFloats the content to the left.\n\n### u-coral-pullRight\n\nFloats the content to the right.\n\n### u-coral-padding\n\nAdds the default padding on all sides.\n\n### u-coral-padding-horizontal\n\nAdds the default padding to left and right.\n\n### u-coral-padding-vertical\n\nAdds the default padding to top and bottom.\n\n### u-coral-margin\n\nAdds the default the margin on all sides.\n\n### u-coral-noPadding\n\nRemoves the padding on all sides.\n\n### u-coral-noPadding-horizontal\n\nRemoves the padding on the left and right side.\n\n### u-coral-noPadding-vertical\n\nRemoves the padding on the top and bottom side.\n\n### u-coral-noMargin\n\nRemoves the margin on all sides.\n\n### u-coral-ellipsis\n\nPrevent text from wrapping, use an ellipsis to truncate.\n\n### u-coral-visibleXS | u-coral-hiddenXS \n\nExtra small device.\n\n### u-coral-visibleS | u-coral-hiddenS\n\nSmall device.\n\n### u-coral-visibleM | u-coral-hiddenM\n\nMedium device.\n\n### u-coral-visibleL | u-coral-hiddenL\n\nLarge device.\n\n### u-coral-visibleXL | u-coral-hiddenXL\n\nExtra large device.\n\n### u-coral-visibleXXL | u-coral-hiddenXXL\n\nAbove extra large device.\n\n## Fonts via Typekit\n\nCoral Spectrum uses Typekit to securely deliver the Adobe Clean corporate font.\n\n### Domains\n\nIt comes pre-configured with a kit that is limited to certain domains including :\n\n* localhost\n* 127.0.0.1\n* 0.0.0.0\n* *.adobe.com\n\nIf you are using Coral Spectrum on a server on a domain other than these, you will need to request and configure your own Typekit kit. \nReach out to the Typekit team on https://fonts.adobe.com/.\n\n### Using a Custom Kit with Coral Spectrum\n\nInclude your Typekit ID as a Coral Spectrum option e.g. :\n\n```\n<script src=\"js/coral.min.js\" data-coral-typekit=\"TYPEKIT_ID\"></script>\n```\n\n### Font loading\n\nTypekit typically relies on a `.wf-loading` selector to hide content and prevent the Flash Of Unstyled Text (FOUT) that \nis associated with web fonts.\n\n```\n.wf-loading {\n  visibility: hidden;\n}\n```\n\nThat selector would work in conjunction with the function in the typekit.js JavaScript file to remove the selector from \nthe DOM when Typekit has loaded. However, experience has shown that hiding content and blocking until Typekit loads can \nmake the page or app unresponsive on initial load.\n\nCoral Spectrum remains agnostic. Consumers must implement their own solution to avoid Flash Of Unstyled Text during font loading.\n\n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/architecture.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/architecture.md",
    "content": "# Architecture\n\n## Web Components\n\nCoral Spectrum hides implementation detail from consumers by leveraging the [Custom Elements v1](https://html.spec.whatwg.org/multipage/custom-elements.html) \nspecification, which is part of the emerging [Web Components](https://www.webcomponents.org/introduction) standard.\n\n**Therefore any Coral CSS classes and attributes not explicitly mentioned in the public documentation are private and subject to change. \nTheir direct use is not recommended and at high risk of breaking after subsequent updates of Coral Spectrum library.**\n\nCustom elements allow Coral Spectrum to define new types of DOM elements to be used in an HTML document. As a result, Coral Spectrum \ncan extend native elements like a button or text input to provide additional functionality or it can provide completely \nnew elements like a progress indicator. Consumers can then use these elements using their custom tags (e.g., `<coral-progress>`) \nand directly interact with their custom properties.\n\nA strong advantage Coral Spectrum derives from Custom Elements is the ability to hide many implementation details from the consumer. \nWhile a progress indicator may be composed of a variety of spans, divs, or images, these are underlying details that shouldn't\nconcern consumers. Rather than consumers copying and maintaining large swaths of code containing all these elements with their \nvarious attributes, they are typically able to use a simple Custom Element tag and the underlying elements are seamlessly \nproduced by Coral Spectrum on their behalf. By keeping implementation details internal to components, the exposed public API is \nminimized and more explicit resulting in a lower risk of introducing breaking changes. \n\nFor now, we have not implemented Shadow DOM or other aspects of the Web Components specification due to lack of browser \nnative support but also polyfill performance issues. \n\nCustom Elements can be used before their definition is registered. Progressive enhancement is a feature of Custom Elements.\nTo know when an element or a set of elements becomes defined, you can use `Coral.commons.ready(el, callback)`;\n\n## Content Zones\n\nWithout shadow DOM, we need some way to mix user-provided content with presentational elements. Our answer to this is content zones. \nEssentially, we have simple, brainless HTML tags that serve as wrappers for content. \nUsers provide these tags when creating elements from markup, and after we render the template, we simply move these content zones into place.\n\nThis `Coral.Alert` markup shows content zones for header and content areas of the component:\n\n```\n<coral-alert>\n  <coral-alert-header>INFO</coral-alert-header>\n  <coral-alert-content>This is is an alert.</coral-alert-content>\n</coral-alert>\n```\n\nAdditionally, in the same way you can access the body of the HTML document with document.body, we create references for \neach content zone on the JavaScript object that corresponds to the component. You can access the header content zone with \n`alert.header` and change its content e.g append elements or do whatever else you need to do.\n\n## Dependencies\n\nCoral Spectrum has a few dependencies and polyfills. Some are actually written and maintained by the Coral Spectrum team, and are included \nwithout being considered an external dependency.\n\nThese dependencies are:\n* [Spectrum CSS](https://github.com/adobe/spectrum-css) for the Spectrum theme and icons\n* [Custom Elements v1 polyfill](https://github.com/webcomponents/custom-elements/) with built-in components support\n* [Promise polyfill](https://www.npmjs.com/package/promise-polyfill) for IE11 support\n* [CustomEvent polyfill](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill) for IE11 support\n* [ResizeObserver polyfill](https://github.com/que-etc/resize-observer-polyfill) to detect element size changes\n* Element `closest(), matches(), remove() and classList` polyfills for IE11 support\n* [DOMly](https://github.com/lazd/domly) to render HTML templates\n* [Vent](https://github.com/adobe/vent) for DOM event delegation\n* [PopperJS](https://popper.js.org/) to manage poppers\n* [Typekit](https://typekit.com/) to load Adobe Clean fonts\n\n**Note:** Calendar, Clock and Datepicker components will leverage [moment.js](http://momentjs.com/) if loaded on the page. \n \n \n \n",
    "static": true,
    "access": "public"
  },
  {
    "kind": "manual",
    "longname": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/contribution.md",
    "name": "/home/runner/work/coral-spectrum/coral-spectrum/coral-guide/manual/contribution.md",
    "content": "# Contribution\n\nWe love pull requests from everyone.\n\nThe following are a set of guidelines to follow when contributing to this project.\n\n## Code Of Conduct\n\nThis project adheres to the Adobe [code of conduct](CODE_OF_CONDUCT.md). By participating,\nyou are expected to uphold this code. Please report unacceptable behavior to\n[Grp-opensourceoffice@adobe.com](mailto:Grp-opensourceoffice@adobe.com).\n\n## Have A Question?\n\nStart by filing an issue. The existing committers on this project work to reach\nconsensus around project direction and issue solutions within issue threads\n(when appropriate).\n\n### Security Issues\n\nSecurity issues shouldn't be reported on this issue tracker. Instead, [file an issue to our security experts](https://helpx.adobe.com/security/alertus.html).\n\n## Contributor License Agreement\n\nAll third-party contributions to this project must be accompanied by a signed contributor\nlicense agreement. This gives Adobe permission to redistribute your contributions\nas part of the project. [Sign our CLA](http://opensource.adobe.com/cla.html). You\nonly need to submit an Adobe CLA one time, so if you have submitted one previously,\nyou are good to go!\n\n## Code Reviews\n\nAll submissions should come in the form of pull requests and need to be reviewed\nby project committers.\n\nStart by [forking](https://help.github.com/articles/fork-a-repo/) the repo, then [clone](https://help.github.com/articles/cloning-a-repository/) your fork:\n\n```\ngit clone git@github.com:yourusername/coral-spectrum.git\n```\n\nSet up a branch for your feature or bug fix, push it to your fork, and set up a remote for the upstream repo:\n\n```\ngit checkout -b my-awesome-new-feature\ngit push -u origin my-awesome-new-feature\ngit remote add upstream git@github.com:adobe/coral-spectrum.git\n```\n\nInstall dependencies:\n\n```\nnpm install\n```\n\nMake sure the [gulp-cli](https://github.com/gulpjs/gulp-cli) is installed globally:\n\n```\nnpm install -g gulp-cli\n```\n\nBuild the project, open a browser window, and watch for changes:\n\n```\ngulp\n```\n\nCommit changes, referencing the relevant issue number (if any):\n\n```\ngit commit -m \"Cool stuff, closes #250, fixes #252\"\n```\n\nConsider starting the commit message with an applicable emoji:\n\n* :art: `:art:` when improving the format/structure of the code\n* :zap: `:zap:` when improving performance\n* :non-potable_water: `:non-potable_water:` when plugging memory leaks\n* :memo: `:memo:` when writing docs\n* :ambulance: `:ambulance:` a critical hotfix.\n* :sparkles: `:sparkles:` when introducing new features\n* :bookmark: `:bookmark:` when releasing / version tags\n* :rocket: `:rocket:` when deploying stuff\n* :penguin: `:penguin:` when fixing something on Android\n* :apple: `:apple:` when fixing something on iOS\n* :checkered_flag: `:checkered_flag:` when fixing something on Windows\n* :bug: `:bug:` when fixing a bug\n* :fire: `:fire:` when removing code or files\n* :green_heart: `:green_heart:` when fixing the CI build\n* :white_check_mark: `:white_check_mark:` when adding tests\n* :lock: `:lock:` when dealing with security\n* :arrow_up: `:arrow_up:` when upgrading dependencies\n* :arrow_down: `:arrow_down:` when downgrading dependencies\n* :shirt: `:shirt:` when removing linter warnings\n* :hammer: `:hammer:` when doing heavy refactoring\n* :heavy_minus_sign: `:heavy_minus_sign:` when removing a dependency.\n* :heavy_plus_sign: `:heavy_plus_sign:` when adding a dependency.\n* :wrench: `:wrench:` when changing configuration files.\n* :globe_with_meridians: `:globe_with_meridians:` when dealing with internationalization and localization.\n* :pencil2: `:pencil2:` when fixing typos.\n* :hankey: `:hankey:` when writing bad code that needs to be improved.\n* :package: `:package:` when updating compiled files or packages.\n\nMake sure your branch is up to date with the original repo:\n\n```\ngit fetch upstream\ngit merge upstream/master\n```\n\nReview your changes and any possible conflicts and push to your fork:\n\n```\ngit push origin\n```\n\n[Submit a pull request](https://help.github.com/articles/creating-a-pull-request/).\n\nAt this point you're waiting on us. We do our best to keep on top of all the pull requests. We may suggest some changes, improvements or alternatives.\n\nSome things that will increase the chance that your pull request is accepted:\n\n- Write a [good commit message](http://chris.beams.io/posts/git-commit/).\n- Make sure the PR merges cleanly with the latest master.\n- Describe your feature/bugfix and why it's needed/important in the pull request description. \n  \n \n\n",
    "static": true,
    "access": "public"
  }
]