1"use strict"; 2(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["node_modules_ionic_core_dist_esm_index-0bc00b33_js"],{ 3 4/***/ 40198: 5/*!*************************************************************!*\ 6 !*** ./node_modules/@ionic/core/dist/esm/index-0bc00b33.js ***! 7 \*************************************************************/ 8/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 9 10__webpack_require__.r(__webpack_exports__); 11/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12/* harmony export */ "startTapClick": () => (/* binding */ startTapClick) 13/* harmony export */ }); 14/* harmony import */ var _helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers-3b390e48.js */ 97140); 15/*! 16 * (C) Ionic http://ionicframework.com - MIT License 17 */ 18 19 20const startTapClick = (config) => { 21 let lastTouch = -MOUSE_WAIT * 10; 22 let lastActivated = 0; 23 let activatableEle; 24 let activeRipple; 25 let activeDefer; 26 const useRippleEffect = config.getBoolean('animated', true) && config.getBoolean('rippleEffect', true); 27 const clearDefers = new WeakMap(); 28 // Touch Events 29 const onTouchStart = (ev) => { 30 lastTouch = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev); 31 pointerDown(ev); 32 }; 33 const onTouchEnd = (ev) => { 34 lastTouch = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev); 35 pointerUp(ev); 36 }; 37 const onMouseDown = (ev) => { 38 // Ignore right clicks 39 if (ev.button === 2) { 40 return; 41 } 42 const t = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev) - MOUSE_WAIT; 43 if (lastTouch < t) { 44 pointerDown(ev); 45 } 46 }; 47 const onMouseUp = (ev) => { 48 const t = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev) - MOUSE_WAIT; 49 if (lastTouch < t) { 50 pointerUp(ev); 51 } 52 }; 53 const cancelActive = () => { 54 clearTimeout(activeDefer); 55 activeDefer = undefined; 56 if (activatableEle) { 57 removeActivated(false); 58 activatableEle = undefined; 59 } 60 }; 61 const pointerDown = (ev) => { 62 if (activatableEle) { 63 return; 64 } 65 setActivatedElement(getActivatableTarget(ev), ev); 66 }; 67 const pointerUp = (ev) => { 68 setActivatedElement(undefined, ev); 69 }; 70 const setActivatedElement = (el, ev) => { 71 // do nothing 72 if (el && el === activatableEle) { 73 return; 74 } 75 clearTimeout(activeDefer); 76 activeDefer = undefined; 77 const { x, y } = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.p)(ev); 78 // deactivate selected 79 if (activatableEle) { 80 if (clearDefers.has(activatableEle)) { 81 throw new Error('internal error'); 82 } 83 if (!activatableEle.classList.contains(ACTIVATED)) { 84 addActivated(activatableEle, x, y); 85 } 86 removeActivated(true); 87 } 88 // activate 89 if (el) { 90 const deferId = clearDefers.get(el); 91 if (deferId) { 92 clearTimeout(deferId); 93 clearDefers.delete(el); 94 } 95 const delay = isInstant(el) ? 0 : ADD_ACTIVATED_DEFERS; 96 el.classList.remove(ACTIVATED); 97 activeDefer = setTimeout(() => { 98 addActivated(el, x, y); 99 activeDefer = undefined; 100 }, delay); 101 } 102 activatableEle = el; 103 }; 104 const addActivated = (el, x, y) => { 105 lastActivated = Date.now(); 106 el.classList.add(ACTIVATED); 107 if (!useRippleEffect) 108 return; 109 const rippleEffect = getRippleEffect(el); 110 if (rippleEffect !== null) { 111 removeRipple(); 112 activeRipple = rippleEffect.addRipple(x, y); 113 } 114 }; 115 const removeRipple = () => { 116 if (activeRipple !== undefined) { 117 activeRipple.then((remove) => remove()); 118 activeRipple = undefined; 119 } 120 }; 121 const removeActivated = (smooth) => { 122 removeRipple(); 123 const active = activatableEle; 124 if (!active) { 125 return; 126 } 127 const time = CLEAR_STATE_DEFERS - Date.now() + lastActivated; 128 if (smooth && time > 0 && !isInstant(active)) { 129 const deferId = setTimeout(() => { 130 active.classList.remove(ACTIVATED); 131 clearDefers.delete(active); 132 }, CLEAR_STATE_DEFERS); 133 clearDefers.set(active, deferId); 134 } 135 else { 136 active.classList.remove(ACTIVATED); 137 } 138 }; 139 const doc = document; 140 doc.addEventListener('ionGestureCaptured', cancelActive); 141 doc.addEventListener('touchstart', onTouchStart, true); 142 doc.addEventListener('touchcancel', onTouchEnd, true); 143 doc.addEventListener('touchend', onTouchEnd, true); 144 /** 145 * Tap click effects such as the ripple effect should 146 * not happen when scrolling. For example, if a user scrolls 147 * the page but also happens to do a touchstart on a button 148 * as part of the scroll, the ripple effect should not 149 * be dispatched. The ripple effect should only happen 150 * if the button is activated and the page is not scrolling. 151 * 152 * pointercancel is dispatched on a gesture when scrolling 153 * starts, so this lets us avoid having to listen for 154 * ion-content's scroll events. 155 */ 156 doc.addEventListener('pointercancel', cancelActive, true); 157 doc.addEventListener('mousedown', onMouseDown, true); 158 doc.addEventListener('mouseup', onMouseUp, true); 159}; 160const getActivatableTarget = (ev) => { 161 if (ev.composedPath !== undefined) { 162 /** 163 * composedPath returns EventTarget[]. However, 164 * objects other than Element can be targets too.
165 * For example, AudioContext can be a target. In this 166 * case, we know that the event is a UIEvent so we 167 * can assume that the path will contain either Element 168 * or ShadowRoot. 169 */ 170 const path = ev.composedPath(); 171 for (let i = 0; i < path.length - 2; i++) { 172 const el = path[i]; 173 if (!(el instanceof ShadowRoot) && el.classList.contains('ion-activatable')) { 174 return el; 175 } 176 } 177 } 178 else { 179 return ev.target.closest('.ion-activatable'); 180 } 181}; 182const isInstant = (el) => { 183 return el.classList.contains('ion-activatable-instant'); 184}; 185const getRippleEffect = (el) => { 186 if (el.shadowRoot) { 187 const ripple = el.shadowRoot.querySelector('ion-ripple-effect'); 188 if (ripple) { 189 return ripple; 190 } 191 } 192 return el.querySelector('ion-ripple-effect'); 193}; 194const ACTIVATED = 'ion-activated'; 195const ADD_ACTIVATED_DEFERS = 200; 196const CLEAR_STATE_DEFERS = 200; 197const MOUSE_WAIT = 2500; 198 199 200 201 202/***/ }) 203 204}]); 205//# sourceMappingURL=node_modules_ionic_core_dist_esm_index-0bc00b33_js.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.