govuk_tech_docs 3.4.0 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/lib/assets/stylesheets/_govuk_tech_docs.scss +13 -0
  4. data/lib/govuk_tech_docs/version.rb +1 -1
  5. data/lib/source/favicon.ico +0 -0
  6. data/lib/source/layouts/_header.erb +13 -15
  7. data/node_modules/govuk-frontend/govuk/all-ie8.scss +8 -0
  8. data/node_modules/govuk-frontend/govuk/all.js +4918 -3796
  9. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js +54 -49
  10. data/node_modules/govuk-frontend/govuk/common/govuk-frontend-version.js +17 -0
  11. data/node_modules/govuk-frontend/govuk/common/index.js +172 -152
  12. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js +334 -321
  13. data/node_modules/govuk-frontend/govuk/common.js +171 -151
  14. data/node_modules/govuk-frontend/govuk/components/_all.scss +3 -2
  15. data/node_modules/govuk-frontend/govuk/components/accordion/_index.scss +26 -7
  16. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +2203 -1650
  17. data/node_modules/govuk-frontend/govuk/components/back-link/_index.scss +24 -16
  18. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/_index.scss +34 -11
  19. data/node_modules/govuk-frontend/govuk/components/button/_index.scss +49 -9
  20. data/node_modules/govuk-frontend/govuk/components/button/button.js +961 -916
  21. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +2142 -2038
  22. data/node_modules/govuk-frontend/govuk/components/checkboxes/_index.scss +6 -6
  23. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +1204 -1145
  24. data/node_modules/govuk-frontend/govuk/components/details/details.js +826 -799
  25. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +1097 -1044
  26. data/node_modules/govuk-frontend/govuk/components/exit-this-page/_exit-this-page.scss +2 -0
  27. data/node_modules/govuk-frontend/govuk/components/exit-this-page/_index.scss +97 -0
  28. data/node_modules/govuk-frontend/govuk/components/exit-this-page/exit-this-page.js +2120 -0
  29. data/node_modules/govuk-frontend/govuk/components/file-upload/_index.scss +6 -1
  30. data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +0 -7
  31. data/node_modules/govuk-frontend/govuk/components/header/_index.scss +6 -0
  32. data/node_modules/govuk-frontend/govuk/components/header/header.js +683 -1003
  33. data/node_modules/govuk-frontend/govuk/components/input/_index.scss +15 -3
  34. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +786 -751
  35. data/node_modules/govuk-frontend/govuk/components/radios/_index.scss +5 -5
  36. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +1151 -1105
  37. data/node_modules/govuk-frontend/govuk/components/select/_index.scss +7 -1
  38. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +1045 -1014
  39. data/node_modules/govuk-frontend/govuk/components/summary-list/_index.scss +107 -0
  40. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +1514 -1268
  41. data/node_modules/govuk-frontend/govuk/components/tag/_index.scss +18 -18
  42. data/node_modules/govuk-frontend/govuk/components/textarea/_index.scss +8 -1
  43. data/node_modules/govuk-frontend/govuk/core/_all.scss +1 -0
  44. data/node_modules/govuk-frontend/govuk/core/_govuk-frontend-version.scss +5 -0
  45. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +5 -2
  46. data/node_modules/govuk-frontend/govuk/helpers/_focused.scss +1 -1
  47. data/node_modules/govuk-frontend/govuk/helpers/_font-faces.scss +1 -1
  48. data/node_modules/govuk-frontend/govuk/helpers/_visually-hidden.scss +12 -0
  49. data/node_modules/govuk-frontend/govuk/i18n.js +371 -364
  50. data/node_modules/govuk-frontend/govuk/objects/_template.scss +20 -0
  51. data/node_modules/govuk-frontend/govuk/objects/_width-container.scss +1 -1
  52. data/node_modules/govuk-frontend/govuk/settings/_colours-organisations.scss +4 -0
  53. data/node_modules/govuk-frontend/govuk/settings/_ie8.scss +16 -0
  54. data/node_modules/govuk-frontend/govuk/settings/_links.scss +5 -1
  55. data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +5 -5
  56. data/node_modules/govuk-frontend/govuk/tools/_ie8.scss +38 -2
  57. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js +243 -241
  58. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js +14 -12
  59. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js +18 -16
  60. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js +553 -545
  61. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js +40 -36
  62. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js +257 -250
  63. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js +22 -20
  64. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js +204 -197
  65. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js +204 -197
  66. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js +109 -105
  67. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js +407 -399
  68. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js +242 -238
  69. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js +73 -71
  70. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js +15 -13
  71. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js +18 -16
  72. data/node_modules/govuk-frontend/govuk-prototype-kit/init.js +1 -0
  73. data/package-lock.json +7 -7
  74. data/package.json +1 -1
  75. metadata +8 -3
@@ -1,982 +1,1027 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
- typeof define === 'function' && define.amd ? define('GOVUKFrontend.Button', factory) :
4
- (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Button = factory());
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define('GOVUKFrontend.Button', factory) :
4
+ (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Button = factory());
5
5
  }(this, (function () { 'use strict';
6
6
 
7
- /**
8
- * Common helpers which do not require polyfill.
9
- *
10
- * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
11
- * so that the polyfill can be properly tree-shaken and does not burden
12
- * the components that do not need that helper
13
- *
14
- * @module common/index
15
- */
16
-
17
- /**
18
- * Config flattening function
19
- *
20
- * Takes any number of objects, flattens them into namespaced key-value pairs,
21
- * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
22
- * greatest priority on the LAST item passed in.
23
- *
24
- * @returns {object} A flattened object of key-value pairs.
25
- */
26
- function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
27
7
  /**
28
- * Function to take nested objects and flatten them to a dot-separated keyed
29
- * object. Doing this means we don't need to do any deep/recursive merging of
30
- * each of our objects, nor transform our dataset from a flat list into a
31
- * nested object.
8
+ * Common helpers which do not require polyfill.
32
9
  *
33
- * @param {object} configObject - Deeply nested object
34
- * @returns {object} Flattened object with dot-separated keys
10
+ * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
11
+ * so that the polyfill can be properly tree-shaken and does not burden
12
+ * the components that do not need that helper
13
+ *
14
+ * @module common/index
35
15
  */
36
- var flattenObject = function (configObject) {
37
- // Prepare an empty return object
38
- var flattenedObject = {};
39
-
40
- // Our flattening function, this is called recursively for each level of
41
- // depth in the object. At each level we prepend the previous level names to
42
- // the key using `prefix`.
43
- var flattenLoop = function (obj, prefix) {
44
- // Loop through keys...
45
- for (var key in obj) {
46
- // Check to see if this is a prototypical key/value,
47
- // if it is, skip it.
48
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
49
- continue
50
- }
51
- var value = obj[key];
52
- var prefixedKey = prefix ? prefix + '.' + key : key;
53
- if (typeof value === 'object') {
54
- // If the value is a nested object, recurse over that too
55
- flattenLoop(value, prefixedKey);
56
- } else {
57
- // Otherwise, add this value to our return object
58
- flattenedObject[prefixedKey] = value;
16
+
17
+ /**
18
+ * Config flattening function
19
+ *
20
+ * Takes any number of objects, flattens them into namespaced key-value pairs,
21
+ * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
22
+ * greatest priority on the LAST item passed in.
23
+ *
24
+ * @deprecated Will be made private in v5.0
25
+ * @returns {Object<string, unknown>} A flattened object of key-value pairs.
26
+ */
27
+ function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
28
+ /**
29
+ * Function to take nested objects and flatten them to a dot-separated keyed
30
+ * object. Doing this means we don't need to do any deep/recursive merging of
31
+ * each of our objects, nor transform our dataset from a flat list into a
32
+ * nested object.
33
+ *
34
+ * @param {Object<string, unknown>} configObject - Deeply nested object
35
+ * @returns {Object<string, unknown>} Flattened object with dot-separated keys
36
+ */
37
+ var flattenObject = function (configObject) {
38
+ // Prepare an empty return object
39
+ /** @type {Object<string, unknown>} */
40
+ var flattenedObject = {};
41
+
42
+ /**
43
+ * Our flattening function, this is called recursively for each level of
44
+ * depth in the object. At each level we prepend the previous level names to
45
+ * the key using `prefix`.
46
+ *
47
+ * @param {Partial<Object<string, unknown>>} obj - Object to flatten
48
+ * @param {string} [prefix] - Optional dot-separated prefix
49
+ */
50
+ var flattenLoop = function (obj, prefix) {
51
+ // Loop through keys...
52
+ for (var key in obj) {
53
+ // Check to see if this is a prototypical key/value,
54
+ // if it is, skip it.
55
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
56
+ continue
57
+ }
58
+ var value = obj[key];
59
+ var prefixedKey = prefix ? prefix + '.' + key : key;
60
+ if (typeof value === 'object') {
61
+ // If the value is a nested object, recurse over that too
62
+ flattenLoop(value, prefixedKey);
63
+ } else {
64
+ // Otherwise, add this value to our return object
65
+ flattenedObject[prefixedKey] = value;
66
+ }
59
67
  }
60
- }
68
+ };
69
+
70
+ // Kick off the recursive loop
71
+ flattenLoop(configObject);
72
+ return flattenedObject
61
73
  };
62
74
 
63
- // Kick off the recursive loop
64
- flattenLoop(configObject);
65
- return flattenedObject
66
- };
75
+ // Start with an empty object as our base
76
+ /** @type {Object<string, unknown>} */
77
+ var formattedConfigObject = {};
67
78
 
68
- // Start with an empty object as our base
69
- var formattedConfigObject = {};
70
-
71
- // Loop through each of the remaining passed objects and push their keys
72
- // one-by-one into configObject. Any duplicate keys will override the existing
73
- // key with the new value.
74
- for (var i = 0; i < arguments.length; i++) {
75
- var obj = flattenObject(arguments[i]);
76
- for (var key in obj) {
77
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
78
- formattedConfigObject[key] = obj[key];
79
+ // Loop through each of the remaining passed objects and push their keys
80
+ // one-by-one into configObject. Any duplicate keys will override the existing
81
+ // key with the new value.
82
+ for (var i = 0; i < arguments.length; i++) {
83
+ var obj = flattenObject(arguments[i]);
84
+ for (var key in obj) {
85
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
86
+ formattedConfigObject[key] = obj[key];
87
+ }
79
88
  }
80
89
  }
90
+
91
+ return formattedConfigObject
81
92
  }
82
93
 
83
- return formattedConfigObject
84
- }
85
-
86
- /**
87
- * @callback nodeListIterator
88
- * @param {Element} value - The current node being iterated on
89
- * @param {number} index - The current index in the iteration
90
- * @param {NodeListOf<Element>} nodes - NodeList from querySelectorAll()
91
- * @returns {undefined}
92
- */
93
-
94
- (function(undefined) {
95
-
96
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
97
- var detect = (
98
- // In IE8, defineProperty could only act on DOM elements, so full support
99
- // for the feature requires the ability to set a property on an arbitrary object
100
- 'defineProperty' in Object && (function() {
101
- try {
102
- var a = {};
103
- Object.defineProperty(a, 'test', {value:42});
104
- return true;
105
- } catch(e) {
106
- return false
94
+ /**
95
+ * @template {Node} ElementType
96
+ * @callback nodeListIterator
97
+ * @param {ElementType} value - The current node being iterated on
98
+ * @param {number} index - The current index in the iteration
99
+ * @param {NodeListOf<ElementType>} nodes - NodeList from querySelectorAll()
100
+ * @returns {void}
101
+ */
102
+
103
+ // @ts-nocheck
104
+ (function (undefined) {
105
+
106
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
107
+ var detect = (
108
+ // In IE8, defineProperty could only act on DOM elements, so full support
109
+ // for the feature requires the ability to set a property on an arbitrary object
110
+ 'defineProperty' in Object && (function() {
111
+ try {
112
+ var a = {};
113
+ Object.defineProperty(a, 'test', {value:42});
114
+ return true;
115
+ } catch(e) {
116
+ return false
117
+ }
118
+ }())
119
+ );
120
+
121
+ if (detect) return
122
+
123
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
124
+ (function (nativeDefineProperty) {
125
+
126
+ var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
127
+ var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
128
+ var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
129
+
130
+ Object.defineProperty = function defineProperty(object, property, descriptor) {
131
+
132
+ // Where native support exists, assume it
133
+ if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
134
+ return nativeDefineProperty(object, property, descriptor);
135
+ }
136
+
137
+ if (object === null || !(object instanceof Object || typeof object === 'object')) {
138
+ throw new TypeError('Object.defineProperty called on non-object');
139
+ }
140
+
141
+ if (!(descriptor instanceof Object)) {
142
+ throw new TypeError('Property description must be an object');
143
+ }
144
+
145
+ var propertyString = String(property);
146
+ var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
147
+ var getterType = 'get' in descriptor && typeof descriptor.get;
148
+ var setterType = 'set' in descriptor && typeof descriptor.set;
149
+
150
+ // handle descriptor.get
151
+ if (getterType) {
152
+ if (getterType !== 'function') {
153
+ throw new TypeError('Getter must be a function');
154
+ }
155
+ if (!supportsAccessors) {
156
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
157
+ }
158
+ if (hasValueOrWritable) {
159
+ throw new TypeError(ERR_VALUE_ACCESSORS);
160
+ }
161
+ Object.__defineGetter__.call(object, propertyString, descriptor.get);
162
+ } else {
163
+ object[propertyString] = descriptor.value;
164
+ }
165
+
166
+ // handle descriptor.set
167
+ if (setterType) {
168
+ if (setterType !== 'function') {
169
+ throw new TypeError('Setter must be a function');
170
+ }
171
+ if (!supportsAccessors) {
172
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
173
+ }
174
+ if (hasValueOrWritable) {
175
+ throw new TypeError(ERR_VALUE_ACCESSORS);
176
+ }
177
+ Object.__defineSetter__.call(object, propertyString, descriptor.set);
178
+ }
179
+
180
+ // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
181
+ if ('value' in descriptor) {
182
+ object[propertyString] = descriptor.value;
183
+ }
184
+
185
+ return object;
186
+ };
187
+ }(Object.defineProperty));
188
+ })
189
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
190
+
191
+ // @ts-nocheck
192
+ (function (undefined) {
193
+
194
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
195
+ var detect = ("Document" in this);
196
+
197
+ if (detect) return
198
+
199
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
200
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
201
+
202
+ if (this.HTMLDocument) { // IE8
203
+
204
+ // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
205
+ this.Document = this.HTMLDocument;
206
+
207
+ } else {
208
+
209
+ // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
210
+ this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
211
+ this.Document.prototype = document;
107
212
  }
108
- }())
109
- );
110
-
111
- if (detect) return
112
-
113
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
114
- (function (nativeDefineProperty) {
115
-
116
- var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
117
- var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
118
- var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
119
-
120
- Object.defineProperty = function defineProperty(object, property, descriptor) {
121
-
122
- // Where native support exists, assume it
123
- if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
124
- return nativeDefineProperty(object, property, descriptor);
125
- }
213
+ }
126
214
 
127
- if (object === null || !(object instanceof Object || typeof object === 'object')) {
128
- throw new TypeError('Object.defineProperty called on non-object');
129
- }
130
215
 
131
- if (!(descriptor instanceof Object)) {
132
- throw new TypeError('Property description must be an object');
133
- }
134
-
135
- var propertyString = String(property);
136
- var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
137
- var getterType = 'get' in descriptor && typeof descriptor.get;
138
- var setterType = 'set' in descriptor && typeof descriptor.set;
139
-
140
- // handle descriptor.get
141
- if (getterType) {
142
- if (getterType !== 'function') {
143
- throw new TypeError('Getter must be a function');
144
- }
145
- if (!supportsAccessors) {
146
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
147
- }
148
- if (hasValueOrWritable) {
149
- throw new TypeError(ERR_VALUE_ACCESSORS);
150
- }
151
- Object.__defineGetter__.call(object, propertyString, descriptor.get);
152
- } else {
153
- object[propertyString] = descriptor.value;
154
- }
155
-
156
- // handle descriptor.set
157
- if (setterType) {
158
- if (setterType !== 'function') {
159
- throw new TypeError('Setter must be a function');
160
- }
161
- if (!supportsAccessors) {
162
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
163
- }
164
- if (hasValueOrWritable) {
165
- throw new TypeError(ERR_VALUE_ACCESSORS);
166
- }
167
- Object.__defineSetter__.call(object, propertyString, descriptor.set);
168
- }
169
-
170
- // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
171
- if ('value' in descriptor) {
172
- object[propertyString] = descriptor.value;
173
- }
174
-
175
- return object;
176
- };
177
- }(Object.defineProperty));
178
- })
179
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
180
-
181
- (function(undefined) {
182
-
183
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
184
- var detect = ("Document" in this);
185
-
186
- if (detect) return
187
-
188
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
189
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
190
-
191
- if (this.HTMLDocument) { // IE8
192
-
193
- // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
194
- this.Document = this.HTMLDocument;
195
-
196
- } else {
197
-
198
- // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
199
- this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
200
- this.Document.prototype = document;
201
- }
202
- }
203
-
204
-
205
- })
206
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
207
-
208
- (function(undefined) {
209
-
210
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
211
- var detect = ('Element' in this && 'HTMLElement' in this);
212
-
213
- if (detect) return
214
-
215
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
216
- (function () {
217
-
218
- // IE8
219
- if (window.Element && !window.HTMLElement) {
220
- window.HTMLElement = window.Element;
221
- return;
222
- }
223
-
224
- // create Element constructor
225
- window.Element = window.HTMLElement = new Function('return function Element() {}')();
226
-
227
- // generate sandboxed iframe
228
- var vbody = document.appendChild(document.createElement('body'));
229
- var frame = vbody.appendChild(document.createElement('iframe'));
230
-
231
- // use sandboxed iframe to replicate Element functionality
232
- var frameDocument = frame.contentWindow.document;
233
- var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
234
- var cache = {};
235
-
236
- // polyfill Element.prototype on an element
237
- var shiv = function (element, deep) {
238
- var
239
- childNodes = element.childNodes || [],
240
- index = -1,
241
- key, value, childNode;
242
-
243
- if (element.nodeType === 1 && element.constructor !== Element) {
244
- element.constructor = Element;
245
-
246
- for (key in cache) {
247
- value = cache[key];
248
- element[key] = value;
249
- }
250
- }
251
-
252
- while (childNode = deep && childNodes[++index]) {
253
- shiv(childNode, deep);
254
- }
255
-
256
- return element;
257
- };
258
-
259
- var elements = document.getElementsByTagName('*');
260
- var nativeCreateElement = document.createElement;
261
- var interval;
262
- var loopLimit = 100;
263
-
264
- prototype.attachEvent('onpropertychange', function (event) {
265
- var
266
- propertyName = event.propertyName,
267
- nonValue = !cache.hasOwnProperty(propertyName),
268
- newValue = prototype[propertyName],
269
- oldValue = cache[propertyName],
270
- index = -1,
271
- element;
272
-
273
- while (element = elements[++index]) {
274
- if (element.nodeType === 1) {
275
- if (nonValue || element[propertyName] === oldValue) {
276
- element[propertyName] = newValue;
277
- }
278
- }
279
- }
280
-
281
- cache[propertyName] = newValue;
282
- });
283
-
284
- prototype.constructor = Element;
285
-
286
- if (!prototype.hasAttribute) {
287
- // <Element>.hasAttribute
288
- prototype.hasAttribute = function hasAttribute(name) {
289
- return this.getAttribute(name) !== null;
290
- };
291
- }
292
-
293
- // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
294
- function bodyCheck() {
295
- if (!(loopLimit--)) clearTimeout(interval);
296
- if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
297
- shiv(document, true);
298
- if (interval && document.body.prototype) clearTimeout(interval);
299
- return (!!document.body.prototype);
300
- }
301
- return false;
302
- }
303
- if (!bodyCheck()) {
304
- document.onreadystatechange = bodyCheck;
305
- interval = setInterval(bodyCheck, 25);
306
- }
307
-
308
- // Apply to any new elements created after load
309
- document.createElement = function createElement(nodeName) {
310
- var element = nativeCreateElement(String(nodeName).toLowerCase());
311
- return shiv(element);
312
- };
313
-
314
- // remove sandboxed iframe
315
- document.removeChild(vbody);
316
- }());
317
-
318
- })
319
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
320
-
321
- (function(undefined) {
322
-
323
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
324
- var detect = (function(){
325
- if (!document.documentElement.dataset) {
326
- return false;
327
- }
328
- var el = document.createElement('div');
329
- el.setAttribute("data-a-b", "c");
330
- return el.dataset && el.dataset.aB == "c";
331
- }());
216
+ })
217
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
218
+
219
+ // @ts-nocheck
220
+
221
+ (function(undefined) {
222
+
223
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
224
+ var detect = ('Element' in this && 'HTMLElement' in this);
332
225
 
333
226
  if (detect) return
334
227
 
335
- // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
336
- Object.defineProperty(Element.prototype, 'dataset', {
337
- get: function() {
338
- var element = this;
339
- var attributes = this.attributes;
340
- var map = {};
341
-
342
- for (var i = 0; i < attributes.length; i++) {
343
- var attribute = attributes[i];
344
-
345
- // This regex has been edited from the original polyfill, to add
346
- // support for period (.) separators in data-* attribute names. These
347
- // are allowed in the HTML spec, but were not covered by the original
348
- // polyfill's regex. We use periods in our i18n implementation.
349
- if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
350
- var name = attribute.name;
351
- var value = attribute.value;
352
-
353
- var propName = name.substr(5).replace(/-./g, function (prop) {
354
- return prop.charAt(1).toUpperCase();
355
- });
356
-
357
- // If this browser supports __defineGetter__ and __defineSetter__,
358
- // continue using defineProperty. If not (like IE 8 and below), we use
359
- // a hacky fallback which at least gives an object in the right format
360
- if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
361
- Object.defineProperty(map, propName, {
362
- enumerable: true,
363
- get: function() {
364
- return this.value;
365
- }.bind({value: value || ''}),
366
- set: function setter(name, value) {
367
- if (typeof value !== 'undefined') {
368
- this.setAttribute(name, value);
369
- } else {
370
- this.removeAttribute(name);
371
- }
372
- }.bind(element, name)
228
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
229
+ (function () {
230
+
231
+ // IE8
232
+ if (window.Element && !window.HTMLElement) {
233
+ window.HTMLElement = window.Element;
234
+ return;
235
+ }
236
+
237
+ // create Element constructor
238
+ window.Element = window.HTMLElement = new Function('return function Element() {}')();
239
+
240
+ // generate sandboxed iframe
241
+ var vbody = document.appendChild(document.createElement('body'));
242
+ var frame = vbody.appendChild(document.createElement('iframe'));
243
+
244
+ // use sandboxed iframe to replicate Element functionality
245
+ var frameDocument = frame.contentWindow.document;
246
+ var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
247
+ var cache = {};
248
+
249
+ // polyfill Element.prototype on an element
250
+ var shiv = function (element, deep) {
251
+ var
252
+ childNodes = element.childNodes || [],
253
+ index = -1,
254
+ key, value, childNode;
255
+
256
+ if (element.nodeType === 1 && element.constructor !== Element) {
257
+ element.constructor = Element;
258
+
259
+ for (key in cache) {
260
+ value = cache[key];
261
+ element[key] = value;
262
+ }
263
+ }
264
+
265
+ while (childNode = deep && childNodes[++index]) {
266
+ shiv(childNode, deep);
267
+ }
268
+
269
+ return element;
270
+ };
271
+
272
+ var elements = document.getElementsByTagName('*');
273
+ var nativeCreateElement = document.createElement;
274
+ var interval;
275
+ var loopLimit = 100;
276
+
277
+ prototype.attachEvent('onpropertychange', function (event) {
278
+ var
279
+ propertyName = event.propertyName,
280
+ nonValue = !cache.hasOwnProperty(propertyName),
281
+ newValue = prototype[propertyName],
282
+ oldValue = cache[propertyName],
283
+ index = -1,
284
+ element;
285
+
286
+ while (element = elements[++index]) {
287
+ if (element.nodeType === 1) {
288
+ if (nonValue || element[propertyName] === oldValue) {
289
+ element[propertyName] = newValue;
290
+ }
291
+ }
292
+ }
293
+
294
+ cache[propertyName] = newValue;
295
+ });
296
+
297
+ prototype.constructor = Element;
298
+
299
+ if (!prototype.hasAttribute) {
300
+ // <Element>.hasAttribute
301
+ prototype.hasAttribute = function hasAttribute(name) {
302
+ return this.getAttribute(name) !== null;
303
+ };
304
+ }
305
+
306
+ // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
307
+ function bodyCheck() {
308
+ if (!(loopLimit--)) clearTimeout(interval);
309
+ if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
310
+ shiv(document, true);
311
+ if (interval && document.body.prototype) clearTimeout(interval);
312
+ return (!!document.body.prototype);
313
+ }
314
+ return false;
315
+ }
316
+ if (!bodyCheck()) {
317
+ document.onreadystatechange = bodyCheck;
318
+ interval = setInterval(bodyCheck, 25);
319
+ }
320
+
321
+ // Apply to any new elements created after load
322
+ document.createElement = function createElement(nodeName) {
323
+ var element = nativeCreateElement(String(nodeName).toLowerCase());
324
+ return shiv(element);
325
+ };
326
+
327
+ // remove sandboxed iframe
328
+ document.removeChild(vbody);
329
+ }());
330
+
331
+ })
332
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
333
+
334
+ // @ts-nocheck
335
+
336
+ (function(undefined) {
337
+
338
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
339
+ var detect = (function(){
340
+ if (!document.documentElement.dataset) {
341
+ return false;
342
+ }
343
+ var el = document.createElement('div');
344
+ el.setAttribute("data-a-b", "c");
345
+ return el.dataset && el.dataset.aB == "c";
346
+ }());
347
+
348
+ if (detect) return
349
+
350
+ // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
351
+ Object.defineProperty(Element.prototype, 'dataset', {
352
+ get: function() {
353
+ var element = this;
354
+ var attributes = this.attributes;
355
+ var map = {};
356
+
357
+ for (var i = 0; i < attributes.length; i++) {
358
+ var attribute = attributes[i];
359
+
360
+ // This regex has been edited from the original polyfill, to add
361
+ // support for period (.) separators in data-* attribute names. These
362
+ // are allowed in the HTML spec, but were not covered by the original
363
+ // polyfill's regex. We use periods in our i18n implementation.
364
+ if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
365
+ var name = attribute.name;
366
+ var value = attribute.value;
367
+
368
+ var propName = name.substr(5).replace(/-./g, function (prop) {
369
+ return prop.charAt(1).toUpperCase();
373
370
  });
374
- } else {
375
- map[propName] = value;
376
- }
377
371
 
372
+ // If this browser supports __defineGetter__ and __defineSetter__,
373
+ // continue using defineProperty. If not (like IE 8 and below), we use
374
+ // a hacky fallback which at least gives an object in the right format
375
+ if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
376
+ Object.defineProperty(map, propName, {
377
+ enumerable: true,
378
+ get: function() {
379
+ return this.value;
380
+ }.bind({value: value || ''}),
381
+ set: function setter(name, value) {
382
+ if (typeof value !== 'undefined') {
383
+ this.setAttribute(name, value);
384
+ } else {
385
+ this.removeAttribute(name);
386
+ }
387
+ }.bind(element, name)
388
+ });
389
+ } else {
390
+ map[propName] = value;
391
+ }
392
+
393
+ }
378
394
  }
395
+
396
+ return map;
379
397
  }
380
-
381
- return map;
398
+ });
399
+
400
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
401
+
402
+ // @ts-nocheck
403
+ (function (undefined) {
404
+
405
+ // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
406
+ var detect = ('trim' in String.prototype);
407
+
408
+ if (detect) return
409
+
410
+ // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
411
+ String.prototype.trim = function () {
412
+ return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
413
+ };
414
+
415
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
416
+
417
+ /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
418
+
419
+ /**
420
+ * Normalise string
421
+ *
422
+ * 'If it looks like a duck, and it quacks like a duck…' 🦆
423
+ *
424
+ * If the passed value looks like a boolean or a number, convert it to a boolean
425
+ * or number.
426
+ *
427
+ * Designed to be used to convert config passed via data attributes (which are
428
+ * always strings) into something sensible.
429
+ *
430
+ * @deprecated Will be made private in v5.0
431
+ * @param {string} value - The value to normalise
432
+ * @returns {string | boolean | number | undefined} Normalised data
433
+ */
434
+ function normaliseString (value) {
435
+ if (typeof value !== 'string') {
436
+ return value
382
437
  }
383
- });
384
438
 
385
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
439
+ var trimmedValue = value.trim();
386
440
 
387
- (function(undefined) {
441
+ if (trimmedValue === 'true') {
442
+ return true
443
+ }
388
444
 
389
- // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
390
- var detect = ('trim' in String.prototype);
391
-
392
- if (detect) return
445
+ if (trimmedValue === 'false') {
446
+ return false
447
+ }
393
448
 
394
- // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
395
- String.prototype.trim = function () {
396
- return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
397
- };
449
+ // Empty / whitespace-only strings are considered finite so we need to check
450
+ // the length of the trimmed string as well
451
+ if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
452
+ return Number(trimmedValue)
453
+ }
398
454
 
399
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
400
-
401
- /**
402
- * Normalise string
403
- *
404
- * 'If it looks like a duck, and it quacks like a duck…' 🦆
405
- *
406
- * If the passed value looks like a boolean or a number, convert it to a boolean
407
- * or number.
408
- *
409
- * Designed to be used to convert config passed via data attributes (which are
410
- * always strings) into something sensible.
411
- *
412
- * @param {string} value - The value to normalise
413
- * @returns {string | boolean | number | undefined} Normalised data
414
- */
415
- function normaliseString (value) {
416
- if (typeof value !== 'string') {
417
455
  return value
418
456
  }
419
457
 
420
- var trimmedValue = value.trim();
458
+ /**
459
+ * Normalise dataset
460
+ *
461
+ * Loop over an object and normalise each value using normaliseData function
462
+ *
463
+ * @deprecated Will be made private in v5.0
464
+ * @param {DOMStringMap} dataset - HTML element dataset
465
+ * @returns {Object<string, unknown>} Normalised dataset
466
+ */
467
+ function normaliseDataset (dataset) {
468
+ /** @type {Object<string, unknown>} */
469
+ var out = {};
421
470
 
422
- if (trimmedValue === 'true') {
423
- return true
424
- }
471
+ for (var key in dataset) {
472
+ out[key] = normaliseString(dataset[key]);
473
+ }
425
474
 
426
- if (trimmedValue === 'false') {
427
- return false
475
+ return out
428
476
  }
429
477
 
430
- // Empty / whitespace-only strings are considered finite so we need to check
431
- // the length of the trimmed string as well
432
- if (trimmedValue.length > 0 && isFinite(trimmedValue)) {
433
- return Number(trimmedValue)
434
- }
478
+ // @ts-nocheck
479
+ (function (undefined) {
480
+
481
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
482
+ var detect = ('Window' in this);
483
+
484
+ if (detect) return
435
485
 
436
- return value
437
- }
438
-
439
- /**
440
- * Normalise dataset
441
- *
442
- * Loop over an object and normalise each value using normaliseData function
443
- *
444
- * @param {DOMStringMap} dataset - HTML element dataset
445
- * @returns {Object<string, string | boolean | number | undefined>} Normalised dataset
446
- */
447
- function normaliseDataset (dataset) {
448
- var out = {};
449
-
450
- for (var key in dataset) {
451
- out[key] = normaliseString(dataset[key]);
486
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
487
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
488
+ (function (global) {
489
+ if (global.constructor) {
490
+ global.Window = global.constructor;
491
+ } else {
492
+ (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
493
+ }
494
+ }(this));
452
495
  }
453
496
 
454
- return out
455
- }
497
+ })
498
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
456
499
 
457
- (function(undefined) {
500
+ // @ts-nocheck
458
501
 
459
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
460
- var detect = ('Window' in this);
502
+ (function(undefined) {
461
503
 
462
- if (detect) return
504
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
505
+ var detect = (
506
+ (function(global) {
463
507
 
464
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
465
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
466
- (function (global) {
467
- if (global.constructor) {
468
- global.Window = global.constructor;
469
- } else {
470
- (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
471
- }
472
- }(this));
473
- }
508
+ if (!('Event' in global)) return false;
509
+ if (typeof global.Event === 'function') return true;
474
510
 
475
- })
476
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
511
+ try {
477
512
 
478
- (function(undefined) {
513
+ // In IE 9-11, the Event object exists but cannot be instantiated
514
+ new Event('click');
515
+ return true;
516
+ } catch(e) {
517
+ return false;
518
+ }
519
+ }(this))
520
+ );
479
521
 
480
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
481
- var detect = (
482
- (function(global) {
522
+ if (detect) return
483
523
 
484
- if (!('Event' in global)) return false;
485
- if (typeof global.Event === 'function') return true;
524
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
525
+ (function () {
526
+ var unlistenableWindowEvents = {
527
+ click: 1,
528
+ dblclick: 1,
529
+ keyup: 1,
530
+ keypress: 1,
531
+ keydown: 1,
532
+ mousedown: 1,
533
+ mouseup: 1,
534
+ mousemove: 1,
535
+ mouseover: 1,
536
+ mouseenter: 1,
537
+ mouseleave: 1,
538
+ mouseout: 1,
539
+ storage: 1,
540
+ storagecommit: 1,
541
+ textinput: 1
542
+ };
543
+
544
+ // This polyfill depends on availability of `document` so will not run in a worker
545
+ // However, we asssume there are no browsers with worker support that lack proper
546
+ // support for `Event` within the worker
547
+ if (typeof document === 'undefined' || typeof window === 'undefined') return;
548
+
549
+ function indexOf(array, element) {
550
+ var
551
+ index = -1,
552
+ length = array.length;
553
+
554
+ while (++index < length) {
555
+ if (index in array && array[index] === element) {
556
+ return index;
557
+ }
558
+ }
559
+
560
+ return -1;
561
+ }
486
562
 
487
- try {
563
+ var existingProto = (window.Event && window.Event.prototype) || null;
564
+ window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
565
+ if (!type) {
566
+ throw new Error('Not enough arguments');
567
+ }
568
+
569
+ var event;
570
+ // Shortcut if browser supports createEvent
571
+ if ('createEvent' in document) {
572
+ event = document.createEvent('Event');
573
+ var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
574
+ var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
575
+
576
+ event.initEvent(type, bubbles, cancelable);
577
+
578
+ return event;
579
+ }
580
+
581
+ event = document.createEventObject();
582
+
583
+ event.type = type;
584
+ event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
585
+ event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
586
+
587
+ return event;
588
+ };
589
+ if (existingProto) {
590
+ Object.defineProperty(window.Event, 'prototype', {
591
+ configurable: false,
592
+ enumerable: false,
593
+ writable: true,
594
+ value: existingProto
595
+ });
596
+ }
488
597
 
489
- // In IE 9-11, the Event object exists but cannot be instantiated
490
- new Event('click');
491
- return true;
492
- } catch(e) {
493
- return false;
598
+ if (!('createEvent' in document)) {
599
+ window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
600
+ var
601
+ element = this,
602
+ type = arguments[0],
603
+ listener = arguments[1];
604
+
605
+ if (element === window && type in unlistenableWindowEvents) {
606
+ throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
607
+ }
608
+
609
+ if (!element._events) {
610
+ element._events = {};
611
+ }
612
+
613
+ if (!element._events[type]) {
614
+ element._events[type] = function (event) {
615
+ var
616
+ list = element._events[event.type].list,
617
+ events = list.slice(),
618
+ index = -1,
619
+ length = events.length,
620
+ eventElement;
621
+
622
+ event.preventDefault = function preventDefault() {
623
+ if (event.cancelable !== false) {
624
+ event.returnValue = false;
625
+ }
626
+ };
627
+
628
+ event.stopPropagation = function stopPropagation() {
629
+ event.cancelBubble = true;
630
+ };
631
+
632
+ event.stopImmediatePropagation = function stopImmediatePropagation() {
633
+ event.cancelBubble = true;
634
+ event.cancelImmediate = true;
635
+ };
636
+
637
+ event.currentTarget = element;
638
+ event.relatedTarget = event.fromElement || null;
639
+ event.target = event.target || event.srcElement || element;
640
+ event.timeStamp = new Date().getTime();
641
+
642
+ if (event.clientX) {
643
+ event.pageX = event.clientX + document.documentElement.scrollLeft;
644
+ event.pageY = event.clientY + document.documentElement.scrollTop;
645
+ }
646
+
647
+ while (++index < length && !event.cancelImmediate) {
648
+ if (index in events) {
649
+ eventElement = events[index];
650
+
651
+ if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
652
+ eventElement.call(element, event);
653
+ }
654
+ }
655
+ }
656
+ };
657
+
658
+ element._events[type].list = [];
659
+
660
+ if (element.attachEvent) {
661
+ element.attachEvent('on' + type, element._events[type]);
662
+ }
663
+ }
664
+
665
+ element._events[type].list.push(listener);
666
+ };
667
+
668
+ window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
669
+ var
670
+ element = this,
671
+ type = arguments[0],
672
+ listener = arguments[1],
673
+ index;
674
+
675
+ if (element._events && element._events[type] && element._events[type].list) {
676
+ index = indexOf(element._events[type].list, listener);
677
+
678
+ if (index !== -1) {
679
+ element._events[type].list.splice(index, 1);
680
+
681
+ if (!element._events[type].list.length) {
682
+ if (element.detachEvent) {
683
+ element.detachEvent('on' + type, element._events[type]);
684
+ }
685
+ delete element._events[type];
686
+ }
687
+ }
688
+ }
689
+ };
690
+
691
+ window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
692
+ if (!arguments.length) {
693
+ throw new Error('Not enough arguments');
694
+ }
695
+
696
+ if (!event || typeof event.type !== 'string') {
697
+ throw new Error('DOM Events Exception 0');
698
+ }
699
+
700
+ var element = this, type = event.type;
701
+
702
+ try {
703
+ if (!event.bubbles) {
704
+ event.cancelBubble = true;
705
+
706
+ var cancelBubbleEvent = function (event) {
707
+ event.cancelBubble = true;
708
+
709
+ (element || window).detachEvent('on' + type, cancelBubbleEvent);
710
+ };
711
+
712
+ this.attachEvent('on' + type, cancelBubbleEvent);
713
+ }
714
+
715
+ this.fireEvent('on' + type, event);
716
+ } catch (error) {
717
+ event.target = element;
718
+
719
+ do {
720
+ event.currentTarget = element;
721
+
722
+ if ('_events' in element && typeof element._events[type] === 'function') {
723
+ element._events[type].call(element, event);
724
+ }
725
+
726
+ if (typeof element['on' + type] === 'function') {
727
+ element['on' + type].call(element, event);
728
+ }
729
+
730
+ element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
731
+ } while (element && !event.cancelBubble);
732
+ }
733
+
734
+ return true;
735
+ };
736
+
737
+ // Add the DOMContentLoaded Event
738
+ document.attachEvent('onreadystatechange', function() {
739
+ if (document.readyState === 'complete') {
740
+ document.dispatchEvent(new Event('DOMContentLoaded', {
741
+ bubbles: true
742
+ }));
743
+ }
744
+ });
494
745
  }
495
- }(this))
496
- );
497
-
498
- if (detect) return
499
-
500
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
501
- (function () {
502
- var unlistenableWindowEvents = {
503
- click: 1,
504
- dblclick: 1,
505
- keyup: 1,
506
- keypress: 1,
507
- keydown: 1,
508
- mousedown: 1,
509
- mouseup: 1,
510
- mousemove: 1,
511
- mouseover: 1,
512
- mouseenter: 1,
513
- mouseleave: 1,
514
- mouseout: 1,
515
- storage: 1,
516
- storagecommit: 1,
517
- textinput: 1
518
- };
519
-
520
- // This polyfill depends on availability of `document` so will not run in a worker
521
- // However, we asssume there are no browsers with worker support that lack proper
522
- // support for `Event` within the worker
523
- if (typeof document === 'undefined' || typeof window === 'undefined') return;
524
-
525
- function indexOf(array, element) {
526
- var
527
- index = -1,
528
- length = array.length;
529
-
530
- while (++index < length) {
531
- if (index in array && array[index] === element) {
532
- return index;
533
- }
534
- }
535
-
536
- return -1;
537
- }
538
-
539
- var existingProto = (window.Event && window.Event.prototype) || null;
540
- window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
541
- if (!type) {
542
- throw new Error('Not enough arguments');
543
- }
544
-
545
- var event;
546
- // Shortcut if browser supports createEvent
547
- if ('createEvent' in document) {
548
- event = document.createEvent('Event');
549
- var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
550
- var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
551
-
552
- event.initEvent(type, bubbles, cancelable);
553
-
554
- return event;
555
- }
556
-
557
- event = document.createEventObject();
558
-
559
- event.type = type;
560
- event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
561
- event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
562
-
563
- return event;
564
- };
565
- if (existingProto) {
566
- Object.defineProperty(window.Event, 'prototype', {
567
- configurable: false,
568
- enumerable: false,
569
- writable: true,
570
- value: existingProto
571
- });
572
- }
573
-
574
- if (!('createEvent' in document)) {
575
- window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
576
- var
577
- element = this,
578
- type = arguments[0],
579
- listener = arguments[1];
580
-
581
- if (element === window && type in unlistenableWindowEvents) {
582
- throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
583
- }
584
-
585
- if (!element._events) {
586
- element._events = {};
587
- }
588
-
589
- if (!element._events[type]) {
590
- element._events[type] = function (event) {
591
- var
592
- list = element._events[event.type].list,
593
- events = list.slice(),
594
- index = -1,
595
- length = events.length,
596
- eventElement;
597
-
598
- event.preventDefault = function preventDefault() {
599
- if (event.cancelable !== false) {
600
- event.returnValue = false;
601
- }
602
- };
603
-
604
- event.stopPropagation = function stopPropagation() {
605
- event.cancelBubble = true;
606
- };
607
-
608
- event.stopImmediatePropagation = function stopImmediatePropagation() {
609
- event.cancelBubble = true;
610
- event.cancelImmediate = true;
611
- };
612
-
613
- event.currentTarget = element;
614
- event.relatedTarget = event.fromElement || null;
615
- event.target = event.target || event.srcElement || element;
616
- event.timeStamp = new Date().getTime();
617
-
618
- if (event.clientX) {
619
- event.pageX = event.clientX + document.documentElement.scrollLeft;
620
- event.pageY = event.clientY + document.documentElement.scrollTop;
621
- }
622
-
623
- while (++index < length && !event.cancelImmediate) {
624
- if (index in events) {
625
- eventElement = events[index];
626
-
627
- if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
628
- eventElement.call(element, event);
629
- }
630
- }
631
- }
632
- };
633
-
634
- element._events[type].list = [];
635
-
636
- if (element.attachEvent) {
637
- element.attachEvent('on' + type, element._events[type]);
638
- }
639
- }
640
-
641
- element._events[type].list.push(listener);
642
- };
643
-
644
- window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
645
- var
646
- element = this,
647
- type = arguments[0],
648
- listener = arguments[1],
649
- index;
650
-
651
- if (element._events && element._events[type] && element._events[type].list) {
652
- index = indexOf(element._events[type].list, listener);
653
-
654
- if (index !== -1) {
655
- element._events[type].list.splice(index, 1);
656
-
657
- if (!element._events[type].list.length) {
658
- if (element.detachEvent) {
659
- element.detachEvent('on' + type, element._events[type]);
660
- }
661
- delete element._events[type];
662
- }
663
- }
664
- }
665
- };
666
-
667
- window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
668
- if (!arguments.length) {
669
- throw new Error('Not enough arguments');
670
- }
671
-
672
- if (!event || typeof event.type !== 'string') {
673
- throw new Error('DOM Events Exception 0');
674
- }
675
-
676
- var element = this, type = event.type;
677
-
678
- try {
679
- if (!event.bubbles) {
680
- event.cancelBubble = true;
681
-
682
- var cancelBubbleEvent = function (event) {
683
- event.cancelBubble = true;
684
-
685
- (element || window).detachEvent('on' + type, cancelBubbleEvent);
686
- };
687
-
688
- this.attachEvent('on' + type, cancelBubbleEvent);
689
- }
690
-
691
- this.fireEvent('on' + type, event);
692
- } catch (error) {
693
- event.target = element;
694
-
695
- do {
696
- event.currentTarget = element;
697
-
698
- if ('_events' in element && typeof element._events[type] === 'function') {
699
- element._events[type].call(element, event);
700
- }
701
-
702
- if (typeof element['on' + type] === 'function') {
703
- element['on' + type].call(element, event);
704
- }
705
-
706
- element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
707
- } while (element && !event.cancelBubble);
708
- }
709
-
710
- return true;
711
- };
712
-
713
- // Add the DOMContentLoaded Event
714
- document.attachEvent('onreadystatechange', function() {
715
- if (document.readyState === 'complete') {
716
- document.dispatchEvent(new Event('DOMContentLoaded', {
717
- bubbles: true
718
- }));
719
- }
720
- });
721
- }
722
- }());
723
-
724
- })
725
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
726
-
727
- (function(undefined) {
728
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
729
- var detect = 'bind' in Function.prototype;
746
+ }());
730
747
 
731
- if (detect) return
748
+ })
749
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
732
750
 
733
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
734
- Object.defineProperty(Function.prototype, 'bind', {
735
- value: function bind(that) { // .length is 1
736
- // add necessary es5-shim utilities
737
- var $Array = Array;
738
- var $Object = Object;
739
- var ObjectPrototype = $Object.prototype;
740
- var ArrayPrototype = $Array.prototype;
741
- var Empty = function Empty() {};
742
- var to_string = ObjectPrototype.toString;
743
- var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
744
- var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
745
- var array_slice = ArrayPrototype.slice;
746
- var array_concat = ArrayPrototype.concat;
747
- var array_push = ArrayPrototype.push;
748
- var max = Math.max;
749
- // /add necessary es5-shim utilities
750
-
751
- // 1. Let Target be the this value.
752
- var target = this;
753
- // 2. If IsCallable(Target) is false, throw a TypeError exception.
754
- if (!isCallable(target)) {
755
- throw new TypeError('Function.prototype.bind called on incompatible ' + target);
756
- }
757
- // 3. Let A be a new (possibly empty) internal list of all of the
758
- // argument values provided after thisArg (arg1, arg2 etc), in order.
759
- // XXX slicedArgs will stand in for "A" if used
760
- var args = array_slice.call(arguments, 1); // for normal call
761
- // 4. Let F be a new native ECMAScript object.
762
- // 11. Set the [[Prototype]] internal property of F to the standard
763
- // built-in Function prototype object as specified in 15.3.3.1.
764
- // 12. Set the [[Call]] internal property of F as described in
765
- // 15.3.4.5.1.
766
- // 13. Set the [[Construct]] internal property of F as described in
767
- // 15.3.4.5.2.
768
- // 14. Set the [[HasInstance]] internal property of F as described in
769
- // 15.3.4.5.3.
770
- var bound;
771
- var binder = function () {
772
-
773
- if (this instanceof bound) {
774
- // 15.3.4.5.2 [[Construct]]
775
- // When the [[Construct]] internal method of a function object,
776
- // F that was created using the bind function is called with a
777
- // list of arguments ExtraArgs, the following steps are taken:
778
- // 1. Let target be the value of F's [[TargetFunction]]
779
- // internal property.
780
- // 2. If target has no [[Construct]] internal method, a
781
- // TypeError exception is thrown.
782
- // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
783
- // property.
784
- // 4. Let args be a new list containing the same values as the
785
- // list boundArgs in the same order followed by the same
786
- // values as the list ExtraArgs in the same order.
787
- // 5. Return the result of calling the [[Construct]] internal
788
- // method of target providing args as the arguments.
789
-
790
- var result = target.apply(
791
- this,
792
- array_concat.call(args, array_slice.call(arguments))
793
- );
794
- if ($Object(result) === result) {
795
- return result;
796
- }
797
- return this;
798
-
799
- } else {
800
- // 15.3.4.5.1 [[Call]]
801
- // When the [[Call]] internal method of a function object, F,
802
- // which was created using the bind function is called with a
803
- // this value and a list of arguments ExtraArgs, the following
804
- // steps are taken:
805
- // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
806
- // property.
807
- // 2. Let boundThis be the value of F's [[BoundThis]] internal
808
- // property.
809
- // 3. Let target be the value of F's [[TargetFunction]] internal
810
- // property.
811
- // 4. Let args be a new list containing the same values as the
812
- // list boundArgs in the same order followed by the same
813
- // values as the list ExtraArgs in the same order.
814
- // 5. Return the result of calling the [[Call]] internal method
815
- // of target providing boundThis as the this value and
816
- // providing args as the arguments.
817
-
818
- // equiv: target.call(this, ...boundArgs, ...args)
819
- return target.apply(
820
- that,
821
- array_concat.call(args, array_slice.call(arguments))
822
- );
823
-
824
- }
825
-
826
- };
827
-
828
- // 15. If the [[Class]] internal property of Target is "Function", then
829
- // a. Let L be the length property of Target minus the length of A.
830
- // b. Set the length own property of F to either 0 or L, whichever is
831
- // larger.
832
- // 16. Else set the length own property of F to 0.
833
-
834
- var boundLength = max(0, target.length - args.length);
835
-
836
- // 17. Set the attributes of the length own property of F to the values
837
- // specified in 15.3.5.1.
838
- var boundArgs = [];
839
- for (var i = 0; i < boundLength; i++) {
840
- array_push.call(boundArgs, '$' + i);
841
- }
751
+ // @ts-nocheck
842
752
 
843
- // XXX Build a dynamic function with desired amount of arguments is the only
844
- // way to set the length property of a function.
845
- // In environments where Content Security Policies enabled (Chrome extensions,
846
- // for ex.) all use of eval or Function costructor throws an exception.
847
- // However in all of these environments Function.prototype.bind exists
848
- // and so this code will never be executed.
849
- bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
850
-
851
- if (target.prototype) {
852
- Empty.prototype = target.prototype;
853
- bound.prototype = new Empty();
854
- // Clean up dangling references.
855
- Empty.prototype = null;
856
- }
753
+ (function(undefined) {
754
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
755
+ var detect = 'bind' in Function.prototype;
857
756
 
858
- // TODO
859
- // 18. Set the [[Extensible]] internal property of F to true.
860
-
861
- // TODO
862
- // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
863
- // 20. Call the [[DefineOwnProperty]] internal method of F with
864
- // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
865
- // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
866
- // false.
867
- // 21. Call the [[DefineOwnProperty]] internal method of F with
868
- // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
869
- // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
870
- // and false.
871
-
872
- // TODO
873
- // NOTE Function objects created using Function.prototype.bind do not
874
- // have a prototype property or the [[Code]], [[FormalParameters]], and
875
- // [[Scope]] internal properties.
876
- // XXX can't delete prototype in pure-js.
877
-
878
- // 22. Return F.
879
- return bound;
880
- }
881
- });
882
- })
883
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
884
-
885
- var KEY_SPACE = 32;
886
- var DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
887
-
888
- /**
889
- * JavaScript enhancements for the Button component
890
- *
891
- * @class
892
- * @param {HTMLElement} $module - The element this component controls
893
- * @param {ButtonConfig} config - Button config
894
- */
895
- function Button ($module, config) {
896
- if (!$module) {
897
- return this
757
+ if (detect) return
758
+
759
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
760
+ Object.defineProperty(Function.prototype, 'bind', {
761
+ value: function bind(that) { // .length is 1
762
+ // add necessary es5-shim utilities
763
+ var $Array = Array;
764
+ var $Object = Object;
765
+ var ObjectPrototype = $Object.prototype;
766
+ var ArrayPrototype = $Array.prototype;
767
+ var Empty = function Empty() {};
768
+ var to_string = ObjectPrototype.toString;
769
+ var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
770
+ var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
771
+ var array_slice = ArrayPrototype.slice;
772
+ var array_concat = ArrayPrototype.concat;
773
+ var array_push = ArrayPrototype.push;
774
+ var max = Math.max;
775
+ // /add necessary es5-shim utilities
776
+
777
+ // 1. Let Target be the this value.
778
+ var target = this;
779
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
780
+ if (!isCallable(target)) {
781
+ throw new TypeError('Function.prototype.bind called on incompatible ' + target);
782
+ }
783
+ // 3. Let A be a new (possibly empty) internal list of all of the
784
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
785
+ // XXX slicedArgs will stand in for "A" if used
786
+ var args = array_slice.call(arguments, 1); // for normal call
787
+ // 4. Let F be a new native ECMAScript object.
788
+ // 11. Set the [[Prototype]] internal property of F to the standard
789
+ // built-in Function prototype object as specified in 15.3.3.1.
790
+ // 12. Set the [[Call]] internal property of F as described in
791
+ // 15.3.4.5.1.
792
+ // 13. Set the [[Construct]] internal property of F as described in
793
+ // 15.3.4.5.2.
794
+ // 14. Set the [[HasInstance]] internal property of F as described in
795
+ // 15.3.4.5.3.
796
+ var bound;
797
+ var binder = function () {
798
+
799
+ if (this instanceof bound) {
800
+ // 15.3.4.5.2 [[Construct]]
801
+ // When the [[Construct]] internal method of a function object,
802
+ // F that was created using the bind function is called with a
803
+ // list of arguments ExtraArgs, the following steps are taken:
804
+ // 1. Let target be the value of F's [[TargetFunction]]
805
+ // internal property.
806
+ // 2. If target has no [[Construct]] internal method, a
807
+ // TypeError exception is thrown.
808
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
809
+ // property.
810
+ // 4. Let args be a new list containing the same values as the
811
+ // list boundArgs in the same order followed by the same
812
+ // values as the list ExtraArgs in the same order.
813
+ // 5. Return the result of calling the [[Construct]] internal
814
+ // method of target providing args as the arguments.
815
+
816
+ var result = target.apply(
817
+ this,
818
+ array_concat.call(args, array_slice.call(arguments))
819
+ );
820
+ if ($Object(result) === result) {
821
+ return result;
822
+ }
823
+ return this;
824
+
825
+ } else {
826
+ // 15.3.4.5.1 [[Call]]
827
+ // When the [[Call]] internal method of a function object, F,
828
+ // which was created using the bind function is called with a
829
+ // this value and a list of arguments ExtraArgs, the following
830
+ // steps are taken:
831
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
832
+ // property.
833
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
834
+ // property.
835
+ // 3. Let target be the value of F's [[TargetFunction]] internal
836
+ // property.
837
+ // 4. Let args be a new list containing the same values as the
838
+ // list boundArgs in the same order followed by the same
839
+ // values as the list ExtraArgs in the same order.
840
+ // 5. Return the result of calling the [[Call]] internal method
841
+ // of target providing boundThis as the this value and
842
+ // providing args as the arguments.
843
+
844
+ // equiv: target.call(this, ...boundArgs, ...args)
845
+ return target.apply(
846
+ that,
847
+ array_concat.call(args, array_slice.call(arguments))
848
+ );
849
+
850
+ }
851
+
852
+ };
853
+
854
+ // 15. If the [[Class]] internal property of Target is "Function", then
855
+ // a. Let L be the length property of Target minus the length of A.
856
+ // b. Set the length own property of F to either 0 or L, whichever is
857
+ // larger.
858
+ // 16. Else set the length own property of F to 0.
859
+
860
+ var boundLength = max(0, target.length - args.length);
861
+
862
+ // 17. Set the attributes of the length own property of F to the values
863
+ // specified in 15.3.5.1.
864
+ var boundArgs = [];
865
+ for (var i = 0; i < boundLength; i++) {
866
+ array_push.call(boundArgs, '$' + i);
867
+ }
868
+
869
+ // XXX Build a dynamic function with desired amount of arguments is the only
870
+ // way to set the length property of a function.
871
+ // In environments where Content Security Policies enabled (Chrome extensions,
872
+ // for ex.) all use of eval or Function costructor throws an exception.
873
+ // However in all of these environments Function.prototype.bind exists
874
+ // and so this code will never be executed.
875
+ bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
876
+
877
+ if (target.prototype) {
878
+ Empty.prototype = target.prototype;
879
+ bound.prototype = new Empty();
880
+ // Clean up dangling references.
881
+ Empty.prototype = null;
882
+ }
883
+
884
+ // TODO
885
+ // 18. Set the [[Extensible]] internal property of F to true.
886
+
887
+ // TODO
888
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
889
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
890
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
891
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
892
+ // false.
893
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
894
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
895
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
896
+ // and false.
897
+
898
+ // TODO
899
+ // NOTE Function objects created using Function.prototype.bind do not
900
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
901
+ // [[Scope]] internal properties.
902
+ // XXX can't delete prototype in pure-js.
903
+
904
+ // 22. Return F.
905
+ return bound;
906
+ }
907
+ });
908
+ })
909
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
910
+
911
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
912
+
913
+ var KEY_SPACE = 32;
914
+ var DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
915
+
916
+ /**
917
+ * JavaScript enhancements for the Button component
918
+ *
919
+ * @class
920
+ * @param {Element} $module - HTML element to use for button
921
+ * @param {ButtonConfig} [config] - Button config
922
+ */
923
+ function Button ($module, config) {
924
+ if (!($module instanceof HTMLElement)) {
925
+ return this
926
+ }
927
+
928
+ /** @deprecated Will be made private in v5.0 */
929
+ this.$module = $module;
930
+
931
+ /** @deprecated Will be made private in v5.0 */
932
+ this.debounceFormSubmitTimer = null;
933
+
934
+ var defaultConfig = {
935
+ preventDoubleClick: false
936
+ };
937
+
938
+ /**
939
+ * @deprecated Will be made private in v5.0
940
+ * @type {ButtonConfig}
941
+ */
942
+ this.config = mergeConfigs(
943
+ defaultConfig,
944
+ config || {},
945
+ normaliseDataset($module.dataset)
946
+ );
898
947
  }
899
948
 
900
- this.$module = $module;
901
- this.debounceFormSubmitTimer = null;
949
+ /**
950
+ * Initialise component
951
+ */
952
+ Button.prototype.init = function () {
953
+ // Check that required elements are present
954
+ if (!this.$module) {
955
+ return
956
+ }
902
957
 
903
- var defaultConfig = {
904
- preventDoubleClick: false
958
+ this.$module.addEventListener('keydown', this.handleKeyDown);
959
+ this.$module.addEventListener('click', this.debounce.bind(this));
905
960
  };
906
- this.config = mergeConfigs(
907
- defaultConfig,
908
- config || {},
909
- normaliseDataset($module.dataset)
910
- );
911
- }
912
-
913
- /**
914
- * Initialise component
915
- */
916
- Button.prototype.init = function () {
917
- if (!this.$module) {
918
- return
919
- }
920
961
 
921
- this.$module.addEventListener('keydown', this.handleKeyDown);
922
- this.$module.addEventListener('click', this.debounce.bind(this));
923
- };
924
-
925
- /**
926
- * Trigger a click event when the space key is pressed
927
- *
928
- * Some screen readers tell users they can activate things with the 'button'
929
- * role, so we need to match the functionality of native HTML buttons
930
- *
931
- * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270
932
- *
933
- * @param {KeyboardEvent} event
934
- */
935
- Button.prototype.handleKeyDown = function (event) {
936
- var target = event.target;
937
-
938
- if (target.getAttribute('role') === 'button' && event.keyCode === KEY_SPACE) {
939
- event.preventDefault(); // prevent the page from scrolling
940
- target.click();
941
- }
942
- };
943
-
944
- /**
945
- * Debounce double-clicks
946
- *
947
- * If the click quickly succeeds a previous click then nothing will happen. This
948
- * stops people accidentally causing multiple form submissions by double
949
- * clicking buttons.
950
- *
951
- * @param {MouseEvent} event
952
- * @returns {undefined | false} - Returns undefined, or false when debounced
953
- */
954
- Button.prototype.debounce = function (event) {
955
- // Check the button that was clicked has preventDoubleClick enabled
956
- if (!this.config.preventDoubleClick) {
957
- return
958
- }
962
+ /**
963
+ * Trigger a click event when the space key is pressed
964
+ *
965
+ * Some screen readers tell users they can activate things with the 'button'
966
+ * role, so we need to match the functionality of native HTML buttons
967
+ *
968
+ * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270
969
+ *
970
+ * @deprecated Will be made private in v5.0
971
+ * @param {KeyboardEvent} event - Keydown event
972
+ */
973
+ Button.prototype.handleKeyDown = function (event) {
974
+ var $target = event.target;
959
975
 
960
- // If the timer is still running, prevent the click from submitting the form
961
- if (this.debounceFormSubmitTimer) {
962
- event.preventDefault();
963
- return false
964
- }
976
+ // Handle space bar only
977
+ if (event.keyCode !== KEY_SPACE) {
978
+ return
979
+ }
965
980
 
966
- this.debounceFormSubmitTimer = setTimeout(function () {
967
- this.debounceFormSubmitTimer = null;
968
- }.bind(this), DEBOUNCE_TIMEOUT_IN_SECONDS * 1000);
969
- };
981
+ // Handle elements with [role="button"] only
982
+ if ($target instanceof HTMLElement && $target.getAttribute('role') === 'button') {
983
+ event.preventDefault(); // prevent the page from scrolling
984
+ $target.click();
985
+ }
986
+ };
970
987
 
971
- /**
972
- * Button config
973
- *
974
- * @typedef {object} ButtonConfig
975
- * @property {boolean} [preventDoubleClick = false] -
976
- * Prevent accidental double clicks on submit buttons from submitting forms
977
- * multiple times.
978
- */
988
+ /**
989
+ * Debounce double-clicks
990
+ *
991
+ * If the click quickly succeeds a previous click then nothing will happen. This
992
+ * stops people accidentally causing multiple form submissions by double
993
+ * clicking buttons.
994
+ *
995
+ * @deprecated Will be made private in v5.0
996
+ * @param {MouseEvent} event - Mouse click event
997
+ * @returns {undefined | false} Returns undefined, or false when debounced
998
+ */
999
+ Button.prototype.debounce = function (event) {
1000
+ // Check the button that was clicked has preventDoubleClick enabled
1001
+ if (!this.config.preventDoubleClick) {
1002
+ return
1003
+ }
1004
+
1005
+ // If the timer is still running, prevent the click from submitting the form
1006
+ if (this.debounceFormSubmitTimer) {
1007
+ event.preventDefault();
1008
+ return false
1009
+ }
1010
+
1011
+ this.debounceFormSubmitTimer = setTimeout(function () {
1012
+ this.debounceFormSubmitTimer = null;
1013
+ }.bind(this), DEBOUNCE_TIMEOUT_IN_SECONDS * 1000);
1014
+ };
1015
+
1016
+ /**
1017
+ * Button config
1018
+ *
1019
+ * @typedef {object} ButtonConfig
1020
+ * @property {boolean} [preventDoubleClick = false] - Prevent accidental double
1021
+ * clicks on submit buttons from submitting forms multiple times.
1022
+ */
979
1023
 
980
- return Button;
1024
+ return Button;
981
1025
 
982
1026
  })));
1027
+ //# sourceMappingURL=button.js.map