@redvars/peacock 3.2.8 → 3.2.10

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.
Files changed (86) hide show
  1. package/dist/{PeacockComponent-DMrFEGDh.js → PeacockComponent-CxJc63xj.js} +6 -13
  2. package/dist/PeacockComponent-CxJc63xj.js.map +1 -0
  3. package/dist/assets/styles.css +1 -1
  4. package/dist/assets/styles.css.map +1 -1
  5. package/dist/assets/tokens.css +2 -0
  6. package/dist/assets/tokens.css.map +1 -0
  7. package/dist/{button-BtpAXuLN.js → button-DaL4va7Q.js} +12 -294
  8. package/dist/button-DaL4va7Q.js.map +1 -0
  9. package/dist/button-group.js +3 -2
  10. package/dist/button-group.js.map +1 -1
  11. package/dist/button.js +6 -4
  12. package/dist/button.js.map +1 -1
  13. package/dist/{class-map-CbncA34D.js → class-map-BvQRv7eW.js} +3 -2
  14. package/dist/class-map-BvQRv7eW.js.map +1 -0
  15. package/dist/clock.js +85 -0
  16. package/dist/clock.js.map +1 -0
  17. package/dist/code-editor.js +43877 -0
  18. package/dist/code-editor.js.map +1 -0
  19. package/dist/code-highlighter.js +5 -4
  20. package/dist/code-highlighter.js.map +1 -1
  21. package/dist/custom-elements-jsdocs.json +561 -0
  22. package/dist/custom-elements.json +777 -194
  23. package/dist/directive-Cuw6h7YA.js +9 -0
  24. package/dist/directive-Cuw6h7YA.js.map +1 -0
  25. package/dist/dispatch-event-utils-vbdiOSeC.js +290 -0
  26. package/dist/dispatch-event-utils-vbdiOSeC.js.map +1 -0
  27. package/dist/{breadcrumb-item-DkhwoMAH.js → image-v3BujlY5.js} +261 -92
  28. package/dist/image-v3BujlY5.js.map +1 -0
  29. package/dist/index.js +12 -87
  30. package/dist/index.js.map +1 -1
  31. package/dist/number-counter.js +3 -2
  32. package/dist/number-counter.js.map +1 -1
  33. package/dist/observe-theme-change-NneLARW8.js +51 -0
  34. package/dist/observe-theme-change-NneLARW8.js.map +1 -0
  35. package/dist/peacock-loader.js +22 -11
  36. package/dist/peacock-loader.js.map +1 -1
  37. package/dist/src/code-editor/code-editor.d.ts +45 -0
  38. package/dist/src/code-editor/index.d.ts +2 -0
  39. package/dist/src/image/image.d.ts +45 -0
  40. package/dist/src/image/index.d.ts +1 -0
  41. package/dist/src/index.d.ts +2 -0
  42. package/dist/src/utils/dispatch-event-utils.d.ts +72 -0
  43. package/dist/src/utils/observe-theme-change.d.ts +3 -0
  44. package/dist/src/utils.d.ts +1 -72
  45. package/dist/{state-CEVpI7Vv.js → state-B09bP3XH.js} +2 -2
  46. package/dist/{state-CEVpI7Vv.js.map → state-B09bP3XH.js.map} +1 -1
  47. package/dist/{style-map-mOmZwsJT.js → style-map-B8xgVEc9.js} +3 -2
  48. package/dist/style-map-B8xgVEc9.js.map +1 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/dist/{unsafe-html-Ca00SXpn.js → unsafe-html-B-dV3Jps.js} +3 -2
  51. package/dist/unsafe-html-B-dV3Jps.js.map +1 -0
  52. package/package.json +5 -3
  53. package/readme.md +2 -2
  54. package/scss/styles.scss +57 -1
  55. package/scss/tokens.css +1 -0
  56. package/scss/tokens.scss +1 -0
  57. package/src/accordion/accordion-item/accordion-item.scss +1 -1
  58. package/src/button/BaseButton.ts +1 -1
  59. package/src/button/button/button.scss +1 -1
  60. package/src/clock/clock.ts +4 -1
  61. package/src/code-editor/code-editor.scss +52 -0
  62. package/src/code-editor/code-editor.ts +215 -0
  63. package/src/code-editor/demo/index.html +37 -0
  64. package/src/code-editor/index.ts +3 -0
  65. package/src/container/container.scss +1 -1
  66. package/src/date-picker/date-picker.ts +1 -1
  67. package/src/image/image.scss +56 -0
  68. package/src/image/image.ts +135 -0
  69. package/src/image/index.ts +1 -0
  70. package/src/index.ts +2 -0
  71. package/src/input/input.ts +1 -2
  72. package/src/menu/menu-item/menu-item.scss +5 -4
  73. package/src/menu/menu-list/menu-list.scss +1 -0
  74. package/src/number-field/number-field.ts +1 -1
  75. package/src/peacock-loader.ts +7 -0
  76. package/src/textarea/textarea.ts +1 -1
  77. package/src/time-picker/time-picker.ts +1 -1
  78. package/src/utils/dispatch-event-utils.ts +131 -0
  79. package/src/utils/observe-theme-change.ts +30 -0
  80. package/src/utils.ts +5 -131
  81. package/dist/PeacockComponent-DMrFEGDh.js.map +0 -1
  82. package/dist/breadcrumb-item-DkhwoMAH.js.map +0 -1
  83. package/dist/button-BtpAXuLN.js.map +0 -1
  84. package/dist/class-map-CbncA34D.js.map +0 -1
  85. package/dist/style-map-mOmZwsJT.js.map +0 -1
  86. package/dist/unsafe-html-Ca00SXpn.js.map +0 -1
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2017 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */
6
+ const t={ATTRIBUTE:1,CHILD:2,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i;}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}
7
+
8
+ export { e, i, t };
9
+ //# sourceMappingURL=directive-Cuw6h7YA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directive-Cuw6h7YA.js","sources":["../node_modules/lit-html/directive.js"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACK,MAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAwC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;;;;","x_google_ignoreList":[0]}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2017 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */
6
+ const e$1=(e,t,c)=>(c.configurable=true,c.enumerable=true,Reflect.decorate&&"object"!=typeof t&&Object.defineProperty(e,t,c),c);
7
+
8
+ /**
9
+ * @license
10
+ * Copyright 2017 Google LLC
11
+ * SPDX-License-Identifier: BSD-3-Clause
12
+ */function e(e,r){return (n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;return e$1(n,s,{get(){return o(this)}})}}
13
+
14
+ async function createCacheFetch(name) {
15
+ let cache = null;
16
+ // This map tracks requests currently being processed
17
+ const inFlightRequests = new Map();
18
+ try {
19
+ cache = await window.caches.open(name);
20
+ }
21
+ catch (e) {
22
+ console.warn('window.caches access not allowed');
23
+ }
24
+ return async (url) => {
25
+ // 1. Check if we are already fetching this URL
26
+ if (inFlightRequests.has(url)) {
27
+ // Return the existing promise instead of starting a new one
28
+ return inFlightRequests.get(url);
29
+ }
30
+ // 2. Create the main logic as a promise
31
+ const fetchPromise = (async () => {
32
+ const request = new Request(url);
33
+ // Check Cache first
34
+ if (cache) {
35
+ const cachedResponse = await cache.match(request);
36
+ if (cachedResponse) {
37
+ return cachedResponse.text();
38
+ }
39
+ }
40
+ // Prepare network request
41
+ const urlObj = new URL(request.url);
42
+ const isSameOrigin = urlObj.origin === window.location.origin;
43
+ const response = await fetch(request.url, {
44
+ method: 'GET',
45
+ mode: isSameOrigin ? 'no-cors' : 'cors',
46
+ credentials: isSameOrigin ? 'same-origin' : 'omit',
47
+ });
48
+ // --- Handle 404 ---
49
+ if (response.status === 404) {
50
+ console.error(`[Fetch Error] Resource not found (404): ${url}`);
51
+ return ''; // Return empty string as requested
52
+ }
53
+ const result = await response.text();
54
+ // Update Cache if applicable
55
+ if (cache && response.status === 200) {
56
+ // We clone the response logic by creating a new Response with the text body
57
+ await cache.put(request, new Response(result, {
58
+ status: response.status,
59
+ statusText: response.statusText,
60
+ headers: response.headers,
61
+ }));
62
+ }
63
+ return result;
64
+ })();
65
+ // 3. Store the promise in the map
66
+ inFlightRequests.set(url, fetchPromise);
67
+ try {
68
+ // 4. Wait for the result
69
+ return await fetchPromise;
70
+ }
71
+ finally {
72
+ // 5. Clean up: Remove the promise from the map when done
73
+ // This ensures subsequent calls (after this one finishes) can start fresh
74
+ inFlightRequests.delete(url);
75
+ }
76
+ };
77
+ }
78
+ // Basic sanitization: remove <script>, <foreignObject>, event handler attributes (on*), and iframes
79
+ function sanitizeSvg(rawSvg) {
80
+ try {
81
+ const parser = new DOMParser();
82
+ const doc = parser.parseFromString(rawSvg, 'image/svg+xml');
83
+ // remove script tags
84
+ const scripts = Array.from(doc.querySelectorAll('script'));
85
+ scripts.forEach(n => n.remove());
86
+ // remove foreignObject and iframe-like elements
87
+ const foreigns = Array.from(doc.querySelectorAll('foreignObject, iframe'));
88
+ foreigns.forEach(n => n.remove());
89
+ // remove event handler attributes like onload, onclick, etc.
90
+ const all = Array.from(doc.querySelectorAll('*'));
91
+ all.forEach(el => {
92
+ const attrs = Array.from(el.attributes).filter(a => /^on/i.test(a.name));
93
+ attrs.forEach(a => el.removeAttribute(a.name));
94
+ });
95
+ const el = doc.documentElement;
96
+ if (!el)
97
+ return '';
98
+ // serialize back to string
99
+ const serializer = new XMLSerializer();
100
+ return serializer.serializeToString(el);
101
+ }
102
+ catch (e) {
103
+ // parsing failed; fall back to empty content to avoid injecting unsafe content
104
+ return '';
105
+ }
106
+ }
107
+ function __hasMeaningfulContent(slotElement) {
108
+ const nodes = slotElement.assignedNodes({ flatten: true });
109
+ for (const node of nodes) {
110
+ // If it's an element node, it has content
111
+ if (node.nodeType === Node.ELEMENT_NODE) {
112
+ return true;
113
+ }
114
+ // If it's a text node and contains non-whitespace characters, it has content
115
+ if (node.nodeType === Node.TEXT_NODE &&
116
+ node.textContent.trim().length > 0) {
117
+ return true;
118
+ }
119
+ }
120
+ // No meaningful content found
121
+ return false;
122
+ }
123
+ function observerSlotChangesWithCallback(slot, callback) {
124
+ const observer = new MutationObserver(() => {
125
+ callback(__hasMeaningfulContent(slot));
126
+ });
127
+ // Observe the elements currently assigned to the slot
128
+ const assignedNodes = slot?.assignedNodes({ flatten: true }) || [];
129
+ assignedNodes.forEach(node => {
130
+ observer.observe(node, {
131
+ attributes: true,
132
+ childList: true,
133
+ characterData: true,
134
+ subtree: true,
135
+ });
136
+ });
137
+ callback(__hasMeaningfulContent(slot));
138
+ }
139
+ function throttle(func, delay, options = { leading: true, trailing: true }) {
140
+ let timerId;
141
+ let lastExec = 0;
142
+ return function (...args) {
143
+ // @ts-ignore
144
+ const context = this;
145
+ const now = Date.now();
146
+ const shouldCallNow = options.leading && now - lastExec >= delay;
147
+ if (shouldCallNow) {
148
+ func.apply(context, args);
149
+ lastExec = now;
150
+ }
151
+ else if (options.trailing && !timerId) {
152
+ timerId = setTimeout(() => {
153
+ func.apply(context, args);
154
+ lastExec = Date.now();
155
+ timerId = null;
156
+ }, delay);
157
+ }
158
+ };
159
+ }
160
+ function isDarkMode() {
161
+ return document.documentElement.dataset.theme === 'dark';
162
+ }
163
+
164
+ /**
165
+ * Dispatches a click event to the given element that triggers a native action,
166
+ * but is not composed and therefore is not seen outside the element.
167
+ *
168
+ * This is useful for responding to an external click event on the host element
169
+ * that should trigger an internal action like a button click.
170
+ *
171
+ * Note, a helper is provided because setting this up correctly is a bit tricky.
172
+ * In particular, calling `click` on an element creates a composed event, which
173
+ * is not desirable, and a manually dispatched event must specifically be a
174
+ * `MouseEvent` to trigger a native action.
175
+ *
176
+ * @example
177
+ * hostClickListener = (event: MouseEvent) {
178
+ * if (isActivationClick(event)) {
179
+ * this.dispatchActivationClick(this.buttonElement);
180
+ * }
181
+ * }
182
+ *
183
+ */
184
+ function dispatchActivationClick(element) {
185
+ const event = new MouseEvent('click', { bubbles: true });
186
+ element.dispatchEvent(event);
187
+ return event;
188
+ }
189
+ // Ignore events for one microtask only.
190
+ let isSquelchingEvents = false;
191
+ async function __squelchEventsForMicrotask() {
192
+ isSquelchingEvents = true;
193
+ // Need to pause for just one microtask.
194
+ // tslint:disable-next-line
195
+ await null;
196
+ isSquelchingEvents = false;
197
+ }
198
+ // TODO(https://bugzilla.mozilla.org/show_bug.cgi?id=1804576)
199
+ // Remove when Firefox bug is addressed.
200
+ function __squelchEvent(event) {
201
+ const squelched = isSquelchingEvents;
202
+ if (squelched) {
203
+ event.preventDefault();
204
+ event.stopImmediatePropagation();
205
+ }
206
+ __squelchEventsForMicrotask();
207
+ return squelched;
208
+ }
209
+ /**
210
+ * Returns true if the click event should trigger an activation behavior. The
211
+ * behavior is defined by the element and is whatever it should do when
212
+ * clicked.
213
+ *
214
+ * Typically when an element needs to handle a click, the click is generated
215
+ * from within the element and an event listener within the element implements
216
+ * the needed behavior; however, it's possible to fire a click directly
217
+ * at the element that the element should handle. This method helps
218
+ * distinguish these "external" clicks.
219
+ *
220
+ * An "external" click can be triggered in a number of ways: via a click
221
+ * on an associated label for a form associated element, calling
222
+ * `element.click()`, or calling
223
+ * `element.dispatchEvent(new MouseEvent('click', ...))`.
224
+ *
225
+ * Also works around Firefox issue
226
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1804576 by squelching
227
+ * events for a microtask after called.
228
+ *
229
+ * @example
230
+ * hostClickListener = (event: MouseEvent) {
231
+ * if (isActivationClick(event)) {
232
+ * this.dispatchActivationClick(this.buttonElement);
233
+ * }
234
+ * }
235
+ *
236
+ */
237
+ function isActivationClick(event) {
238
+ // Event must start at the event target.
239
+ if (event.currentTarget !== event.target) {
240
+ return false;
241
+ }
242
+ // Event must not be retargeted from shadowRoot.
243
+ if (event.composedPath()[0] !== event.target) {
244
+ return false;
245
+ }
246
+ // Target must not be disabled; this should only occur for a synthetically
247
+ // dispatched click.
248
+ if (event.target.disabled) {
249
+ return false;
250
+ }
251
+ // This is an activation if the event should not be squelched.
252
+ return !__squelchEvent(event);
253
+ }
254
+ /**
255
+ * Re-dispatches an event from the provided element.
256
+ *
257
+ * This function is useful for forwarding non-composed events, such as `change`
258
+ * events.
259
+ *
260
+ * @example
261
+ * class MyInput extends LitElement {
262
+ * render() {
263
+ * return html`<input @change=${this.redispatchEvent}>`;
264
+ * }
265
+ *
266
+ * protected redispatchEvent(event: Event) {
267
+ * redispatchEvent(this, event);
268
+ * }
269
+ * }
270
+ *
271
+ * @param element The element to dispatch the event from.
272
+ * @param event The event to re-dispatch.
273
+ * @return Whether or not the event was dispatched (if cancelable).
274
+ */
275
+ function redispatchEvent(element, event) {
276
+ // For bubbling events in SSR light DOM (or composed), stop their propagation
277
+ // and dispatch the copy.
278
+ if (event.bubbles && (!element.shadowRoot || event.composed)) {
279
+ event.stopPropagation();
280
+ }
281
+ const copy = Reflect.construct(event.constructor, [event.type, event]);
282
+ const dispatched = element.dispatchEvent(copy);
283
+ if (!dispatched) {
284
+ event.preventDefault();
285
+ }
286
+ return dispatched;
287
+ }
288
+
289
+ export { isDarkMode as a, e$1 as b, createCacheFetch as c, dispatchActivationClick as d, e, isActivationClick as i, observerSlotChangesWithCallback as o, redispatchEvent as r, sanitizeSvg as s, throttle as t };
290
+ //# sourceMappingURL=dispatch-event-utils-vbdiOSeC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-event-utils-vbdiOSeC.js","sources":["../node_modules/@lit/reactive-element/decorators/base.js","../node_modules/@lit/reactive-element/decorators/query.js","../../src/utils.ts","../../src/utils/dispatch-event-utils.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","export async function createCacheFetch(name: string) {\n let cache: Cache | null = null;\n // This map tracks requests currently being processed\n const inFlightRequests = new Map<string, Promise<string>>();\n\n try {\n cache = await window.caches.open(name);\n } catch (e) {\n console.warn('window.caches access not allowed');\n }\n\n return async (url: string): Promise<string> => {\n // 1. Check if we are already fetching this URL\n if (inFlightRequests.has(url)) {\n // Return the existing promise instead of starting a new one\n return inFlightRequests.get(url)!;\n }\n\n // 2. Create the main logic as a promise\n const fetchPromise = (async () => {\n const request = new Request(url);\n\n // Check Cache first\n if (cache) {\n const cachedResponse = await cache.match(request);\n if (cachedResponse) {\n return cachedResponse.text();\n }\n }\n\n // Prepare network request\n const urlObj = new URL(request.url);\n const isSameOrigin = urlObj.origin === window.location.origin;\n\n const response = await fetch(request.url, {\n method: 'GET',\n mode: isSameOrigin ? 'no-cors' : 'cors',\n credentials: isSameOrigin ? 'same-origin' : 'omit',\n });\n\n // --- Handle 404 ---\n if (response.status === 404) {\n console.error(`[Fetch Error] Resource not found (404): ${url}`);\n return ''; // Return empty string as requested\n }\n\n const result = await response.text();\n\n // Update Cache if applicable\n if (cache && response.status === 200) {\n // We clone the response logic by creating a new Response with the text body\n await cache.put(\n request,\n new Response(result, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }),\n );\n }\n\n return result;\n })();\n\n // 3. Store the promise in the map\n inFlightRequests.set(url, fetchPromise);\n\n try {\n // 4. Wait for the result\n return await fetchPromise;\n } finally {\n // 5. Clean up: Remove the promise from the map when done\n // This ensures subsequent calls (after this one finishes) can start fresh\n inFlightRequests.delete(url);\n }\n };\n}\n\n// Basic sanitization: remove <script>, <foreignObject>, event handler attributes (on*), and iframes\nexport function sanitizeSvg(rawSvg: string) {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(rawSvg, 'image/svg+xml');\n\n // remove script tags\n const scripts = Array.from(doc.querySelectorAll('script'));\n scripts.forEach(n => n.remove());\n\n // remove foreignObject and iframe-like elements\n const foreigns = Array.from(doc.querySelectorAll('foreignObject, iframe'));\n foreigns.forEach(n => n.remove());\n\n // remove event handler attributes like onload, onclick, etc.\n const all = Array.from(doc.querySelectorAll('*'));\n all.forEach(el => {\n const attrs = Array.from(el.attributes).filter(a => /^on/i.test(a.name));\n attrs.forEach(a => el.removeAttribute(a.name));\n });\n\n const el = doc.documentElement;\n if (!el) return '';\n\n // serialize back to string\n const serializer = new XMLSerializer();\n return serializer.serializeToString(el);\n } catch (e) {\n // parsing failed; fall back to empty content to avoid injecting unsafe content\n return '';\n }\n}\n\nfunction __hasMeaningfulContent(slotElement: any) {\n const nodes = slotElement.assignedNodes({ flatten: true });\n\n for (const node of nodes) {\n // If it's an element node, it has content\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true;\n }\n // If it's a text node and contains non-whitespace characters, it has content\n if (\n node.nodeType === Node.TEXT_NODE &&\n node.textContent.trim().length > 0\n ) {\n return true;\n }\n }\n\n // No meaningful content found\n return false;\n}\n\nexport function observerSlotChangesWithCallback(\n slot: HTMLSlotElement | null,\n callback: (hasContent: boolean) => void,\n) {\n const observer = new MutationObserver(() => {\n callback(__hasMeaningfulContent(slot));\n });\n\n // Observe the elements currently assigned to the slot\n const assignedNodes = slot?.assignedNodes({ flatten: true }) || [];\n assignedNodes.forEach(node => {\n observer.observe(node, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n });\n });\n\n callback(__hasMeaningfulContent(slot));\n}\n\nexport function throttle(\n func: Function,\n delay: number,\n options = { leading: true, trailing: true },\n) {\n let timerId: any;\n let lastExec = 0;\n\n return function (...args: any[]) {\n // @ts-ignore\n const context = this;\n const now = Date.now();\n\n const shouldCallNow = options.leading && now - lastExec >= delay;\n\n if (shouldCallNow) {\n func.apply(context, args);\n lastExec = now;\n } else if (options.trailing && !timerId) {\n timerId = setTimeout(() => {\n func.apply(context, args);\n lastExec = Date.now();\n timerId = null;\n }, delay);\n }\n };\n}\n\nexport function isInViewport(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n return (\n rect.top !== 0 || rect.left !== 0 || rect.bottom !== 0 || rect.right !== 0\n );\n}\n\n\nexport function isDarkMode() {\n return document.documentElement.dataset.theme === 'dark';\n};","\n/**\n * Dispatches a click event to the given element that triggers a native action,\n * but is not composed and therefore is not seen outside the element.\n *\n * This is useful for responding to an external click event on the host element\n * that should trigger an internal action like a button click.\n *\n * Note, a helper is provided because setting this up correctly is a bit tricky.\n * In particular, calling `click` on an element creates a composed event, which\n * is not desirable, and a manually dispatched event must specifically be a\n * `MouseEvent` to trigger a native action.\n *\n * @example\n * hostClickListener = (event: MouseEvent) {\n * if (isActivationClick(event)) {\n * this.dispatchActivationClick(this.buttonElement);\n * }\n * }\n *\n */\nexport function dispatchActivationClick(element: HTMLElement) {\n const event = new MouseEvent('click', { bubbles: true });\n element.dispatchEvent(event);\n return event;\n}\n\n// Ignore events for one microtask only.\nlet isSquelchingEvents = false;\nasync function __squelchEventsForMicrotask() {\n isSquelchingEvents = true;\n // Need to pause for just one microtask.\n // tslint:disable-next-line\n await null;\n isSquelchingEvents = false;\n}\n\n// TODO(https://bugzilla.mozilla.org/show_bug.cgi?id=1804576)\n// Remove when Firefox bug is addressed.\nfunction __squelchEvent(event: Event) {\n const squelched = isSquelchingEvents;\n if (squelched) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n __squelchEventsForMicrotask();\n return squelched;\n}\n\n/**\n * Returns true if the click event should trigger an activation behavior. The\n * behavior is defined by the element and is whatever it should do when\n * clicked.\n *\n * Typically when an element needs to handle a click, the click is generated\n * from within the element and an event listener within the element implements\n * the needed behavior; however, it's possible to fire a click directly\n * at the element that the element should handle. This method helps\n * distinguish these \"external\" clicks.\n *\n * An \"external\" click can be triggered in a number of ways: via a click\n * on an associated label for a form associated element, calling\n * `element.click()`, or calling\n * `element.dispatchEvent(new MouseEvent('click', ...))`.\n *\n * Also works around Firefox issue\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1804576 by squelching\n * events for a microtask after called.\n *\n * @example\n * hostClickListener = (event: MouseEvent) {\n * if (isActivationClick(event)) {\n * this.dispatchActivationClick(this.buttonElement);\n * }\n * }\n *\n */\nexport function isActivationClick(event: Event) {\n // Event must start at the event target.\n if (event.currentTarget !== event.target) {\n return false;\n }\n // Event must not be retargeted from shadowRoot.\n if (event.composedPath()[0] !== event.target) {\n return false;\n }\n // Target must not be disabled; this should only occur for a synthetically\n // dispatched click.\n if ((event.target as EventTarget & { disabled: boolean }).disabled) {\n return false;\n }\n // This is an activation if the event should not be squelched.\n return !__squelchEvent(event);\n}\n\n/**\n * Re-dispatches an event from the provided element.\n *\n * This function is useful for forwarding non-composed events, such as `change`\n * events.\n *\n * @example\n * class MyInput extends LitElement {\n * render() {\n * return html`<input @change=${this.redispatchEvent}>`;\n * }\n *\n * protected redispatchEvent(event: Event) {\n * redispatchEvent(this, event);\n * }\n * }\n *\n * @param element The element to dispatch the event from.\n * @param event The event to re-dispatch.\n * @return Whether or not the event was dispatched (if cancelable).\n */\nexport function redispatchEvent(element: Element, event: Event) {\n // For bubbling events in SSR light DOM (or composed), stop their propagation\n // and dispatch the copy.\n if (event.bubbles && (!element.shadowRoot || event.composed)) {\n event.stopPropagation();\n }\n\n const copy = Reflect.construct(event.constructor, [event.type, event]);\n const dispatched = element.dispatchEvent(copy);\n if (!dispatched) {\n event.preventDefault();\n }\n\n return dispatched;\n}\n"],"names":["e","t"],"mappings":"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","x_google_ignoreList":[0,1]}