1 |
|
2 |
|
3 |
|
4 | const transitionEndAsync = (el, expectedDuration = 0) => {
|
5 | return new Promise(resolve => {
|
6 | transitionEnd(el, expectedDuration, resolve);
|
7 | });
|
8 | };
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | const transitionEnd = (el, expectedDuration = 0, callback) => {
|
17 | let unRegTrans;
|
18 | let animationTimeout;
|
19 | const opts = { passive: true };
|
20 | const ANIMATION_FALLBACK_TIMEOUT = 500;
|
21 | const unregister = () => {
|
22 | if (unRegTrans) {
|
23 | unRegTrans();
|
24 | }
|
25 | };
|
26 | const onTransitionEnd = (ev) => {
|
27 | if (ev === undefined || el === ev.target) {
|
28 | unregister();
|
29 | callback(ev);
|
30 | }
|
31 | };
|
32 | if (el) {
|
33 | el.addEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
34 | el.addEventListener('transitionend', onTransitionEnd, opts);
|
35 | animationTimeout = setTimeout(onTransitionEnd, expectedDuration + ANIMATION_FALLBACK_TIMEOUT);
|
36 | unRegTrans = () => {
|
37 | if (animationTimeout) {
|
38 | clearTimeout(animationTimeout);
|
39 | animationTimeout = undefined;
|
40 | }
|
41 | el.removeEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
42 | el.removeEventListener('transitionend', onTransitionEnd, opts);
|
43 | };
|
44 | }
|
45 | return unregister;
|
46 | };
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 | const componentOnReady = (el, callback) => {
|
60 | if (el.componentOnReady) {
|
61 | el.componentOnReady().then((resolvedEl) => callback(resolvedEl));
|
62 | }
|
63 | else {
|
64 | raf(() => callback(el));
|
65 | }
|
66 | };
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | const inheritAttributes = (el, attributes = []) => {
|
78 | const attributeObject = {};
|
79 | attributes.forEach(attr => {
|
80 | if (el.hasAttribute(attr)) {
|
81 | const value = el.getAttribute(attr);
|
82 | if (value !== null) {
|
83 | attributeObject[attr] = el.getAttribute(attr);
|
84 | }
|
85 | el.removeAttribute(attr);
|
86 | }
|
87 | });
|
88 | return attributeObject;
|
89 | };
|
90 | const addEventListener = (el, eventName, callback, opts) => {
|
91 | if (typeof window !== 'undefined') {
|
92 | const win = window;
|
93 | const config = win && win.Ionic && win.Ionic.config;
|
94 | if (config) {
|
95 | const ael = config.get('_ael');
|
96 | if (ael) {
|
97 | return ael(el, eventName, callback, opts);
|
98 | }
|
99 | else if (config._ael) {
|
100 | return config._ael(el, eventName, callback, opts);
|
101 | }
|
102 | }
|
103 | }
|
104 | return el.addEventListener(eventName, callback, opts);
|
105 | };
|
106 | const removeEventListener = (el, eventName, callback, opts) => {
|
107 | if (typeof window !== 'undefined') {
|
108 | const win = window;
|
109 | const config = win && win.Ionic && win.Ionic.config;
|
110 | if (config) {
|
111 | const rel = config.get('_rel');
|
112 | if (rel) {
|
113 | return rel(el, eventName, callback, opts);
|
114 | }
|
115 | else if (config._rel) {
|
116 | return config._rel(el, eventName, callback, opts);
|
117 | }
|
118 | }
|
119 | }
|
120 | return el.removeEventListener(eventName, callback, opts);
|
121 | };
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 | const getElementRoot = (el, fallback = el) => {
|
132 | return el.shadowRoot || fallback;
|
133 | };
|
134 |
|
135 |
|
136 |
|
137 |
|
138 | const raf = (h) => {
|
139 | if (typeof __zone_symbol__requestAnimationFrame === 'function') {
|
140 | return __zone_symbol__requestAnimationFrame(h);
|
141 | }
|
142 | if (typeof requestAnimationFrame === 'function') {
|
143 | return requestAnimationFrame(h);
|
144 | }
|
145 | return setTimeout(h);
|
146 | };
|
147 | const hasShadowDom = (el) => {
|
148 | return !!el.shadowRoot && !!el.attachShadow;
|
149 | };
|
150 | const findItemLabel = (componentEl) => {
|
151 | const itemEl = componentEl.closest('ion-item');
|
152 | if (itemEl) {
|
153 | return itemEl.querySelector('ion-label');
|
154 | }
|
155 | return null;
|
156 | };
|
157 | const focusElement = (el) => {
|
158 | el.focus();
|
159 | |
160 |
|
161 |
|
162 |
|
163 |
|
164 |
|
165 |
|
166 |
|
167 | if (el.classList.contains('ion-focusable')) {
|
168 | const app = el.closest('ion-app');
|
169 | if (app) {
|
170 | app.setFocus([el]);
|
171 | }
|
172 | }
|
173 | };
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
|
186 |
|
187 | const getAriaLabel = (componentEl, inputId) => {
|
188 | let labelText;
|
189 |
|
190 |
|
191 | const labelledBy = componentEl.getAttribute('aria-labelledby');
|
192 |
|
193 |
|
194 | const componentId = componentEl.id;
|
195 | let labelId = labelledBy !== null && labelledBy.trim() !== ''
|
196 | ? labelledBy
|
197 | : inputId + '-lbl';
|
198 | let label = labelledBy !== null && labelledBy.trim() !== ''
|
199 | ? document.getElementById(labelledBy)
|
200 | : findItemLabel(componentEl);
|
201 | if (label) {
|
202 | if (labelledBy === null) {
|
203 | label.id = labelId;
|
204 | }
|
205 | labelText = label.textContent;
|
206 | label.setAttribute('aria-hidden', 'true');
|
207 |
|
208 |
|
209 | }
|
210 | else if (componentId.trim() !== '') {
|
211 | label = document.querySelector(`label[for="${componentId}"]`);
|
212 | if (label) {
|
213 | if (label.id !== '') {
|
214 | labelId = label.id;
|
215 | }
|
216 | else {
|
217 | label.id = labelId = `${componentId}-lbl`;
|
218 | }
|
219 | labelText = label.textContent;
|
220 | }
|
221 | }
|
222 | return { label, labelId, labelText };
|
223 | };
|
224 |
|
225 |
|
226 |
|
227 |
|
228 |
|
229 |
|
230 |
|
231 |
|
232 |
|
233 |
|
234 |
|
235 |
|
236 | const renderHiddenInput = (always, container, name, value, disabled) => {
|
237 | if (always || hasShadowDom(container)) {
|
238 | let input = container.querySelector('input.aux-input');
|
239 | if (!input) {
|
240 | input = container.ownerDocument.createElement('input');
|
241 | input.type = 'hidden';
|
242 | input.classList.add('aux-input');
|
243 | container.appendChild(input);
|
244 | }
|
245 | input.disabled = disabled;
|
246 | input.name = name;
|
247 | input.value = value || '';
|
248 | }
|
249 | };
|
250 | const clamp = (min, n, max) => {
|
251 | return Math.max(min, Math.min(n, max));
|
252 | };
|
253 | const assert = (actual, reason) => {
|
254 | if (!actual) {
|
255 | const message = 'ASSERT: ' + reason;
|
256 | console.error(message);
|
257 | debugger;
|
258 | throw new Error(message);
|
259 | }
|
260 | };
|
261 | const now = (ev) => {
|
262 | return ev.timeStamp || Date.now();
|
263 | };
|
264 | const pointerCoord = (ev) => {
|
265 |
|
266 |
|
267 | if (ev) {
|
268 | const changedTouches = ev.changedTouches;
|
269 | if (changedTouches && changedTouches.length > 0) {
|
270 | const touch = changedTouches[0];
|
271 | return { x: touch.clientX, y: touch.clientY };
|
272 | }
|
273 | if (ev.pageX !== undefined) {
|
274 | return { x: ev.pageX, y: ev.pageY };
|
275 | }
|
276 | }
|
277 | return { x: 0, y: 0 };
|
278 | };
|
279 |
|
280 |
|
281 |
|
282 |
|
283 |
|
284 |
|
285 |
|
286 | const isEndSide = (side) => {
|
287 | const isRTL = document.dir === 'rtl';
|
288 | switch (side) {
|
289 | case 'start': return isRTL;
|
290 | case 'end': return !isRTL;
|
291 | default:
|
292 | throw new Error(`"${side}" is not a valid value for [side]. Use "start" or "end" instead.`);
|
293 | }
|
294 | };
|
295 | const debounceEvent = (event, wait) => {
|
296 | const original = event._original || event;
|
297 | return {
|
298 | _original: event,
|
299 | emit: debounce(original.emit.bind(original), wait)
|
300 | };
|
301 | };
|
302 | const debounce = (func, wait = 0) => {
|
303 | let timer;
|
304 | return (...args) => {
|
305 | clearTimeout(timer);
|
306 | timer = setTimeout(func, wait, ...args);
|
307 | };
|
308 | };
|
309 |
|
310 |
|
311 |
|
312 |
|
313 |
|
314 |
|
315 |
|
316 | const shallowEqualStringMap = (map1, map2) => {
|
317 | map1 !== null && map1 !== void 0 ? map1 : (map1 = {});
|
318 | map2 !== null && map2 !== void 0 ? map2 : (map2 = {});
|
319 | if (map1 === map2) {
|
320 | return true;
|
321 | }
|
322 | const keys1 = Object.keys(map1);
|
323 | if (keys1.length !== Object.keys(map2).length) {
|
324 | return false;
|
325 | }
|
326 | for (const k1 of keys1) {
|
327 | if (!(k1 in map2)) {
|
328 | return false;
|
329 | }
|
330 | if (map1[k1] !== map2[k1]) {
|
331 | return false;
|
332 | }
|
333 | }
|
334 | return true;
|
335 | };
|
336 |
|
337 | export { addEventListener as a, removeEventListener as b, componentOnReady as c, getAriaLabel as d, renderHiddenInput as e, focusElement as f, getElementRoot as g, hasShadowDom as h, inheritAttributes as i, clamp as j, debounceEvent as k, findItemLabel as l, isEndSide as m, assert as n, debounce as o, pointerCoord as p, now as q, raf as r, shallowEqualStringMap as s, transitionEndAsync as t };
|