1"use strict"; 2(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["node_modules_ionic_core_dist_esm_ion-app_8_entry_js"],{ 3 4/***/ 4812: 5/*!**************************************************************!*\ 6 !*** ./node_modules/@ionic/core/dist/esm/ion-app_8.entry.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 */ "ion_app": () => (/* binding */ App), 13/* harmony export */ "ion_buttons": () => (/* binding */ Buttons), 14/* harmony export */ "ion_content": () => (/* binding */ Content), 15/* harmony export */ "ion_footer": () => (/* binding */ Footer), 16/* harmony export */ "ion_header": () => (/* binding */ Header), 17/* harmony export */ "ion_router_outlet": () => (/* binding */ RouterOutlet), 18/* harmony export */ "ion_title": () => (/* binding */ ToolbarTitle), 19/* harmony export */ "ion_toolbar": () => (/* binding */ Toolbar) 20/* harmony export */ }); 21/* harmony import */ var C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js */ 1670); 22/* harmony import */ var _index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index-b3eecb14.js */ 1049); 23/* harmony import */ var _ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ionic-global-0ebe321c.js */ 1584); 24/* harmony import */ var _helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers-6e1e5b65.js */ 8345); 25/* harmony import */ var _dir_e8b767a8_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dir-e8b767a8.js */ 7481); 26/* harmony import */ var _theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./theme-a24ff1ad.js */ 4596); 27/* harmony import */ var _cubic_bezier_154a53a5_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./cubic-bezier-154a53a5.js */ 4585); 28/* harmony import */ var _framework_delegate_0e9f0224_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./framework-delegate-0e9f0224.js */ 2673); 29/* harmony import */ var _index_e6c2c822_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./index-e6c2c822.js */ 7582); 30 31 32/*! 33 * (C) Ionic http://ionicframework.com - MIT License 34 */ 35 36 37 38 39 40 41 42 43const appCss = "html.plt-mobile ion-app{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.plt-mobile ion-app [contenteditable]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}ion-app.force-statusbar-padding{--ion-safe-area-top:20px}"; 44const App = class { 45 constructor(hostRef) { 46 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 47 } 48 49 componentDidLoad() { 50 var _this = this; 51 52 { 53 rIC( /*#__PURE__*/(0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 54 const isHybrid = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.a)(window, 'hybrid'); 55 56 if (!_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('_testing')) { 57 __webpack_require__.e(/*! import() */ "node_modules_ionic_core_dist_esm_tap-click-a895802b_js").then(__webpack_require__.bind(__webpack_require__, /*! ./tap-click-a895802b.js */ 4747)).then(module => module.startTapClick(_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c)); 58 } 59 60 if (_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('statusTap', isHybrid)) { 61 __webpack_require__.e(/*! import() */ "node_modules_ionic_core_dist_esm_status-tap-3ed8ecec_js").then(__webpack_require__.bind(__webpack_require__, /*! ./status-tap-3ed8ecec.js */ 8386)).then(module => module.startStatusTap()); 62 } 63 64 if (_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('inputShims', needInputShims())) { 65 __webpack_require__.e(/*! import() */ "node_modules_ionic_core_dist_esm_input-shims-61232da0_js").then(__webpack_require__.bind(__webpack_require__, /*! ./input-shims-61232da0.js */ 6810)).then(module => module.startInputShims(_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c)); 66 } 67 68 const hardwareBackButtonModule = yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./hardware-back-button-ace6a71b.js */ 6826)); 69 70 if (_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('hardwareBackButton', isHybrid)) { 71 hardwareBackButtonModule.startHardwareBackButton(); 72 } else { 73 hardwareBackButtonModule.blockHardwareBackButton(); 74 } 75 76 if (typeof window !== 'undefined') { 77 __webpack_require__.e(/*! import() */ "common").then(__webpack_require__.bind(__webpack_require__, /*! ./keyboard-808e4e15.js */ 8022)).then(module => module.startKeyboardAssist(window)); 78 } 79 80 __webpack_require__.e(/*! import() */ "common").then(__webpack_require__.bind(__webpack_require__, /*! ./focus-visible-02bf7a99.js */ 1550)).then(module => _this.focusVisible = module.startFocusVisible()); 81 })); 82 } 83 } 84 /** 85 * @internal 86 * Used to set focus on an element that uses `ion-focusable`. 87 * Do not use this if focusing the element as a result of a keyboard 88 * event as the focus utility should handle this for us. This method 89 * should be used when we want to programmatically focus an element as 90 * a result of another user action. (Ex: We focus the first element 91 * inside of a popover when the user presents it, but the popover is not always 92 * presented as a result of keyboard action.) 93 */ 94 95 96 setFocus(elements) { 97 var _this2 = this; 98 99 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 100 if (_this2.focusVisible) { 101 _this2.focusVisible.setFocus(elements); 102 } 103 })(); 104 } 105 106 render() { 107 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 108 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 109 class: { 110 [mode]: true, 111 'ion-page': true, 112 'force-statusbar-padding': _ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('_forceStatusbarPadding') 113 } 114 }); 115 } 116 117 get el() { 118 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 119 } 120 121}; 122 123const needInputShims = () => { 124 return (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.a)(window, 'ios') && (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.a)(window, 'mobile'); 125}; 126 127const rIC = callback => { 128 if ('requestIdleCallback' in window) { 129 window.requestIdleCallback(callback); 130 } else { 131 setTimeout(callback, 32); 132 } 133}; 134 135App.style = appCss; 136const buttonsIosCss = ".sc-ion-buttons-ios-h{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);z-index:99}.sc-ion-buttons-ios-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-ios-s ion-button{--padding-start:5px;--padding-end:5px;margin-left:2px;margin-right:2px;
136height:32px;font-size:17px;font-weight:400}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-ios-s ion-button{margin-left:unset;margin-right:unset;-webkit-margin-start:2px;margin-inline-start:2px;-webkit-margin-end:2px;margin-inline-end:2px}}.sc-ion-buttons-ios-s ion-button:not(.button-round){--border-radius:4px}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button{--color:initial;--border-color:initial;--background-focused:var(--ion-color-contrast)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-solid,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-solid{--background:var(--ion-color-contrast);--background-focused:#000;--background-focused-opacity:.12;--background-activated:#000;--background-activated-opacity:.12;--background-hover:var(--ion-color-base);--background-hover-opacity:0.45;--color:var(--ion-color-base);--color-focused:var(--ion-color-base)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-clear,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-clear{--color-activated:var(--ion-color-contrast);--color-focused:var(--ion-color-contrast)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-outline,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-outline{--color-activated:var(--ion-color-base);--color-focused:var(--ion-color-contrast)}.sc-ion-buttons-ios-s .button-clear,.sc-ion-buttons-ios-s .button-outline{--background-activated:transparent;--background-focused:currentColor;--background-hover:transparent}.sc-ion-buttons-ios-s .button-solid:not(.ion-color){--background-focused:#000;--background-focused-opacity:.12;--background-activated:#000;--background-activated-opacity:.12}.sc-ion-buttons-ios-s ion-icon[slot=start]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;margin-right:0.3em;font-size:24px;line-height:0.67}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-ios-s ion-icon[slot=start]{margin-right:unset;-webkit-margin-end:0.3em;margin-inline-end:0.3em}}.sc-ion-buttons-ios-s ion-icon[slot=end]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;margin-left:0.4em;font-size:24px;line-height:0.67}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-ios-s ion-icon[slot=end]{margin-left:unset;-webkit-margin-start:0.4em;margin-inline-start:0.4em}}.sc-ion-buttons-ios-s ion-icon[slot=icon-only]{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;font-size:28px;line-height:0.67}"; 137const buttonsMdCss = ".sc-ion-buttons-md-h{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);z-index:99}.sc-ion-buttons-md-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-md-s ion-button{--padding-top:0;--padding-bottom:0;--padding-start:8px;--padding-end:8px;--box-shadow:none;margin-left:2px;margin-right:2px;height:32px;font-size:14px;font-weight:500}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-md-s ion-button{margin-left:unset;margin-right:unset;-webkit-margin-start:2px;margin-inline-start:2px;-webkit-margin-end:2px;margin-inline-end:2px}}.sc-ion-buttons-md-s ion-button:not(.button-round){--border-radius:2px}.sc-ion-buttons-md-h.ion-color.sc-ion-buttons-md-s .button,.ion-color .sc-ion-buttons-md-h.sc-ion-buttons-md-s .button{--color:initial;--color-focused:var(--ion-color-contrast);--color-hover:var(--ion-color-contrast);--background-activated:transparent;--background-focused:var(--ion-color-contrast);--background-hover:var(--ion-color-contrast)}.sc-ion-buttons-md-h.ion-color.sc-ion-buttons-md-s .button-solid,.ion-color .sc-ion-buttons-md-h.sc-ion-buttons-md-s .button-solid{--background:var(--ion-color-contrast);--background-activated:transparent;--background-focused:var(--ion-color-shade);--background-hover:var(--ion-color-base);--color:var(--ion-color-base);--color-focused:var(--ion-color-base);--color-hover:var(--ion-color-base)}.sc-ion-buttons-md-h.ion-color.sc-ion-buttons-md-s .button-outline,.ion-color .sc-ion-buttons-md-h.sc-ion-buttons-md-s .button-outline{--border-color:var(--ion-color-contrast)}
137.sc-ion-buttons-md-s .button-has-icon-only.button-clear{--padding-top:12px;--padding-end:12px;--padding-bottom:12px;--padding-start:12px;--border-radius:50%;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:48px;height:48px}.sc-ion-buttons-md-s .button{--background-hover:currentColor}.sc-ion-buttons-md-s .button-solid{--color:var(--ion-toolbar-background, var(--ion-background-color, #fff));--background:var(--ion-toolbar-color, var(--ion-text-color, #424242));--background-activated:transparent;--background-focused:currentColor}.sc-ion-buttons-md-s .button-outline{--color:initial;--background:transparent;--background-activated:transparent;--background-focused:currentColor;--background-hover:currentColor;--border-color:currentColor}.sc-ion-buttons-md-s .button-clear{--color:initial;--background:transparent;--background-activated:transparent;--background-focused:currentColor;--background-hover:currentColor}.sc-ion-buttons-md-s ion-icon[slot=start]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;margin-right:0.3em;font-size:1.4em}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-md-s ion-icon[slot=start]{margin-right:unset;-webkit-margin-end:0.3em;margin-inline-end:0.3em}}.sc-ion-buttons-md-s ion-icon[slot=end]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;margin-left:0.4em;font-size:1.4em}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.sc-ion-buttons-md-s ion-icon[slot=end]{margin-left:unset;-webkit-margin-start:0.4em;margin-inline-start:0.4em}}.sc-ion-buttons-md-s ion-icon[slot=icon-only]{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;font-size:1.8em}"; 138const Buttons = class { 139 constructor(hostRef) { 140 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 141 /** 142 * If true, buttons will disappear when its 143 * parent toolbar has fully collapsed if the toolbar 144 * is not the first toolbar. If the toolbar is the 145 * first toolbar, the buttons will be hidden and will 146 * only be shown once all toolbars have fully collapsed. 147 * 148 * Only applies in `ios` mode with `collapse` set to 149 * `true` on `ion-header`. 150 * 151 * Typically used for [Collapsible Large Titles](https://ionicframework.com/docs/api/title#collapsible-large-titles) 152 */ 153 154 this.collapse = false; 155 } 156 157 render() { 158 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 159 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 160 class: { 161 [mode]: true, 162 ['buttons-collapse']: this.collapse 163 } 164 }); 165 } 166 167}; 168Buttons.style = { 169 ios: buttonsIosCss, 170 md: buttonsMdCss 171}; 172const contentCss = ":host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}:host(.outer-content){--background:var(--ion-color-step-50, #f2f2f2)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);padding-left:var(--padding-start);padding-right:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:manipulation;touch-action:manipulation}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.inner-scroll{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end)}}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:\"\"}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}
172.transition-shadow{display:block;position:absolute;width:10px;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTE3MDgzRkQ5QTkyMTFFOUEwNzQ5MkJFREE1NUY2MjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTE3MDgzRkU5QTkyMTFFOUEwNzQ5MkJFREE1NUY2MjQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxMTcwODNGQjlBOTIxMUU5QTA3NDkyQkVEQTU1RjYyNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMTcwODNGQzlBOTIxMUU5QTA3NDkyQkVEQTU1RjYyNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmePEuQAAABNSURBVHjaYvz//z8DIxAwMDAwATGMhmFmPDQuOSZks0AMmoJBaQHjkPfB0Lfg/2gQjVow+HPy/yHvg9GiYjQfjMbBqAWjFgy/4hogwADYqwdzxy5BuwAAAABJRU5ErkJggg==);background-repeat:repeat-y;background-size:10px 16px}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}"; 173const Content = class { 174 constructor(hostRef) { 175 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 176 this.ionScrollStart = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionScrollStart", 7); 177 this.ionScroll = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionScroll", 7); 178 this.ionScrollEnd = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionScrollEnd", 7); 179 this.isScrolling = false; 180 this.lastScroll = 0; 181 this.queued = false; 182 this.cTop = -1; 183 this.cBottom = -1; 184 this.isMainContent = true; // Detail is used in a hot loop in the scroll event, by allocating it here 185 // V8 will be able to inline any read/write to it since it's a monomorphic class. 186 // https://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html 187 188 this.detail = { 189 scrollTop: 0, 190 scrollLeft: 0, 191 type: 'scroll', 192 event: undefined, 193 startX: 0, 194 startY: 0, 195 startTime: 0, 196 currentX: 0, 197 currentY: 0, 198 velocityX: 0, 199 velocityY: 0, 200 deltaX: 0, 201 deltaY: 0, 202 currentTime: 0, 203 data: undefined, 204 isScrolling: true 205 }; 206 /** 207 * If `true`, the content will scroll behind the headers 208 * and footers. This effect can easily be seen by setting the toolbar 209 * to transparent. 210 */ 211 212 this.fullscreen = false; 213 /** 214 * If you want to enable the content scrolling in the X axis, set this property to `true`. 215 */ 216 217 this.scrollX = false; 218 /** 219 * If you want to disable the content scrolling in the Y axis, set this property to `false`. 220 */ 221 222 this.scrollY = true; 223 /** 224 * Because of performance reasons, ionScroll events are disabled by default, in order to enable them 225 * and start listening from (ionScroll), set this property to `true`. 226 */ 227 228 this.scrollEvents = false; 229 } 230 231 connectedCallback() { 232 this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null; 233 } 234 235 disconnectedCallback() { 236 this.onScrollEnd(); 237 } 238 239 onAppLoad() { 240 this.resize(); 241 } 242 243 shouldForceOverscroll() { 244 const { 245 forceOverscroll 246 } = this; 247 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 248 return forceOverscroll === undefined ? mode === 'ios' && (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.a)('ios') : forceOverscroll; 249 } 250 251 resize() { 252 if (this.fullscreen) { 253 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.f)(() => this.readDimensions()); 254 } else if (this.cTop !== 0 || this.cBottom !== 0) { 255 this.cTop = this.cBottom = 0; 256 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.j)(this); 257 } 258 } 259 260 readDimensions() { 261 const page = getPageElement(this.el); 262 const top = Math.max(this.el.offsetTop, 0); 263 const bottom = Math.max(page.offsetHeight - top - this.el.offsetHeight, 0); 264 const dirty = top !== this.cTop || bottom !== this.cBottom; 265
266 if (dirty) { 267 this.cTop = top; 268 this.cBottom = bottom; 269 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.j)(this); 270 } 271 } 272 273 onScroll(ev) { 274 const timeStamp = Date.now(); 275 const shouldStart = !this.isScrolling; 276 this.lastScroll = timeStamp; 277 278 if (shouldStart) { 279 this.onScrollStart(); 280 } 281 282 if (!this.queued && this.scrollEvents) { 283 this.queued = true; 284 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.f)(ts => { 285 this.queued = false; 286 this.detail.event = ev; 287 updateScrollDetail(this.detail, this.scrollEl, ts, shouldStart); 288 this.ionScroll.emit(this.detail); 289 }); 290 } 291 } 292 /** 293 * Get the element where the actual scrolling takes place. 294 * This element can be used to subscribe to `scroll` events or manually modify 295 * `scrollTop`. However, it's recommended to use the API provided by `ion-content`: 296 * 297 * i.e. Using `ionScroll`, `ionScrollStart`, `ionScrollEnd` for scrolling events 298 * and `scrollToPoint()` to scroll the content into a certain point. 299 */ 300 301 302 getScrollElement() { 303 var _this3 = this; 304 305 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 306 /** 307 * If this gets called in certain early lifecycle hooks (ex: Vue onMounted), 308 * scrollEl won't be defined yet with the custom elements build, so wait for it to load in. 309 */ 310 if (!_this3.scrollEl) { 311 yield new Promise(resolve => (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.c)(_this3.el, resolve)); 312 } 313 314 return Promise.resolve(_this3.scrollEl); 315 })(); 316 } 317 /** 318 * Scroll to the top of the component. 319 * 320 * @param duration The amount of time to take scrolling to the top. Defaults to `0`. 321 */ 322 323 324 scrollToTop(duration = 0) { 325 return this.scrollToPoint(undefined, 0, duration); 326 } 327 /** 328 * Scroll to the bottom of the component. 329 * 330 * @param duration The amount of time to take scrolling to the bottom. Defaults to `0`. 331 */ 332 333 334 scrollToBottom(duration = 0) { 335 var _this4 = this; 336 337 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 338 const scrollEl = yield _this4.getScrollElement(); 339 const y = scrollEl.scrollHeight - scrollEl.clientHeight; 340 return _this4.scrollToPoint(undefined, y, duration); 341 })(); 342 } 343 /** 344 * Scroll by a specified X/Y distance in the component. 345 * 346 * @param x The amount to scroll by on the horizontal axis. 347 * @param y The amount to scroll by on the vertical axis. 348 * @param duration The amount of time to take scrolling by that amount. 349 */ 350 351 352 scrollByPoint(x, y, duration) { 353 var _this5 = this; 354 355 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 356 const scrollEl = yield _this5.getScrollElement(); 357 return _this5.scrollToPoint(x + scrollEl.scrollLeft, y + scrollEl.scrollTop, duration); 358 })(); 359 } 360 /** 361 * Scroll to a specified X/Y location in the component. 362 * 363 * @param x The point to scroll to on the horizontal axis. 364 * @param y The point to scroll to on the vertical axis. 365 * @param duration The amount of time to take scrolling to that point. Defaults to `0`. 366 */ 367 368 369 scrollToPoint(x, y, duration = 0) { 370 var _this6 = this; 371 372 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 373 const el = yield _this6.getScrollElement(); 374 375 if (duration < 32) { 376 if (y != null) { 377 el.scrollTop = y; 378 } 379 380 if (x != null) { 381 el.scrollLeft = x; 382 } 383 384 return; 385 } 386 387 let resolve; 388 let startTime = 0; 389 const promise = new Promise(r => resolve = r); 390 const fromY = el.scrollTop; 391 const fromX = el.scrollLeft; 392 const deltaY = y != null ? y - fromY : 0; 393 const deltaX = x != null ? x - fromX : 0; // scroll loop 394 395 const step = timeStamp => { 396 const linearTime = Math.min(1, (timeStamp - startTime) / duration) - 1; 397 const easedT = Math.pow(linearTime, 3) + 1; 398 399 if (deltaY !== 0) { 400 el.scrollTop = Math.floor(easedT * deltaY + fromY); 401 } 402 403 if (deltaX !== 0) { 404 el.scrollLeft = Math.floor(easedT * deltaX + fromX); 405 } 406 407 if (easedT < 1) { 408 // do not use DomController here 409 // must use nativeRaf in order to fire in the next frame 410 // TODO: remove as any 411 requestAnimationFrame(step); 412 } else { 413 resolve(); 414 } 415 }; // chill out for a frame first 416 417 418 requestAnimationFrame(ts => { 419 startTime = ts; 420 step(ts); 421 }); 422 return promise; 423 })(); 424 } 425 426 onScrollStart() { 427 this.isScrolling = true; 428 this.ionScrollStart.emit({ 429 isScrolling: true 430 }); 431 432 if (this.watchDog) { 433 clearInterval(this.watchDog); 434 } // watchdog 435 436 437 this.watchDog = setInterval(() => { 438 if (this.lastScroll < Date.now() - 120) { 439 this.onScrollEnd(); 440 } 441 }, 100); 442 } 443 444 onScrollEnd() { 445 clearInterval(this.watchDog); 446 this.watchDog = null; 447 448 if (this.isScrolling) { 449 this.isScrolling = false;
450 this.ionScrollEnd.emit({ 451 isScrolling: false 452 }); 453 } 454 } 455 456 render() { 457 const { 458 isMainContent, 459 scrollX, 460 scrollY, 461 el 462 } = this; 463 const rtl = (0,_dir_e8b767a8_js__WEBPACK_IMPORTED_MODULE_4__.i)(el) ? 'rtl' : 'ltr'; 464 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 465 const forceOverscroll = this.shouldForceOverscroll(); 466 const transitionShadow = mode === 'ios'; 467 const TagType = isMainContent ? 'main' : 'div'; 468 this.resize(); 469 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 470 class: (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.c)(this.color, { 471 [mode]: true, 472 'content-sizing': (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.h)('ion-popover', this.el), 473 'overscroll': forceOverscroll, 474 [`content-${rtl}`]: true 475 }), 476 style: { 477 '--offset-top': `${this.cTop}px`, 478 '--offset-bottom': `${this.cBottom}px` 479 } 480 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 481 id: "background-content", 482 part: "background" 483 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(TagType, { 484 class: { 485 'inner-scroll': true, 486 'scroll-x': scrollX, 487 'scroll-y': scrollY, 488 'overscroll': (scrollX || scrollY) && forceOverscroll 489 }, 490 ref: scrollEl => this.scrollEl = scrollEl, 491 onScroll: this.scrollEvents ? ev => this.onScroll(ev) : undefined, 492 part: "scroll" 493 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null)), transitionShadow ? (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 494 class: "transition-effect" 495 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 496 class: "transition-cover" 497 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 498 class: "transition-shadow" 499 })) : null, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", { 500 name: "fixed" 501 })); 502 } 503 504 get el() { 505 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 506 } 507 508}; 509 510const getParentElement = el => { 511 if (el.parentElement) { 512 // normal element with a parent element 513 return el.parentElement; 514 } 515 516 if (el.parentNode && el.parentNode.host) { 517 // shadow dom's document fragment 518 return el.parentNode.host; 519 } 520 521 return null; 522}; 523 524const getPageElement = el => { 525 const tabs = el.closest('ion-tabs'); 526 527 if (tabs) { 528 return tabs; 529 } 530 /** 531 * If we're in a popover, we need to use its wrapper so we can account for space 532 * between the popover and the edges of the screen. But if the popover contains 533 * its own page element, we should use that instead. 534 */ 535 536 537 const page = el.closest('ion-app, ion-page, .ion-page, page-inner, .popover-content'); 538 539 if (page) { 540 return page; 541 } 542 543 return getParentElement(el); 544}; // ******** DOM READ **************** 545 546 547const updateScrollDetail = (detail, el, timestamp, shouldStart) => { 548 const prevX = detail.currentX; 549 const prevY = detail.currentY; 550 const prevT = detail.currentTime; 551 const currentX = el.scrollLeft; 552 const currentY = el.scrollTop; 553 const timeDelta = timestamp - prevT; 554 555 if (shouldStart) { 556 // remember the start positions 557 detail.startTime = timestamp; 558 detail.startX = currentX; 559 detail.startY = currentY; 560 detail.velocityX = detail.velocityY = 0; 561 } 562 563 detail.currentTime = timestamp; 564 detail.currentX = detail.scrollLeft = currentX; 565 detail.currentY = detail.scrollTop = currentY; 566 detail.deltaX = currentX - detail.startX; 567 detail.deltaY = currentY - detail.startY; 568 569 if (timeDelta > 0 && timeDelta < 100) { 570 const velocityX = (currentX - prevX) / timeDelta; 571 const velocityY = (currentY - prevY) / timeDelta; 572 detail.velocityX = velocityX * 0.7 + detail.velocityX * 0.3; 573 detail.velocityY = velocityY * 0.7 + detail.velocityY * 0.3; 574 } 575}; 576 577Content.style = contentCss; 578 579const handleFooterFade = (scrollEl, baseEl) => { 580 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.f)(() => { 581 const scrollTop = scrollEl.scrollTop; 582 const maxScroll = scrollEl.scrollHeight - scrollEl.clientHeight; 583 /** 584 * Toolbar background will fade 585 * out over fadeDuration in pixels. 586 */ 587 588 const fadeDuration = 10; 589 /** 590 * Begin fading out maxScroll - 30px 591 * from the bottom of the content. 592 * Also determine how close we are 593 * to starting the fade. If we are 594 * before the starting point, the 595 * scale value will get clamped to 0. 596 * If we are after the maxScroll (rubber 597 * band scrolling), the scale value will 598 * get clamped to 1. 599 */ 600 601 const fadeStart = maxScroll - fadeDuration; 602 const distanceToStart = scrollTop - fadeStart; 603 const scale = (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.k)(0, 1 - distanceToStart / fadeDuration, 1); 604 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 605 baseEl.style.setProperty('--opacity-scale', scale.toString()); 606 }); 607 }); 608}; 609
610const footerIosCss = "ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-ios ion-toolbar:first-of-type{--border-width:0.55px 0 0}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.footer-background{left:0;right:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.footer-translucent-ios ion-toolbar{--opacity:.8}}.footer-ios.ion-no-border ion-toolbar:first-of-type{--border-width:0}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}"; 611const footerMdCss = "ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-md::before{left:0;top:-2px;bottom:auto;background-position:left 0 top 0;position:absolute;width:100%;height:2px;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAHBAMAAADzDtBxAAAAD1BMVEUAAAAAAAAAAAAAAAAAAABPDueNAAAABXRSTlMUCS0gBIh/TXEAAAAaSURBVAjXYxCEAgY4UIICBmMogMsgFLtAAQCNSwXZKOdPxgAAAABJRU5ErkJggg==\");background-repeat:repeat-x;content:\"\"}[dir=rtl] .footer-md::before,:host-context([dir=rtl]) .footer-md::before{left:unset;right:unset;right:0}[dir=rtl] .footer-md::before,:host-context([dir=rtl]) .footer-md::before{background-position:right 0 top 0}.footer-md.ion-no-border::before{display:none}"; 612const Footer = class { 613 constructor(hostRef) { 614 var _this7 = this; 615 616 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 617 /** 618 * If `true`, the footer will be translucent. 619 * Only applies when the mode is `"ios"` and the device supports 620 * [`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility). 621 * 622 * Note: In order to scroll content behind the footer, the `fullscreen` 623 * attribute needs to be set on the content. 624 */ 625 626 this.translucent = false; 627 628 this.checkCollapsibleFooter = () => { 629 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 630 631 if (mode !== 'ios') { 632 return; 633 } 634 635 const { 636 collapse 637 } = this; 638 const hasFade = collapse === 'fade'; 639 this.destroyCollapsibleFooter(); 640 641 if (hasFade) { 642 const pageEl = this.el.closest('ion-app,ion-page,.ion-page,page-inner'); 643 const contentEl = pageEl ? pageEl.querySelector('ion-content') : null; 644 this.setupFadeFooter(contentEl); 645 } 646 }; 647 648 this.setupFadeFooter = /*#__PURE__*/function () { 649 var _ref2 = (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* (contentEl) { 650 if (!contentEl) { 651 console.error('ion-footer requires a content to collapse. Make sure there is an ion-content.'); 652 return; 653 } 654 655 yield new Promise(resolve => (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.c)(contentEl, resolve)); 656 const scrollEl = _this7.scrollEl = yield contentEl.getScrollElement(); 657 /** 658 * Handle fading of toolbars on scroll 659 */ 660 661 _this7.contentScrollCallback = () => { 662 handleFooterFade(scrollEl, _this7.el); 663 }; 664 665 scrollEl.addEventListener('scroll', _this7.contentScrollCallback); 666 handleFooterFade(scrollEl, _this7.el); 667 }); 668 669 return function (_x) { 670 return _ref2.apply(this, arguments); 671 }; 672 }(); 673 } 674 675 componentDidLoad() { 676 this.checkCollapsibleFooter(); 677 } 678 679 componentDidUpdate() { 680 this.checkCollapsibleFooter(); 681 } 682 683 destroyCollapsibleFooter() { 684 if (this.scrollEl && this.contentScrollCallback) { 685 this.scrollEl.removeEventListener('scroll', this.contentScrollCallback); 686 this.contentScrollCallback = undefined; 687 } 688 } 689 690 render() { 691 const { 692 translucent, 693 collapse 694 } = this; 695 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 696 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 697 role: "contentinfo", 698 class: { 699 [mode]: true, 700 // Used internally for styling 701 [`footer-${mode}`]: true, 702 [`footer-translucent`]: translucent, 703 [`footer-translucent-${mode}`]: translucent, 704 [`footer-collapse-${collapse}`]: collapse !== undefined 705 } 706 }, mode === 'ios' && translucent && (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 707 class: "footer-background" 708 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null)); 709 } 710 711 get el() { 712 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 713 } 714 715}; 716Footer.style = { 717 ios: footerIosCss, 718 md: footerMdCss 719}; 720const TRANSITION = 'all 0.2s ease-in-out'; 721 722const cloneElement = tagName => { 723 const getCachedEl = document.querySelector(`${tagName}.ion-cloned-element`); 724 725 if (getCachedEl !== null) { 726 return getCachedEl; 727 } 728 729 const clonedEl = document.createElement(tagName); 730 clonedEl.classList.add('ion-cloned-element'); 731 clonedEl.style.setProperty('display', 'none'); 732 document.body.appendChild(clonedEl); 733 return clonedEl; 734}; 735 736const createHeaderIndex = headerEl => { 737 if (!headerEl) { 738 return; 739 } 740 741 const toolbars = headerEl.querySelectorAll('ion-toolbar'); 742 return { 743 el: headerEl, 744 toolbars: Array.from(toolbars).map(toolbar => { 745 const ionTitleEl = toolbar.querySelector('ion-title'); 746 return { 747 el: toolbar, 748 background: toolbar.shadowRoot.querySelector('.toolbar-background'), 749 ionTitleEl, 750 innerTitleEl: ionTitleEl ? ionTitleEl.shadowRoot.querySelector('.toolbar-title') : null, 751 ionButtonsEl: Array.from(toolbar.querySelectorAll('ion-buttons')) || [] 752 }; 753 }) || [] 754 }; 755}; 756 757const handleContentScroll = (scrollEl, scrollHeaderIndex, contentEl) => { 758 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.f)(() => { 759 const scrollTop = scrollEl.scrollTop; 760 const scale = (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.k)(1, 1 + -scrollTop / 500, 1.1); // Native refresher should not cause titles to scale 761 762 const nativeRefresher = contentEl.querySelector('ion-refresher.refresher-native'); 763 764 if (nativeRefresher === null) { 765 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 766 scaleLargeTitles(scrollHeaderIndex.toolbars, scale); 767 }); 768 } 769 }); 770}; 771
772const setToolbarBackgroundOpacity = (headerEl, opacity) => { 773 /** 774 * Fading in the backdrop opacity 775 * should happen after the large title 776 * has collapsed, so it is handled 777 * by handleHeaderFade() 778 */ 779 if (headerEl.collapse === 'fade') { 780 return; 781 } 782 783 if (opacity === undefined) { 784 headerEl.style.removeProperty('--opacity-scale'); 785 } else { 786 headerEl.style.setProperty('--opacity-scale', opacity.toString()); 787 } 788}; 789 790const handleToolbarBorderIntersection = (ev, mainHeaderIndex, scrollTop) => { 791 if (!ev[0].isIntersecting) { 792 return; 793 } 794 /** 795 * There is a bug in Safari where overflow scrolling on a non-body element 796 * does not always reset the scrollTop position to 0 when letting go. It will 797 * set to 1 once the rubber band effect has ended. This causes the background to 798 * appear slightly on certain app setups. 799 * 800 * Additionally, we check if user is rubber banding (scrolling is negative) 801 * as this can mean they are using pull to refresh. Once the refresher starts, 802 * the content is transformed which can cause the intersection observer to erroneously 803 * fire here as well. 804 */ 805 806 807 const scale = ev[0].intersectionRatio > 0.9 || scrollTop <= 0 ? 0 : (1 - ev[0].intersectionRatio) * 100 / 75; 808 setToolbarBackgroundOpacity(mainHeaderIndex.el, scale === 1 ? undefined : scale); 809}; 810/** 811 * If toolbars are intersecting, hide the scrollable toolbar content 812 * and show the primary toolbar content. If the toolbars are not intersecting, 813 * hide the primary toolbar content and show the scrollable toolbar content 814 */ 815 816 817const handleToolbarIntersection = (ev, mainHeaderIndex, scrollHeaderIndex, scrollEl) => { 818 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 819 const scrollTop = scrollEl.scrollTop; 820 handleToolbarBorderIntersection(ev, mainHeaderIndex, scrollTop); 821 const event = ev[0]; 822 const intersection = event.intersectionRect; 823 const intersectionArea = intersection.width * intersection.height; 824 const rootArea = event.rootBounds.width * event.rootBounds.height; 825 const isPageHidden = intersectionArea === 0 && rootArea === 0; 826 const leftDiff = Math.abs(intersection.left - event.boundingClientRect.left); 827 const rightDiff = Math.abs(intersection.right - event.boundingClientRect.right); 828 const isPageTransitioning = intersectionArea > 0 && (leftDiff >= 5 || rightDiff >= 5); 829 830 if (isPageHidden || isPageTransitioning) { 831 return; 832 } 833 834 if (event.isIntersecting) { 835 setHeaderActive(mainHeaderIndex, false); 836 setHeaderActive(scrollHeaderIndex); 837 } else { 838 /** 839 * There is a bug with IntersectionObserver on Safari 840 * where `event.isIntersecting === false` when cancelling 841 * a swipe to go back gesture. Checking the intersection 842 * x, y, width, and height provides a workaround. This bug 843 * does not happen when using Safari + Web Animations, 844 * only Safari + CSS Animations. 845 */ 846 const hasValidIntersection = intersection.x === 0 && intersection.y === 0 || intersection.width !== 0 && intersection.height !== 0; 847 848 if (hasValidIntersection && scrollTop > 0) { 849 setHeaderActive(mainHeaderIndex); 850 setHeaderActive(scrollHeaderIndex, false); 851 setToolbarBackgroundOpacity(mainHeaderIndex.el); 852 } 853 } 854 }); 855}; 856 857const setHeaderActive = (headerIndex, active = true) => { 858 if (active) { 859 headerIndex.el.classList.remove('header-collapse-condense-inactive'); 860 } else { 861 headerIndex.el.classList.add('header-collapse-condense-inactive'); 862 } 863}; 864 865const scaleLargeTitles = (toolbars = [], scale = 1, transition = false) => { 866 toolbars.forEach(toolbar => { 867 const ionTitle = toolbar.ionTitleEl; 868 const titleDiv = toolbar.innerTitleEl; 869 870 if (!ionTitle || ionTitle.size !== 'large') { 871 return; 872 } 873 874 titleDiv.style.transition = transition ? TRANSITION : ''; 875 titleDiv.style.transform = `scale3d(${scale}, ${scale}, 1)`; 876 }); 877}; 878 879const handleHeaderFade = (scrollEl, baseEl, condenseHeader) => { 880 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.f)(() => { 881 const scrollTop = scrollEl.scrollTop; 882 const baseElHeight = baseEl.clientHeight; 883 const fadeStart = condenseHeader ? condenseHeader.clientHeight : 0; 884 /** 885 * If we are using fade header with a condense 886 * header, then the toolbar backgrounds should 887 * not begin to fade in until the condense 888 * header has fully collapsed. 889 * 890 * Additionally, the main content should not 891 * overflow out of the container until the 892 * condense header has fully collapsed. When 893 * using just the condense header the content 894 * should overflow out of the container. 895 */ 896 897 if (condenseHeader !== null && scrollTop < fadeStart) { 898 baseEl.style.setProperty('--opacity-scale', '0'); 899 scrollEl.style.setProperty('clip-path', `inset(${baseElHeight}px 0px 0px 0px)`); 900 return; 901 } 902 903 const distanceToStart = scrollTop - fadeStart; 904 const fadeDuration = 10; 905 const scale = (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.k)(0, distanceToStart / fadeDuration, 1); 906 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 907 scrollEl.style.removeProperty('clip-path'); 908 baseEl.style.setProperty('--opacity-scale', scale.toString()); 909 }); 910 }); 911}; 912
913const headerIosCss = "ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%;z-index:10}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}.header-ios ion-toolbar:last-of-type{--border-width:0 0 0.55px}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{left:0;right:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.header-translucent-ios ion-toolbar{--opacity:.8}.header-collapse-condense-inactive .header-background{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}}.header-ios.ion-no-border ion-toolbar:last-of-type{--border-width:0}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:7px;z-index:1}.header-collapse-condense ion-toolbar{--background:var(--ion-background-color, #fff);z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{height:48px;padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}"; 914const headerMdCss = "ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%;z-index:10}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}.header-md::after{left:0;bottom:-5px;background-position:left 0 top -2px;position:absolute;width:100%;height:5px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAHBAMAAADzDtBxAAAAD1BMVEUAAAAAAAAAAAAAAAAAAABPDueNAAAABXRSTlMUCS0gBIh/TXEAAAAaSURBVAjXYxCEAgY4UIICBmMogMsgFLtAAQCNSwXZKOdPxgAAAABJRU5ErkJggg==);background-repeat:repeat-x;content:\"\"}[dir=rtl] .header-md::after,:host-context([dir=rtl]) .header-md::after{left:unset;right:unset;right:0}[dir=rtl] .header-md::after,:host-context([dir=rtl]) .header-md::after{background-position:right 0 top -2px}.header-collapse-condense{display:none}.header-md.ion-no-border::after{display:none}"; 915const Header = class { 916 constructor(hostRef) { 917 var _this8 = this; 918 919 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 920 this.inheritedAttributes = {}; 921 /** 922 * If `true`, the header will be translucent. 923 * Only applies when the mode is `"ios"` and the device supports 924 * [`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility). 925 * 926 * Note: In order to scroll content behind the header, the `fullscreen` 927 * attribute needs to be set on the content. 928 */ 929 930 this.translucent = false; 931 932 this.setupFadeHeader = /*#__PURE__*/function () { 933 var _ref3 = (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* (contentEl, condenseHeader) { 934 if (!contentEl) { 935 console.error('ion-header requires a content to collapse. Make sure there is an ion-content.'); 936 return; 937 } 938 939 yield new Promise(resolve => (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.c)(contentEl, resolve)); 940 const scrollEl = _this8.scrollEl = yield contentEl.getScrollElement(); 941 /** 942 * Handle fading of toolbars on scroll 943 */ 944 945 _this8.contentScrollCallback = () => { 946 handleHeaderFade(_this8.scrollEl, _this8.el, condenseHeader); 947 }; 948 949 scrollEl.addEventListener('scroll', _this8.contentScrollCallback); 950 handleHeaderFade(_this8.scrollEl, _this8.el, condenseHeader); 951 }); 952 953 return function (_x2, _x3) { 954 return _ref3.apply(this, arguments); 955 }; 956 }(); 957 } 958 959 componentWillLoad() { 960 this.inheritedAttributes = (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.i)(this.el, ['role']); 961 } 962 963 componentDidLoad() { 964 this.checkCollapsibleHeader(); 965 } 966 967 componentDidUpdate() { 968 this.checkCollapsibleHeader(); 969 } 970 971 disconnectedCallback() { 972 this.destroyCollapsibleHeader(); 973 } 974 975 checkCollapsibleHeader() { 976 var _this9 = this; 977 978 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 979 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(_this9); 980
981 if (mode !== 'ios') { 982 return; 983 } 984 985 const { 986 collapse 987 } = _this9; 988 const hasCondense = collapse === 'condense'; 989 const hasFade = collapse === 'fade'; 990 991 _this9.destroyCollapsibleHeader(); 992 993 if (hasCondense) { 994 const pageEl = _this9.el.closest('ion-app,ion-page,.ion-page,page-inner'); 995 996 const contentEl = pageEl ? pageEl.querySelector('ion-content') : null; // Cloned elements are always needed in iOS transition 997 998 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 999 const title = cloneElement('ion-title'); 1000 title.size = 'large'; 1001 cloneElement('ion-back-button'); 1002 }); 1003 yield _this9.setupCondenseHeader(contentEl, pageEl); 1004 } else if (hasFade) { 1005 const pageEl = _this9.el.closest('ion-app,ion-page,.ion-page,page-inner'); 1006 1007 const contentEl = pageEl ? pageEl.querySelector('ion-content') : null; 1008 const condenseHeader = contentEl ? contentEl.querySelector('ion-header[collapse="condense"]') : null; 1009 yield _this9.setupFadeHeader(contentEl, condenseHeader); 1010 } 1011 })(); 1012 } 1013 1014 destroyCollapsibleHeader() { 1015 if (this.intersectionObserver) { 1016 this.intersectionObserver.disconnect(); 1017 this.intersectionObserver = undefined; 1018 } 1019 1020 if (this.scrollEl && this.contentScrollCallback) { 1021 this.scrollEl.removeEventListener('scroll', this.contentScrollCallback); 1022 this.contentScrollCallback = undefined; 1023 } 1024 1025 if (this.collapsibleMainHeader) { 1026 this.collapsibleMainHeader.classList.remove('header-collapse-main'); 1027 this.collapsibleMainHeader = undefined; 1028 } 1029 } 1030 1031 setupCondenseHeader(contentEl, pageEl) { 1032 var _this0 = this; 1033 1034 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1035 if (!contentEl || !pageEl) { 1036 console.error('ion-header requires a content to collapse, make sure there is an ion-content.'); 1037 return; 1038 } 1039 1040 if (typeof IntersectionObserver === 'undefined') { 1041 return; 1042 } 1043 1044 yield new Promise(resolve => (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.c)(contentEl, resolve)); 1045 _this0.scrollEl = yield contentEl.getScrollElement(); 1046 const headers = pageEl.querySelectorAll('ion-header'); 1047 _this0.collapsibleMainHeader = Array.from(headers).find(header => header.collapse !== 'condense'); 1048 1049 if (!_this0.collapsibleMainHeader) { 1050 return; 1051 } 1052 1053 const mainHeaderIndex = createHeaderIndex(_this0.collapsibleMainHeader); 1054 const scrollHeaderIndex = createHeaderIndex(_this0.el); 1055 1056 if (!mainHeaderIndex || !scrollHeaderIndex) { 1057 return; 1058 } 1059 1060 setHeaderActive(mainHeaderIndex, false); 1061 setToolbarBackgroundOpacity(mainHeaderIndex.el, 0); 1062 /** 1063 * Handle interaction between toolbar collapse and 1064 * showing/hiding content in the primary ion-header 1065 * as well as progressively showing/hiding the main header 1066 * border as the top-most toolbar collapses or expands. 1067 */ 1068 1069 const toolbarIntersection = ev => { 1070 handleToolbarIntersection(ev, mainHeaderIndex, scrollHeaderIndex, _this0.scrollEl); 1071 }; 1072 1073 _this0.intersectionObserver = new IntersectionObserver(toolbarIntersection, { 1074 root: contentEl, 1075 threshold: [0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] 1076 }); 1077 1078 _this0.intersectionObserver.observe(scrollHeaderIndex.toolbars[scrollHeaderIndex.toolbars.length - 1].el); 1079 /** 1080 * Handle scaling of large iOS titles and 1081 * showing/hiding border on last toolbar 1082 * in primary header 1083 */ 1084 1085 1086 _this0.contentScrollCallback = () => { 1087 handleContentScroll(_this0.scrollEl, scrollHeaderIndex, contentEl); 1088 }; 1089 1090 _this0.scrollEl.addEventListener('scroll', _this0.contentScrollCallback); 1091 1092 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.c)(() => { 1093 if (_this0.collapsibleMainHeader !== undefined) { 1094 _this0.collapsibleMainHeader.classList.add('header-collapse-main'); 1095 } 1096 }); 1097 })(); 1098 } 1099 1100 render() { 1101 const { 1102 translucent, 1103 inheritedAttributes 1104 } = this; 1105 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 1106 const collapse = this.collapse || 'none'; // banner role must be at top level, so remove role if inside a menu 1107 1108 const roleType = (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.h)('ion-menu', this.el) ? 'none' : 'banner'; 1109 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, Object.assign({ 1110 role: roleType, 1111 class: { 1112 [mode]: true, 1113 // Used internally for styling 1114 [`header-${mode}`]: true, 1115 [`header-translucent`]: this.translucent, 1116 [`header-collapse-${collapse}`]: true, 1117 [`header-translucent-${mode}`]: this.translucent 1118 } 1119 }, inheritedAttributes), mode === 'ios' && translucent && (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 1120 class: "header-background" 1121 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null)); 1122 } 1123 1124 get el() { 1125 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 1126 } 1127 1128}; 1129Header.style = { 1130 ios: headerIosCss, 1131 md: headerMdCss 1132}; 1133const routeOutletCss = ":host{left:0;right:0;top:0;bottom:0;position:absolute;contain:layout size style;overflow:hidden;z-index:0}"; 1134const RouterOutlet = class { 1135 constructor(hostRef) { 1136 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 1137 this.ionNavWillLoad = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionNavWillLoad", 7); 1138 this.ionNavWillChange = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionNavWillChange", 3); 1139 this.ionNavDidChange = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionNavDidChange", 3); 1140 this.gestureOrAnimationInProgress = false;
1141 /** 1142 * The mode determines which platform styles to use. 1143 */ 1144 1145 this.mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 1146 /** 1147 * If `true`, the router-outlet should animate the transition of components. 1148 */ 1149 1150 this.animated = true; 1151 } 1152 1153 swipeHandlerChanged() { 1154 if (this.gesture) { 1155 this.gesture.enable(this.swipeHandler !== undefined); 1156 } 1157 } 1158 1159 connectedCallback() { 1160 var _this1 = this; 1161 1162 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1163 const onStart = () => { 1164 _this1.gestureOrAnimationInProgress = true; 1165 1166 if (_this1.swipeHandler) { 1167 _this1.swipeHandler.onStart(); 1168 } 1169 }; 1170 1171 _this1.gesture = (yield __webpack_require__.e(/*! import() */ "common").then(__webpack_require__.bind(__webpack_require__, /*! ./swipe-back-f65c5686.js */ 6718))).createSwipeBackGesture(_this1.el, () => !_this1.gestureOrAnimationInProgress && !!_this1.swipeHandler && _this1.swipeHandler.canStart(), () => onStart(), step => _this1.ani && _this1.ani.progressStep(step), (shouldComplete, step, dur) => { 1172 if (_this1.ani) { 1173 _this1.ani.onFinish(() => { 1174 _this1.gestureOrAnimationInProgress = false; 1175 1176 if (_this1.swipeHandler) { 1177 _this1.swipeHandler.onEnd(shouldComplete); 1178 } 1179 }, { 1180 oneTimeCallback: true 1181 }); // Account for rounding errors in JS 1182 1183 1184 let newStepValue = shouldComplete ? -0.001 : 0.001; 1185 /** 1186 * Animation will be reversed here, so need to 1187 * reverse the easing curve as well 1188 * 1189 * Additionally, we need to account for the time relative 1190 * to the new easing curve, as `stepValue` is going to be given 1191 * in terms of a linear curve. 1192 */ 1193 1194 if (!shouldComplete) { 1195 _this1.ani.easing('cubic-bezier(1, 0, 0.68, 0.28)'); 1196 1197 newStepValue += (0,_cubic_bezier_154a53a5_js__WEBPACK_IMPORTED_MODULE_6__.g)([0, 0], [1, 0], [0.68, 0.28], [1, 1], step)[0]; 1198 } else { 1199 newStepValue += (0,_cubic_bezier_154a53a5_js__WEBPACK_IMPORTED_MODULE_6__.g)([0, 0], [0.32, 0.72], [0, 1], [1, 1], step)[0]; 1200 } 1201 1202 _this1.ani.progressEnd(shouldComplete ? 1 : 0, newStepValue, dur); 1203 } else { 1204 _this1.gestureOrAnimationInProgress = false; 1205 } 1206 }); 1207 1208 _this1.swipeHandlerChanged(); 1209 })(); 1210 } 1211 1212 componentWillLoad() { 1213 this.ionNavWillLoad.emit(); 1214 } 1215 1216 disconnectedCallback() { 1217 if (this.gesture) { 1218 this.gesture.destroy(); 1219 this.gesture = undefined; 1220 } 1221 } 1222 /** @internal */ 1223 1224 1225 commit(enteringEl, leavingEl, opts) { 1226 var _this10 = this; 1227 1228 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1229 const unlock = yield _this10.lock(); 1230 let changed = false; 1231 1232 try { 1233 changed = yield _this10.transition(enteringEl, leavingEl, opts); 1234 } catch (e) { 1235 console.error(e); 1236 } 1237 1238 unlock(); 1239 return changed; 1240 })(); 1241 } 1242 /** @internal */ 1243 1244 1245 setRouteId(id, params, direction, animation) { 1246 var _this11 = this; 1247 1248 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1249 const changed = yield _this11.setRoot(id, params, { 1250 duration: direction === 'root' ? 0 : undefined, 1251 direction: direction === 'back' ? 'back' : 'forward', 1252 animationBuilder: animation 1253 }); 1254 return { 1255 changed, 1256 element: _this11.activeEl 1257 }; 1258 })(); 1259 } 1260 /** @internal */ 1261 1262 1263 getRouteId() { 1264 var _this12 = this; 1265 1266 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1267 const active = _this12.activeEl; 1268 return active ? { 1269 id: active.tagName, 1270 element: active, 1271 params: _this12.activeParams 1272 } : undefined; 1273 })(); 1274 } 1275 1276 setRoot(component, params, opts) { 1277 var _this13 = this; 1278 1279 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1280 if (_this13.activeComponent === component && (0,_helpers_6e1e5b65_js__WEBPACK_IMPORTED_MODULE_3__.s)(params, _this13.activeParams)) { 1281 return false;
1282 } // attach entering view to DOM 1283 1284 1285 const leavingEl = _this13.activeEl; 1286 const enteringEl = yield (0,_framework_delegate_0e9f0224_js__WEBPACK_IMPORTED_MODULE_7__.a)(_this13.delegate, _this13.el, component, ['ion-page', 'ion-page-invisible'], params); 1287 _this13.activeComponent = component; 1288 _this13.activeEl = enteringEl; 1289 _this13.activeParams = params; // commit animation 1290 1291 yield _this13.commit(enteringEl, leavingEl, opts); 1292 yield (0,_framework_delegate_0e9f0224_js__WEBPACK_IMPORTED_MODULE_7__.d)(_this13.delegate, leavingEl); 1293 return true; 1294 })(); 1295 } 1296 1297 transition(enteringEl, leavingEl, opts = {}) { 1298 var _this14 = this; 1299 1300 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1301 if (leavingEl === enteringEl) { 1302 return false; 1303 } // emit nav will change event 1304 1305 1306 _this14.ionNavWillChange.emit(); 1307 1308 const { 1309 el, 1310 mode 1311 } = _this14; 1312 const animated = _this14.animated && _ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.getBoolean('animated', true); 1313 const animationBuilder = opts.animationBuilder || _this14.animation || _ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.c.get('navAnimation'); 1314 yield (0,_index_e6c2c822_js__WEBPACK_IMPORTED_MODULE_8__.t)(Object.assign(Object.assign({ 1315 mode, 1316 animated, 1317 enteringEl, 1318 leavingEl, 1319 baseEl: el, 1320 progressCallback: opts.progressAnimation ? ani => { 1321 /** 1322 * Because this progress callback is called asynchronously 1323 * it is possible for the gesture to start and end before 1324 * the animation is ever set. In that scenario, we should 1325 * immediately call progressEnd so that the transition promise 1326 * resolves and the gesture does not get locked up. 1327 */ 1328 if (ani !== undefined && !_this14.gestureOrAnimationInProgress) { 1329 _this14.gestureOrAnimationInProgress = true; 1330 ani.onFinish(() => { 1331 _this14.gestureOrAnimationInProgress = false; 1332 1333 if (_this14.swipeHandler) { 1334 _this14.swipeHandler.onEnd(false); 1335 } 1336 }, { 1337 oneTimeCallback: true 1338 }); 1339 /** 1340 * Playing animation to beginning 1341 * with a duration of 0 prevents 1342 * any flickering when the animation 1343 * is later cleaned up. 1344 */ 1345 1346 ani.progressEnd(0, 0, 0); 1347 } else { 1348 _this14.ani = ani; 1349 } 1350 } : undefined 1351 }, opts), { 1352 animationBuilder 1353 })); // emit nav changed event 1354 1355 _this14.ionNavDidChange.emit(); 1356 1357 return true; 1358 })(); 1359 } 1360 1361 lock() { 1362 var _this15 = this; 1363 1364 return (0,C_Visual_TRUV2_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () { 1365 const p = _this15.waitPromise; 1366 let resolve; 1367 _this15.waitPromise = new Promise(r => resolve = r); 1368 1369 if (p !== undefined) { 1370 yield p; 1371 } 1372 1373 return resolve; 1374 })(); 1375 } 1376 1377 render() { 1378 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null); 1379 } 1380 1381 get el() { 1382 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 1383 } 1384 1385 static get watchers() { 1386 return { 1387 "swipeHandler": ["swipeHandlerChanged"] 1388 }; 1389 } 1390 1391}; 1392RouterOutlet.style = routeOutletCss; 1393const titleIosCss = ":host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}:host(.ion-color){color:var(--ion-color-base)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host{left:0;top:0;padding-left:90px;padding-right:90px;padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);position:absolute;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);font-size:17px;font-weight:600;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}:host-context([dir=rtl]){left:unset;right:unset;right:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host{padding-left:unset;padding-right:unset;-webkit-padding-start:90px;padding-inline-start:90px;-webkit-padding-end:90px;padding-inline-end:90px}}:host(.title-small){padding-left:9px;padding-right:9px;padding-top:6px;padding-bottom:16px;position:relative;font-size:13px;font-weight:normal}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host(.title-small){padding-left:unset;padding-right:unset;-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px}}:host(.title-large){padding-left:16px;padding-right:16px;padding-top:0;padding-bottom:0;-webkit-transform-origin:left center;transform-origin:left center;bottom:0;-ms-flex-align:end;align-items:flex-end;min-width:100%;padding-bottom:6px;font-size:34px;font-weight:700;text-align:start}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host(.title-large){padding-left:unset;padding-right:unset;-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px}}:host(.title-large.title-rtl){-webkit-transform-origin:right center;transform-origin:right center}:host(.title-large.ion-cloned-element){--color:var(--ion-text-color, #000)}:host(.title-large) .toolbar-title{-webkit-transform-origin:inherit;transform-origin:inherit}
1393:host-context([dir=rtl]):host(.title-large) .toolbar-title,:host-context([dir=rtl]).title-large .toolbar-title{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}"; 1394const titleMdCss = ":host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}:host(.ion-color){color:var(--ion-color-base)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host{padding-left:20px;padding-right:20px;padding-top:0;padding-bottom:0;font-size:20px;font-weight:500;letter-spacing:0.0125em}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host{padding-left:unset;padding-right:unset;-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px}}:host(.title-small){width:100%;height:100%;font-size:15px;font-weight:normal}"; 1395const ToolbarTitle = class { 1396 constructor(hostRef) { 1397 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 1398 this.ionStyle = (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.e)(this, "ionStyle", 7); 1399 } 1400 1401 sizeChanged() { 1402 this.emitStyle(); 1403 } 1404 1405 connectedCallback() { 1406 this.emitStyle(); 1407 } 1408 1409 emitStyle() { 1410 const size = this.getSize(); 1411 this.ionStyle.emit({ 1412 [`title-${size}`]: true 1413 }); 1414 } 1415 1416 getSize() { 1417 return this.size !== undefined ? this.size : 'default'; 1418 } 1419 1420 render() { 1421 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 1422 const size = this.getSize(); 1423 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 1424 class: (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.c)(this.color, { 1425 [mode]: true, 1426 [`title-${size}`]: true, 1427 'title-rtl': document.dir === 'rtl' 1428 }) 1429 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 1430 class: "toolbar-title" 1431 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null))); 1432 } 1433 1434 get el() { 1435 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 1436 } 1437 1438 static get watchers() { 1439 return { 1440 "size": ["sizeChanged"] 1441 }; 1442 } 1443 1444}; 1445ToolbarTitle.style = { 1446 ios: titleIosCss, 1447 md: titleMdCss 1448}; 1449const toolbarIosCss = ":host{--border-width:0;--border-style:solid;--opacity:1;--opacity-scale:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding-left:var(--ion-safe-area-left);padding-right:var(--ion-safe-area-right);display:block;position:relative;width:100%;color:var(--color);font-family:var(--ion-font-family, inherit);contain:content;z-index:10;-webkit-box-sizing:border-box;box-sizing:border-box}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--ion-safe-area-left);padding-inline-start:var(--ion-safe-area-left);-webkit-padding-end:var(--ion-safe-area-right);padding-inline-end:var(--ion-safe-area-right)}}:host(.ion-color){color:var(--ion-color-contrast)}:host(.ion-color) .toolbar-background{background:var(--ion-color-base)}.toolbar-container{padding-left:var(--padding-start);padding-right:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);display:-ms-flexbox;display:flex;position:relative;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;width:100%;min-height:var(--min-height);contain:content;overflow:hidden;z-index:10;-webkit-box-sizing:border-box;box-sizing:border-box}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.toolbar-container{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end)}}.toolbar-background{left:0;right:0;top:0;bottom:0;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);contain:strict;opacity:calc(var(--opacity) * var(--opacity-scale));z-index:-1;pointer-events:none}::slotted(ion-progress-bar){left:0;right:0;bottom:0;position:absolute}:host{--background:var(--ion-toolbar-background, var(--ion-color-step-50, #f7f7f7));--color:var(--ion-toolbar-color, var(--ion-text-color, #000));
1449--border-color:var(--ion-toolbar-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.2))));--padding-top:3px;--padding-bottom:3px;--padding-start:4px;--padding-end:4px;--min-height:44px}.toolbar-content{-ms-flex:1;flex:1;-ms-flex-order:4;order:4;min-width:0}:host(.toolbar-segment) .toolbar-content{display:-ms-inline-flexbox;display:inline-flex}:host(.toolbar-searchbar) .toolbar-container{padding-top:0;padding-bottom:0}:host(.toolbar-searchbar) ::slotted(*){-ms-flex-item-align:start;align-self:start}:host(.toolbar-searchbar) ::slotted(ion-chip){margin-top:3px}:host(.toolbar-searchbar) ::slotted(ion-back-button){height:38px}::slotted(ion-buttons){min-height:38px}::slotted([slot=start]){-ms-flex-order:2;order:2}::slotted([slot=secondary]){-ms-flex-order:3;order:3}::slotted([slot=primary]){-ms-flex-order:5;order:5;text-align:end}::slotted([slot=end]){-ms-flex-order:6;order:6;text-align:end}:host(.toolbar-title-large) .toolbar-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:start;align-items:flex-start}:host(.toolbar-title-large) .toolbar-content ion-title{-ms-flex:1;flex:1;-ms-flex-order:8;order:8;min-width:100%}"; 1450const toolbarMdCss = ":host{--border-width:0;--border-style:solid;--opacity:1;--opacity-scale:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding-left:var(--ion-safe-area-left);padding-right:var(--ion-safe-area-right);display:block;position:relative;width:100%;color:var(--color);font-family:var(--ion-font-family, inherit);contain:content;z-index:10;-webkit-box-sizing:border-box;box-sizing:border-box}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){:host{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--ion-safe-area-left);padding-inline-start:var(--ion-safe-area-left);-webkit-padding-end:var(--ion-safe-area-right);padding-inline-end:var(--ion-safe-area-right)}}:host(.ion-color){color:var(--ion-color-contrast)}:host(.ion-color) .toolbar-background{background:var(--ion-color-base)}.toolbar-container{padding-left:var(--padding-start);padding-right:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);display:-ms-flexbox;display:flex;position:relative;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;width:100%;min-height:var(--min-height);contain:content;overflow:hidden;z-index:10;-webkit-box-sizing:border-box;box-sizing:border-box}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.toolbar-container{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end)}}.toolbar-background{left:0;right:0;top:0;bottom:0;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);contain:strict;opacity:calc(var(--opacity) * var(--opacity-scale));z-index:-1;pointer-events:none}::slotted(ion-progress-bar){left:0;right:0;bottom:0;position:absolute}:host{--background:var(--ion-toolbar-background, var(--ion-background-color, #fff));--color:var(--ion-toolbar-color, var(--ion-text-color, #424242));--border-color:var(--ion-toolbar-border-color, var(--ion-border-color, var(--ion-color-step-150, #c1c4cd)));--padding-top:0;--padding-bottom:0;--padding-start:0;--padding-end:0;--min-height:56px}.toolbar-content{-ms-flex:1;flex:1;-ms-flex-order:3;order:3;min-width:0;max-width:100%}::slotted(ion-segment){min-height:var(--min-height)}::slotted(.buttons-first-slot){margin-left:4px}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){::slotted(.buttons-first-slot){margin-left:unset;-webkit-margin-start:4px;margin-inline-start:4px}}::slotted(.buttons-last-slot){margin-right:4px}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){::slotted(.buttons-last-slot){margin-right:unset;-webkit-margin-end:4px;margin-inline-end:4px}}::slotted([slot=start]){-ms-flex-order:2;order:2}::slotted([slot=secondary]){-ms-flex-order:4;order:4}::slotted([slot=primary]){-ms-flex-order:5;order:5;text-align:end}::slotted([slot=end]){-ms-flex-order:6;order:6;text-align:end}"; 1451const Toolbar = class { 1452 constructor(hostRef) { 1453 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.r)(this, hostRef); 1454 this.childrenStyles = new Map(); 1455 } 1456 1457 componentWillLoad() { 1458 const buttons = Array.from(this.el.querySelectorAll('ion-buttons')); 1459 const firstButtons = buttons.find(button => { 1460 return button.slot === 'start'; 1461 }); 1462 1463 if (firstButtons) { 1464 firstButtons.classList.add('buttons-first-slot'); 1465 } 1466 1467 const buttonsReversed = buttons.reverse(); 1468 const lastButtons = buttonsReversed.find(button => button.slot === 'end') || buttonsReversed.find(button => button.slot === 'primary') || buttonsReversed.find(button => button.slot === 'secondary'); 1469 1470 if (lastButtons) { 1471 lastButtons.classList.add('buttons-last-slot'); 1472 } 1473 } 1474 1475 childrenStyle(ev) { 1476 ev.stopPropagation(); 1477 const tagName = ev.target.tagName; 1478 const updatedStyles = ev.detail; 1479 const newStyles = {}; 1480 const childStyles = this.childrenStyles.get(tagName) || {}; 1481 let hasStyleChange = false;
1482 Object.keys(updatedStyles).forEach(key => { 1483 const childKey = `toolbar-${key}`; 1484 const newValue = updatedStyles[key]; 1485 1486 if (newValue !== childStyles[childKey]) { 1487 hasStyleChange = true; 1488 } 1489 1490 if (newValue) { 1491 newStyles[childKey] = true; 1492 } 1493 }); 1494 1495 if (hasStyleChange) { 1496 this.childrenStyles.set(tagName, newStyles); 1497 (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.j)(this); 1498 } 1499 } 1500 1501 render() { 1502 const mode = (0,_ionic_global_0ebe321c_js__WEBPACK_IMPORTED_MODULE_2__.b)(this); 1503 const childStyles = {}; 1504 this.childrenStyles.forEach(value => { 1505 Object.assign(childStyles, value); 1506 }); 1507 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)(_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.H, { 1508 class: Object.assign(Object.assign({}, childStyles), (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.c)(this.color, { 1509 [mode]: true, 1510 'in-toolbar': (0,_theme_a24ff1ad_js__WEBPACK_IMPORTED_MODULE_5__.h)('ion-toolbar', this.el) 1511 })) 1512 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 1513 class: "toolbar-background" 1514 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 1515 class: "toolbar-container" 1516 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", { 1517 name: "start" 1518 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", { 1519 name: "secondary" 1520 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("div", { 1521 class: "toolbar-content" 1522 }, (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", null)), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", { 1523 name: "primary" 1524 }), (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.h)("slot", { 1525 name: "end" 1526 }))); 1527 } 1528 1529 get el() { 1530 return (0,_index_b3eecb14_js__WEBPACK_IMPORTED_MODULE_1__.i)(this); 1531 } 1532 1533}; 1534Toolbar.style = { 1535 ios: toolbarIosCss, 1536 md: toolbarMdCss 1537}; 1538 1539 1540/***/ }) 1541 1542}]); 1543//# sourceMappingURL=node_modules_ionic_core_dist_esm_ion-app_8_entry_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.