@schukai/monster 3.71.0 → 3.71.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
 
4
4
 
5
+ ## [3.71.2] - 2024-06-25
6
+
7
+ ### Bug Fixes
8
+
9
+ - data-monster-option-filter [#194](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/194)
10
+
11
+
12
+
13
+ ## [3.71.1] - 2024-06-25
14
+
15
+ ### Bug Fixes
16
+
17
+ - remove polifill [#218](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/218)
18
+
19
+
20
+
5
21
  ## [3.71.0] - 2024-06-25
6
22
 
7
23
  ### Add Features
package/README.md CHANGED
@@ -76,14 +76,7 @@ Voilà!
76
76
  ### Polyfill
77
77
 
78
78
  While we strive to work around some browser bugs, generally, we do not use polyfills or feature detection.
79
- However, many functions can be supplemented through [polyfill.io](https://polyfill.io/), thus enhancing compatibility.
80
-
81
- ```html
82
- <script id="polyfill"
83
- src="https://polyfill.io/v3/polyfill.min.js?features=AbortController,Array.prototype.entries,Array.prototype.fill,Array.prototype.find,Array.prototype.includes,Array.prototype.keys,Array.prototype.sort,Array.prototype.values,atob,AudioContext,blissfuljs,Blob,CharacterData.prototype.nextElementSibling,CharacterData.prototype.previousElementSibling,CharacterData.prototype.remove,console,console.error,console.log,CSS.supports,CustomEvent,DocumentFragment,DocumentFragment.prototype.append,DocumentFragment.prototype.prepend,DOMRect,DOMTokenList,DOMTokenList.prototype.forEach,DOMTokenList.prototype.replace,Element.prototype.append,Element.prototype.getAttributeNames,Element.prototype.prepend,Element.prototype.remove,Element.prototype.scroll,Event,EventSource,fetch,Function.prototype.name,globalThis,HTMLDocument,HTMLPictureElement,HTMLTemplateElement,IntersectionObserver,IntersectionObserverEntry,Intl,Intl.DateTimeFormat,Intl.NumberFormat,Intl.PluralRules,Map,Math.log2,MutationObserver,Node.prototype.contains,Node.prototype.getRootNode,Node.prototype.isConnected,Node.prototype.isSameNode,NodeList.prototype.forEach,Number.isFinite,Number.isInteger,Object.assign,Object.entries,Object.freeze,Object.getOwnPropertyNames,Object.prototype.toString,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,requestAnimationFrame,ResizeObserver,Set,String.prototype.includes,String.prototype.matchAll,String.prototype.padStart,Symbol,Symbol.for,Symbol.hasInstance,Symbol.iterator,TextDecoder,TextEncoder,Uint16Array,Uint8Array,URLSearchParams,WeakSet"
84
- crossorigin="anonymous"
85
- referrerpolicy="no-referrer"></script>
86
- ```
79
+ However, many functions can be supplemented through polyfills, thus enhancing compatibility.
87
80
 
88
81
  ## Questions
89
82
 
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.5","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.71.0"}
1
+ {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.6","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.71.2"}
@@ -12,24 +12,24 @@
12
12
  * SPDX-License-Identifier: AGPL-3.0
13
13
  */
14
14
 
15
- import { instanceSymbol } from "../../constants.mjs";
16
- import { addAttributeToken } from "../../dom/attributes.mjs";
15
+ import {instanceSymbol} from "../../constants.mjs";
16
+ import {addAttributeToken} from "../../dom/attributes.mjs";
17
17
  import {
18
- ATTRIBUTE_ERRORMESSAGE,
19
- ATTRIBUTE_ROLE,
18
+ ATTRIBUTE_ERRORMESSAGE,
19
+ ATTRIBUTE_ROLE,
20
20
  } from "../../dom/constants.mjs";
21
21
  import {
22
- assembleMethodSymbol,
23
- attributeObserverSymbol,
24
- CustomElement,
25
- initMethodSymbol,
26
- registerCustomElement,
22
+ assembleMethodSymbol,
23
+ attributeObserverSymbol,
24
+ CustomElement,
25
+ initMethodSymbol,
26
+ registerCustomElement,
27
27
  } from "../../dom/customelement.mjs";
28
- import { isString } from "../../types/is.mjs";
29
- import { ATTRIBUTE_FORM_RELOAD, ATTRIBUTE_FORM_URL } from "./constants.mjs";
30
- import { loadAndAssignContent } from "./util/fetch.mjs";
28
+ import {isString} from "../../types/is.mjs";
29
+ import {ATTRIBUTE_FORM_RELOAD, ATTRIBUTE_FORM_URL} from "./constants.mjs";
30
+ import {loadAndAssignContent} from "./util/fetch.mjs";
31
31
 
32
- export { Reload };
32
+ export {Reload};
33
33
 
34
34
  /**
35
35
  * @private
@@ -106,128 +106,128 @@ const intersectionObserverWasInitialized = Symbol("wasInitialized");
106
106
  * @fires Monster.Components.event:monster-fetched
107
107
  */
108
108
  class Reload extends CustomElement {
109
- /**
110
- * This method is called by the `instanceof` operator.
111
- * @returns {symbol}
112
- * @since 2.1.0
113
- */
114
- static get [instanceSymbol]() {
115
- return Symbol.for("@schukai/monster/components/form/reload");
116
- }
117
-
118
- /**
119
- * To set the options via the html tag the attribute `data-monster-options` must be used.
120
- * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
121
- *
122
- * The individual configuration values can be found in the table.
123
- *
124
- * @property {Object} templates Template definitions
125
- * @property {string} templates.main Main template
126
- * @property {string} url=undefined
127
- * @property {string} reload=undefined currently the values defined are `onshow` and `always`. The default `onshow` removes the IntersectionObserver. This means that the content is only loaded once. reloading of the content does not occur.
128
- * @property {string} filter=undefined dom selectors to search for elements, if undefined then everything is taken
129
- * @property {Monster.Components.Form.Processor[]} processors
130
- * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
131
- * @property {String} fetch.redirect=error
132
- * @property {String} fetch.method=GET
133
- * @property {String} fetch.mode=same-origin
134
- * @property {String} fetch.credentials=same-origin
135
- * @property {Object} fetch.headers={"accept":"text/html"}}
136
- */
137
- get defaults() {
138
- return Object.assign(
139
- {},
140
- super.defaults,
141
- {
142
- templates: {
143
- main: getTemplate.call(this),
144
- },
145
- shadowMode: false,
146
- url: undefined,
147
- reload: "onshow",
148
- filter: undefined,
149
- fetch: {
150
- redirect: "error",
151
- method: "GET",
152
- mode: "same-origin",
153
- credentials: "same-origin",
154
- headers: {
155
- accept: "text/html",
156
- },
157
- },
158
- },
159
- initOptionsFromArguments.call(this),
160
- );
161
- }
162
-
163
- /**
164
- * This method determines which attributes are to be monitored by `attributeChangedCallback()`.
165
- *
166
- * @return {string[]}
167
- */
168
- static get observedAttributes() {
169
- const list = super.observedAttributes;
170
- list.push(ATTRIBUTE_FORM_URL);
171
- return list;
172
- }
173
-
174
- /**
175
- * @return {void}
176
- */
177
- [initMethodSymbol]() {
178
- super[initMethodSymbol]();
179
-
180
- // data-monster-options
181
- this[attributeObserverSymbol][ATTRIBUTE_FORM_URL] = (url) => {
182
- if (this.hasAttribute(ATTRIBUTE_FORM_URL)) {
183
- this.setOption("url", new URL(url, document.location).toString());
184
- } else {
185
- this.setOption("url", undefined);
186
- }
187
- };
188
- }
189
-
190
- /**
191
- * This method is called internal and should not be called directly.
192
- * @throws {Error} missing default slot
193
- * @throws {Error} no shadow-root is defined
194
- * @throws {Error} missing url
195
- * @throws {Error} we won't be able to read the data
196
- * @throws {Error} request failed
197
- * @throws {Error} not found
198
- * @throws {Error} undefined status or type
199
- * @fires Monster.Components.event:monster-fetched
200
- * @return {Monster.Components.Form.Form}
201
- */
202
- [assembleMethodSymbol]() {
203
- super[assembleMethodSymbol]();
204
- initIntersectionObserver.call(this);
205
- }
206
-
207
- /**
208
- * This method is called internal and should not be called directly.
209
- *
210
- * @return {string}
211
- */
212
- static getTag() {
213
- return "monster-reload";
214
- }
215
-
216
- /**
217
- * load content from url
218
- *
219
- * It is important to know that with this function the loading is executed
220
- * directly. it is loaded as well when the element is not visible.
221
- *
222
- * @param {string|undefined} url
223
- */
224
- fetch(url) {
225
- if (isString(url) || url instanceof URL) {
226
- this.setAttribute(ATTRIBUTE_FORM_URL, `${url}`);
227
- }
228
-
229
- return loadContent.call(this);
230
- }
109
+ /**
110
+ * This method is called by the `instanceof` operator.
111
+ * @returns {symbol}
112
+ * @since 2.1.0
113
+ */
114
+ static get [instanceSymbol]() {
115
+ return Symbol.for("@schukai/monster/components/form/reload");
116
+ }
117
+
118
+ /**
119
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
120
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
121
+ *
122
+ * The individual configuration values can be found in the table.
123
+ *
124
+ * @property {Object} templates Template definitions
125
+ * @property {string} templates.main Main template
126
+ * @property {string} url=undefined
127
+ * @property {string} reload=undefined currently the values defined are `onshow` and `always`. The default `onshow` removes the IntersectionObserver. This means that the content is only loaded once. reloading of the content does not occur.
128
+ * @property {string} filter=undefined dom selectors to search for elements, if undefined then everything is taken
129
+ * @property {Monster.Components.Form.Processor[]} processors
130
+ * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
131
+ * @property {String} fetch.redirect=error
132
+ * @property {String} fetch.method=GET
133
+ * @property {String} fetch.mode=same-origin
134
+ * @property {String} fetch.credentials=same-origin
135
+ * @property {Object} fetch.headers={"accept":"text/html"}}
136
+ */
137
+ get defaults() {
138
+ return Object.assign(
139
+ {},
140
+ super.defaults,
141
+ {
142
+ templates: {
143
+ main: getTemplate.call(this),
144
+ },
145
+ shadowMode: null,
146
+ url: null,
147
+ reload: "onshow",
148
+ filter: null,
149
+ fetch: {
150
+ redirect: "error",
151
+ method: "GET",
152
+ mode: "same-origin",
153
+ credentials: "same-origin",
154
+ headers: {
155
+ accept: "text/html",
156
+ },
157
+ },
158
+ },
159
+ initOptionsFromArguments.call(this),
160
+ );
161
+ }
162
+
163
+ /**
164
+ * This method determines which attributes are to be monitored by `attributeChangedCallback()`.
165
+ *
166
+ * @return {string[]}
167
+ */
168
+ static get observedAttributes() {
169
+ const list = super.observedAttributes;
170
+ list.push(ATTRIBUTE_FORM_URL);
171
+ return list;
172
+ }
173
+
174
+ /**
175
+ * @return {void}
176
+ */
177
+ [initMethodSymbol]() {
178
+ super[initMethodSymbol]();
179
+
180
+ // data-monster-options
181
+ this[attributeObserverSymbol][ATTRIBUTE_FORM_URL] = (url) => {
182
+ if (this.hasAttribute(ATTRIBUTE_FORM_URL)) {
183
+ this.setOption("url", new URL(url, document.location).toString());
184
+ } else {
185
+ this.setOption("url", undefined);
186
+ }
187
+ };
188
+ }
189
+
190
+ /**
191
+ * This method is called internal and should not be called directly.
192
+ * @throws {Error} missing default slot
193
+ * @throws {Error} no shadow-root is defined
194
+ * @throws {Error} missing url
195
+ * @throws {Error} we won't be able to read the data
196
+ * @throws {Error} request failed
197
+ * @throws {Error} not found
198
+ * @throws {Error} undefined status or type
199
+ * @fires Monster.Components.event:monster-fetched
200
+ * @return {Monster.Components.Form.Form}
201
+ */
202
+ [assembleMethodSymbol]() {
203
+ super[assembleMethodSymbol]();
204
+ initIntersectionObserver.call(this);
205
+ }
206
+
207
+ /**
208
+ * This method is called internal and should not be called directly.
209
+ *
210
+ * @return {string}
211
+ */
212
+ static getTag() {
213
+ return "monster-reload";
214
+ }
215
+
216
+ /**
217
+ * load content from url
218
+ *
219
+ * It is important to know that with this function the loading is executed
220
+ * directly. it is loaded as well when the element is not visible.
221
+ *
222
+ * @param {string|undefined} url
223
+ */
224
+ fetch(url) {
225
+ if (isString(url) || url instanceof URL) {
226
+ this.setAttribute(ATTRIBUTE_FORM_URL, `${url}`);
227
+ }
228
+
229
+ return loadContent.call(this);
230
+ }
231
231
  }
232
232
 
233
233
  /**
@@ -241,19 +241,19 @@ class Reload extends CustomElement {
241
241
  * @return {object}
242
242
  */
243
243
  function initOptionsFromArguments() {
244
- const options = {};
244
+ const options = {};
245
245
 
246
- const url = this.getAttribute(ATTRIBUTE_FORM_URL);
246
+ const url = this.getAttribute(ATTRIBUTE_FORM_URL);
247
247
 
248
- if (isString(url)) {
249
- options["url"] = new URL(url, document.location).toString();
250
- }
248
+ if (isString(url)) {
249
+ options["url"] = new URL(url, document.location).toString();
250
+ }
251
251
 
252
- if (this.hasAttribute(ATTRIBUTE_FORM_RELOAD)) {
253
- options["reload"] = this.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase();
254
- }
252
+ if (this.hasAttribute(ATTRIBUTE_FORM_RELOAD)) {
253
+ options["reload"] = this.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase();
254
+ }
255
255
 
256
- return options;
256
+ return options;
257
257
  }
258
258
 
259
259
  /**
@@ -268,37 +268,37 @@ function initOptionsFromArguments() {
268
268
  * @fires Monster.Components.event:monster-fetched
269
269
  */
270
270
  function initIntersectionObserver() {
271
- if (this[intersectionObserverWasInitialized] === true) {
272
- return;
273
- }
274
-
275
- this[intersectionObserverWasInitialized] = true;
276
-
277
- const options = {
278
- threshold: [0.5],
279
- };
280
-
281
- const callback = (entries, observer) => {
282
- for (const [, entry] of entries.entries()) {
283
- if (entry.isIntersecting === true) {
284
- // undefined or always do the same
285
- if (this.getOption("reload") === "onshow") {
286
- observer.disconnect();
287
- }
288
-
289
- try {
290
- loadContent.call(this).catch((e) => {
291
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString());
292
- });
293
- } catch (e) {
294
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString());
295
- }
296
- }
297
- }
298
- };
299
-
300
- const observer = new IntersectionObserver(callback, options);
301
- observer.observe(this);
271
+ if (this[intersectionObserverWasInitialized] === true) {
272
+ return;
273
+ }
274
+
275
+ this[intersectionObserverWasInitialized] = true;
276
+
277
+ const options = {
278
+ threshold: [0.5],
279
+ };
280
+
281
+ const callback = (entries, observer) => {
282
+ for (const [, entry] of entries.entries()) {
283
+ if (entry.isIntersecting === true) {
284
+ // undefined or always do the same
285
+ if (this.getOption("reload") === "onshow") {
286
+ observer.disconnect();
287
+ }
288
+
289
+ try {
290
+ loadContent.call(this).catch((e) => {
291
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString());
292
+ });
293
+ } catch (e) {
294
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString());
295
+ }
296
+ }
297
+ }
298
+ };
299
+
300
+ const observer = new IntersectionObserver(callback, options);
301
+ observer.observe(this);
302
302
  }
303
303
 
304
304
  /**
@@ -318,41 +318,41 @@ function initIntersectionObserver() {
318
318
  * @return {Promise}
319
319
  */
320
320
  function loadContent() {
321
- const url = this.getOption("url", undefined);
322
- if (!isString(url) || url === "") {
323
- throw new Error("missing url");
324
- }
325
-
326
- const options = this.getOption("fetch", {});
327
-
328
- let parentNode = this;
329
- if (this.shadowRoot) {
330
- parentNode = this.shadowRoot;
331
- }
332
-
333
- let container = parentNode.querySelector(`[${ATTRIBUTE_ROLE}=container]`);
334
- let currentDisplayMode = container?.style?.display;
335
-
336
- if (currentDisplayMode === undefined) {
337
- currentDisplayMode = "inherit";
338
- }
339
-
340
- if (!(container instanceof HTMLElement)) {
341
- container = document.createElement("div");
342
- container.style.display = "none";
343
- container.setAttribute(ATTRIBUTE_ROLE, "container");
344
- parentNode.appendChild(container);
345
- }
346
-
347
- return loadAndAssignContent(container, url, options, this.getOption("filter"))
348
- .then(() => {
349
- if (currentDisplayMode !== undefined) {
350
- container.style.display = currentDisplayMode;
351
- }
352
- })
353
- .catch((e) => {
354
- throw e;
355
- });
321
+ const url = this.getOption("url", undefined);
322
+ if (!isString(url) || url === "") {
323
+ throw new Error("missing url");
324
+ }
325
+
326
+ const options = this.getOption("fetch", {});
327
+
328
+ let parentNode = this;
329
+ if (this.shadowRoot) {
330
+ parentNode = this.shadowRoot;
331
+ }
332
+
333
+ let container = parentNode.querySelector(`[${ATTRIBUTE_ROLE}=container]`);
334
+ let currentDisplayMode = container?.style?.display;
335
+
336
+ if (currentDisplayMode === undefined) {
337
+ currentDisplayMode = "inherit";
338
+ }
339
+
340
+ if (!(container instanceof HTMLElement)) {
341
+ container = document.createElement("div");
342
+ container.style.display = "none";
343
+ container.setAttribute(ATTRIBUTE_ROLE, "container");
344
+ parentNode.appendChild(container);
345
+ }
346
+
347
+ return loadAndAssignContent(container, url, options, this.getOption("filter"))
348
+ .then(() => {
349
+ if (currentDisplayMode !== undefined) {
350
+ container.style.display = currentDisplayMode;
351
+ }
352
+ })
353
+ .catch((e) => {
354
+ throw e;
355
+ });
356
356
  }
357
357
 
358
358
  /**
@@ -360,7 +360,7 @@ function loadContent() {
360
360
  * @return {string}
361
361
  */
362
362
  function getTemplate() {
363
- return this.innerHTML;
363
+ return this.innerHTML;
364
364
  }
365
365
 
366
366
  registerCustomElement(Reload);
@@ -5,12 +5,6 @@
5
5
  <title>Mocha Monster</title>
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
7
7
  <link rel="stylesheet" href="mocha.css"/>
8
- <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=AbortController,Array.prototype.entries,Array.prototype.fill,Array.prototype.find,Array.prototype.includes,Array.prototype.keys,Array.prototype.sort,Array.prototype.values,atob,AudioContext,blissfuljs,Blob,CharacterData.prototype.nextElementSibling,CharacterData.prototype.previousElementSibling,CharacterData.prototype.remove,console,console.error,console.log,CSS.supports,CustomEvent,DocumentFragment,DocumentFragment.prototype.append,DocumentFragment.prototype.prepend,DOMRect,DOMTokenList,DOMTokenList.prototype.forEach,DOMTokenList.prototype.replace,Element.prototype.append,Element.prototype.getAttributeNames,Element.prototype.prepend,Element.prototype.remove,Element.prototype.scroll,Event,EventSource,fetch,Function.prototype.name,globalThis,HTMLDocument,HTMLPictureElement,HTMLTemplateElement,IntersectionObserver,IntersectionObserverEntry,Intl,Intl.DateTimeFormat,Intl.NumberFormat,Intl.PluralRules,Map,Math.log2,MutationObserver,Node.prototype.contains,Node.prototype.getRootNode,Node.prototype.isConnected,Node.prototype.isSameNode,NodeList.prototype.forEach,Number.isFinite,Number.isInteger,Object.assign,Object.entries,Object.freeze,Object.getOwnPropertyNames,Object.prototype.toString,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,requestAnimationFrame,ResizeObserver,Set,String.prototype.includes,String.prototype.matchAll,String.prototype.padStart,Symbol,Symbol.for,Symbol.hasInstance,Symbol.iterator,TextDecoder,TextEncoder,Uint16Array,Uint8Array,URLSearchParams,WeakSet"
9
- src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.every,Array.prototype.fill,Array.prototype.filter,Array.prototype.find,Array.prototype.forEach,Array.prototype.includes,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.some,Array.prototype.sort,Array.prototype.values,ArrayBuffer,atob,Blob,console,CustomEvent,DataView,Date.prototype.toISOString,document,Document,DocumentFragment,Element,Event,fetch,Function.prototype.bind,getComputedStyle,globalThis,HTMLDocument,HTMLTemplateElement,IntersectionObserver,Intl,JSON,Map,Math.log2,MutationObserver,Number.isFinite,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,requestAnimationFrame,ResizeObserver,Set,String.prototype.endsWith,String.prototype.includes,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.for,Symbol.hasInstance,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet"
10
- src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,DataView,document,DocumentFragment,Element,Event,globalThis,HTMLDocument,HTMLTemplateElement,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.getOwnPropertyDescriptor,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,WeakMap,WeakSet"
11
- crossorigin="anonymous"
12
- referrerpolicy="no-referrer"></script>
13
- <script src="https://cdn.jsdelivr.net/npm/element-internals-polyfill"></script>
14
8
 
15
9
  </head>
16
10
  <body>