UNPKG

169 kBJavaScriptView Raw
1import { HostListener, Directive, ElementRef, Injectable, Inject, NgZone, defineInjectable, inject, Optional, Component, ChangeDetectionStrategy, ChangeDetectorRef, InjectionToken, ApplicationRef, Injector, EventEmitter, ViewContainerRef, ComponentFactoryResolver, Attribute, SkipSelf, Output, ViewChild, ContentChild, TemplateRef, IterableDiffers, APP_INITIALIZER, NgModule } from '@angular/core';
2import { NG_VALUE_ACCESSOR } from '@angular/forms';
3import { __awaiter } from 'tslib';
4import { DOCUMENT, Location, LocationStrategy, CommonModule } from '@angular/common';
5import { NavigationStart, UrlSerializer, Router, PRIMARY_OUTLET, ActivatedRoute, ChildrenOutletContexts, RouterLink } from '@angular/router';
6import { isPlatform, getPlatforms, LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_UNLOAD, actionSheetController, alertController, loadingController, menuController, pickerController, modalController, popoverController, toastController } from '@ionic/core';
7import { Subject, fromEvent, BehaviorSubject } from 'rxjs';
8import { filter, switchMap, distinctUntilChanged } from 'rxjs/operators';
9import { applyPolyfills, defineCustomElements } from '@ionic/core/loader';
10
11/**
12 * @fileoverview added by tsickle
13 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
14 */
15/** @type {?} */
16const raf = (/**
17 * @param {?} h
18 * @return {?}
19 */
20(h) => {
21 if (typeof __zone_symbol__requestAnimationFrame === 'function') {
22 return __zone_symbol__requestAnimationFrame(h);
23 }
24 if (typeof requestAnimationFrame === 'function') {
25 return requestAnimationFrame(h);
26 }
27 return setTimeout(h);
28});
29
30/**
31 * @fileoverview added by tsickle
32 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
33 */
34class ValueAccessor {
35 /**
36 * @param {?} el
37 */
38 constructor(el) {
39 this.el = el;
40 this.onChange = (/**
41 * @return {?}
42 */
43 () => { });
44 this.onTouched = (/**
45 * @return {?}
46 */
47 () => { });
48 }
49 /**
50 * @param {?} value
51 * @return {?}
52 */
53 writeValue(value) {
54 this.el.nativeElement.value = this.lastValue = value == null ? '' : value;
55 setIonicClasses(this.el);
56 }
57 /**
58 * @param {?} el
59 * @param {?} value
60 * @return {?}
61 */
62 handleChangeEvent(el, value) {
63 if (el === this.el.nativeElement) {
64 if (value !== this.lastValue) {
65 this.lastValue = value;
66 this.onChange(value);
67 }
68 setIonicClasses(this.el);
69 }
70 }
71 /**
72 * @param {?} el
73 * @return {?}
74 */
75 _handleBlurEvent(el) {
76 if (el === this.el.nativeElement) {
77 this.onTouched();
78 setIonicClasses(this.el);
79 }
80 }
81 /**
82 * @param {?} fn
83 * @return {?}
84 */
85 registerOnChange(fn) {
86 this.onChange = fn;
87 }
88 /**
89 * @param {?} fn
90 * @return {?}
91 */
92 registerOnTouched(fn) {
93 this.onTouched = fn;
94 }
95 /**
96 * @param {?} isDisabled
97 * @return {?}
98 */
99 setDisabledState(isDisabled) {
100 this.el.nativeElement.disabled = isDisabled;
101 }
102}
103ValueAccessor.propDecorators = {
104 _handleBlurEvent: [{ type: HostListener, args: ['ionBlur', ['$event.target'],] }]
105};
106/** @type {?} */
107const setIonicClasses = (/**
108 * @param {?} element
109 * @return {?}
110 */
111(element) => {
112 raf((/**
113 * @return {?}
114 */
115 () => {
116 /** @type {?} */
117 const input = (/** @type {?} */ (element.nativeElement));
118 /** @type {?} */
119 const classes = getClasses(input);
120 setClasses(input, classes);
121 /** @type {?} */
122 const item = input.closest('ion-item');
123 if (item) {
124 setClasses(item, classes);
125 }
126 }));
127});
128/** @type {?} */
129const getClasses = (/**
130 * @param {?} element
131 * @return {?}
132 */
133(element) => {
134 /** @type {?} */
135 const classList = element.classList;
136 /** @type {?} */
137 const classes = [];
138 for (let i = 0; i < classList.length; i++) {
139 /** @type {?} */
140 const item = classList.item(i);
141 if (item !== null && startsWith(item, 'ng-')) {
142 classes.push(`ion-${item.substr(3)}`);
143 }
144 }
145 return classes;
146});
147/** @type {?} */
148const setClasses = (/**
149 * @param {?} element
150 * @param {?} classes
151 * @return {?}
152 */
153(element, classes) => {
154 /** @type {?} */
155 const classList = element.classList;
156 [
157 'ion-valid',
158 'ion-invalid',
159 'ion-touched',
160 'ion-untouched',
161 'ion-dirty',
162 'ion-pristine'
163 ].forEach((/**
164 * @param {?} c
165 * @return {?}
166 */
167 c => classList.remove(c)));
168 classes.forEach((/**
169 * @param {?} c
170 * @return {?}
171 */
172 c => classList.add(c)));
173});
174/** @type {?} */
175const startsWith = (/**
176 * @param {?} input
177 * @param {?} search
178 * @return {?}
179 */
180(input, search) => {
181 return input.substr(0, search.length) === search;
182});
183
184/**
185 * @fileoverview added by tsickle
186 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
187 */
188class BooleanValueAccessor extends ValueAccessor {
189 /**
190 * @param {?} el
191 */
192 constructor(el) {
193 super(el);
194 }
195 /**
196 * @param {?} value
197 * @return {?}
198 */
199 writeValue(value) {
200 this.el.nativeElement.checked = this.lastValue = value == null ? false : value;
201 setIonicClasses(this.el);
202 }
203 /**
204 * @param {?} el
205 * @return {?}
206 */
207 _handleIonChange(el) {
208 this.handleChangeEvent(el, el.checked);
209 }
210}
211BooleanValueAccessor.decorators = [
212 { type: Directive, args: [{
213 /* tslint:disable-next-line:directive-selector */
214 selector: 'ion-checkbox,ion-toggle',
215 providers: [
216 {
217 provide: NG_VALUE_ACCESSOR,
218 useExisting: BooleanValueAccessor,
219 multi: true
220 }
221 ]
222 },] },
223];
224/** @nocollapse */
225BooleanValueAccessor.ctorParameters = () => [
226 { type: ElementRef }
227];
228BooleanValueAccessor.propDecorators = {
229 _handleIonChange: [{ type: HostListener, args: ['ionChange', ['$event.target'],] }]
230};
231
232/**
233 * @fileoverview added by tsickle
234 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
235 */
236class NumericValueAccessor extends ValueAccessor {
237 /**
238 * @param {?} el
239 */
240 constructor(el) {
241 super(el);
242 }
243 /**
244 * @param {?} el
245 * @return {?}
246 */
247 _handleIonChange(el) {
248 this.handleChangeEvent(el, el.value);
249 }
250 /**
251 * @param {?} fn
252 * @return {?}
253 */
254 registerOnChange(fn) {
255 super.registerOnChange((/**
256 * @param {?} value
257 * @return {?}
258 */
259 value => {
260 fn(value === '' ? null : parseFloat(value));
261 }));
262 }
263}
264NumericValueAccessor.decorators = [
265 { type: Directive, args: [{
266 /* tslint:disable-next-line:directive-selector */
267 selector: 'ion-input[type=number]',
268 providers: [
269 {
270 provide: NG_VALUE_ACCESSOR,
271 useExisting: NumericValueAccessor,
272 multi: true
273 }
274 ]
275 },] },
276];
277/** @nocollapse */
278NumericValueAccessor.ctorParameters = () => [
279 { type: ElementRef }
280];
281NumericValueAccessor.propDecorators = {
282 _handleIonChange: [{ type: HostListener, args: ['ionChange', ['$event.target'],] }]
283};
284
285/**
286 * @fileoverview added by tsickle
287 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
288 */
289class RadioValueAccessor extends ValueAccessor {
290 /**
291 * @param {?} el
292 */
293 constructor(el) {
294 super(el);
295 }
296 /**
297 * @param {?} el
298 * @return {?}
299 */
300 _handleIonSelect(el) {
301 this.handleChangeEvent(el, el.checked);
302 }
303}
304RadioValueAccessor.decorators = [
305 { type: Directive, args: [{
306 /* tslint:disable-next-line:directive-selector */
307 selector: 'ion-radio',
308 providers: [
309 {
310 provide: NG_VALUE_ACCESSOR,
311 useExisting: RadioValueAccessor,
312 multi: true
313 }
314 ]
315 },] },
316];
317/** @nocollapse */
318RadioValueAccessor.ctorParameters = () => [
319 { type: ElementRef }
320];
321RadioValueAccessor.propDecorators = {
322 _handleIonSelect: [{ type: HostListener, args: ['ionSelect', ['$event.target'],] }]
323};
324
325/**
326 * @fileoverview added by tsickle
327 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
328 */
329class SelectValueAccessor extends ValueAccessor {
330 /**
331 * @param {?} el
332 */
333 constructor(el) {
334 super(el);
335 }
336 /**
337 * @param {?} el
338 * @return {?}
339 */
340 _handleChangeEvent(el) {
341 this.handleChangeEvent(el, el.value);
342 }
343}
344SelectValueAccessor.decorators = [
345 { type: Directive, args: [{
346 /* tslint:disable-next-line:directive-selector */
347 selector: 'ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime',
348 providers: [
349 {
350 provide: NG_VALUE_ACCESSOR,
351 useExisting: SelectValueAccessor,
352 multi: true
353 }
354 ]
355 },] },
356];
357/** @nocollapse */
358SelectValueAccessor.ctorParameters = () => [
359 { type: ElementRef }
360];
361SelectValueAccessor.propDecorators = {
362 _handleChangeEvent: [{ type: HostListener, args: ['ionChange', ['$event.target'],] }]
363};
364
365/**
366 * @fileoverview added by tsickle
367 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
368 */
369class TextValueAccessor extends ValueAccessor {
370 /**
371 * @param {?} el
372 */
373 constructor(el) {
374 super(el);
375 }
376 /**
377 * @param {?} el
378 * @return {?}
379 */
380 _handleInputEvent(el) {
381 this.handleChangeEvent(el, el.value);
382 }
383}
384TextValueAccessor.decorators = [
385 { type: Directive, args: [{
386 /* tslint:disable-next-line:directive-selector */
387 selector: 'ion-input:not([type=number]),ion-textarea,ion-searchbar',
388 providers: [
389 {
390 provide: NG_VALUE_ACCESSOR,
391 useExisting: TextValueAccessor,
392 multi: true
393 }
394 ]
395 },] },
396];
397/** @nocollapse */
398TextValueAccessor.ctorParameters = () => [
399 { type: ElementRef }
400];
401TextValueAccessor.propDecorators = {
402 _handleInputEvent: [{ type: HostListener, args: ['ionChange', ['$event.target'],] }]
403};
404
405/**
406 * @fileoverview added by tsickle
407 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
408 */
409class Platform {
410 /**
411 * @param {?} doc
412 * @param {?} zone
413 */
414 constructor(doc, zone) {
415 this.doc = doc;
416 /**
417 * @hidden
418 */
419 this.backButton = (/** @type {?} */ (new Subject()));
420 /**
421 * The pause event emits when the native platform puts the application
422 * into the background, typically when the user switches to a different
423 * application. This event would emit when a Cordova app is put into
424 * the background, however, it would not fire on a standard web browser.
425 */
426 this.pause = new Subject();
427 /**
428 * The resume event emits when the native platform pulls the application
429 * out from the background. This event would emit when a Cordova app comes
430 * out from the background, however, it would not fire on a standard web browser.
431 */
432 this.resume = new Subject();
433 /**
434 * The resize event emits when the browser window has changed dimensions. This
435 * could be from a browser window being physically resized, or from a device
436 * changing orientation.
437 */
438 this.resize = new Subject();
439 zone.run((/**
440 * @return {?}
441 */
442 () => {
443 this.win = doc.defaultView;
444 this.backButton.subscribeWithPriority = (/**
445 * @param {?} priority
446 * @param {?} callback
447 * @return {?}
448 */
449 function (priority, callback) {
450 return this.subscribe((/**
451 * @param {?} ev
452 * @return {?}
453 */
454 ev => (ev.register(priority, (/**
455 * @return {?}
456 */
457 () => zone.run(callback))))));
458 });
459 proxyEvent(this.pause, doc, 'pause');
460 proxyEvent(this.resume, doc, 'resume');
461 proxyEvent(this.backButton, doc, 'ionBackButton');
462 proxyEvent(this.resize, this.win, 'resize');
463 /** @type {?} */
464 let readyResolve;
465 this._readyPromise = new Promise((/**
466 * @param {?} res
467 * @return {?}
468 */
469 res => { readyResolve = res; }));
470 if (this.win && this.win['cordova']) {
471 doc.addEventListener('deviceready', (/**
472 * @return {?}
473 */
474 () => {
475 readyResolve('cordova');
476 }), { once: true });
477 }
478 else {
479 (/** @type {?} */ (readyResolve))('dom');
480 }
481 }));
482 }
483 /**
484 * \@description
485 * Depending on the platform the user is on, `is(platformName)` will
486 * return `true` or `false`. Note that the same app can return `true`
487 * for more than one platform name. For example, an app running from
488 * an iPad would return `true` for the platform names: `mobile`,
489 * `ios`, `ipad`, and `tablet`. Additionally, if the app was running
490 * from Cordova then `cordova` would be true, and if it was running
491 * from a web browser on the iPad then `mobileweb` would be `true`.
492 *
493 * ```
494 * import { Platform } from 'ionic-angular';
495 *
496 * \@Component({...})
497 * export MyPage {
498 * constructor(public platform: Platform) {
499 * if (this.platform.is('ios')) {
500 * // This will only print when on iOS
501 * console.log('I am an iOS device!');
502 * }
503 * }
504 * }
505 * ```
506 *
507 * | Platform Name | Description |
508 * |-----------------|------------------------------------|
509 * | android | on a device running Android. |
510 * | cordova | on a device running Cordova. |
511 * | ios | on a device running iOS. |
512 * | ipad | on an iPad device. |
513 * | iphone | on an iPhone device. |
514 * | phablet | on a phablet device. |
515 * | tablet | on a tablet device. |
516 * | electron | in Electron on a desktop device. |
517 * | pwa | as a PWA app. |
518 * | mobile | on a mobile device. |
519 * | mobileweb | on a mobile device in a browser. |
520 * | desktop | on a desktop device. |
521 * | hybrid | is a cordova or capacitor app. |
522 *
523 * @param {?} platformName
524 * @return {?} returns true/false based on platform.
525 */
526 is(platformName) {
527 return isPlatform(this.win, platformName);
528 }
529 /**
530 * \@description
531 * Depending on what device you are on, `platforms` can return multiple values.
532 * Each possible value is a hierarchy of platforms. For example, on an iPhone,
533 * it would return `mobile`, `ios`, and `iphone`.
534 *
535 * ```
536 * import { Platform } from 'ionic-angular';
537 *
538 * \@Component({...})
539 * export MyPage {
540 * constructor(public platform: Platform) {
541 * // This will print an array of the current platforms
542 * console.log(this.platform.platforms());
543 * }
544 * }
545 * ```
546 * @return {?} the array of platforms
547 */
548 platforms() {
549 return getPlatforms(this.win);
550 }
551 /**
552 * Returns a promise when the platform is ready and native functionality
553 * can be called. If the app is running from within a web browser, then
554 * the promise will resolve when the DOM is ready. When the app is running
555 * from an application engine such as Cordova, then the promise will
556 * resolve when Cordova triggers the `deviceready` event.
557 *
558 * The resolved value is the `readySource`, which states which platform
559 * ready was used. For example, when Cordova is ready, the resolved ready
560 * source is `cordova`. The default ready source value will be `dom`. The
561 * `readySource` is useful if different logic should run depending on the
562 * platform the app is running from. For example, only Cordova can execute
563 * the status bar plugin, so the web should not run status bar plugin logic.
564 *
565 * ```
566 * import { Component } from '\@angular/core';
567 * import { Platform } from 'ionic-angular';
568 *
569 * \@Component({...})
570 * export MyApp {
571 * constructor(public platform: Platform) {
572 * this.platform.ready().then((readySource) => {
573 * console.log('Platform ready from', readySource);
574 * // Platform now ready, execute any required native code
575 * });
576 * }
577 * }
578 * ```
579 * @return {?}
580 */
581 ready() {
582 return this._readyPromise;
583 }
584 /**
585 * Returns if this app is using right-to-left language direction or not.
586 * We recommend the app's `index.html` file already has the correct `dir`
587 * attribute value set, such as `<html dir="ltr">` or `<html dir="rtl">`.
588 * [W3C: Structural markup and right-to-left text in HTML](http://www.w3.org/International/questions/qa-html-dir)
589 * @return {?}
590 */
591 get isRTL() {
592 return this.doc.dir === 'rtl';
593 }
594 /**
595 * Get the query string parameter
596 * @param {?} key
597 * @return {?}
598 */
599 getQueryParam(key) {
600 return readQueryParam(this.win.location.href, key);
601 }
602 /**
603 * Returns `true` if the app is in landscape mode.
604 * @return {?}
605 */
606 isLandscape() {
607 return !this.isPortrait();
608 }
609 /**
610 * Returns `true` if the app is in portait mode.
611 * @return {?}
612 */
613 isPortrait() {
614 return this.win.matchMedia && this.win.matchMedia('(orientation: portrait)').matches;
615 }
616 /**
617 * @param {?} expression
618 * @return {?}
619 */
620 testUserAgent(expression) {
621 /** @type {?} */
622 const nav = this.win.navigator;
623 return !!(nav && nav.userAgent && nav.userAgent.indexOf(expression) >= 0);
624 }
625 /**
626 * Get the current url.
627 * @return {?}
628 */
629 url() {
630 return this.win.location.href;
631 }
632 /**
633 * Gets the width of the platform's viewport using `window.innerWidth`.
634 * @return {?}
635 */
636 width() {
637 return this.win.innerWidth;
638 }
639 /**
640 * Gets the height of the platform's viewport using `window.innerHeight`.
641 * @return {?}
642 */
643 height() {
644 return this.win.innerHeight;
645 }
646}
647Platform.decorators = [
648 { type: Injectable, args: [{
649 providedIn: 'root',
650 },] },
651];
652/** @nocollapse */
653Platform.ctorParameters = () => [
654 { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
655 { type: NgZone }
656];
657/** @nocollapse */ Platform.ngInjectableDef = defineInjectable({ factory: function Platform_Factory() { return new Platform(inject(DOCUMENT), inject(NgZone)); }, token: Platform, providedIn: "root" });
658/** @type {?} */
659const readQueryParam = (/**
660 * @param {?} url
661 * @param {?} key
662 * @return {?}
663 */
664(url, key) => {
665 key = key.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
666 /** @type {?} */
667 const regex = new RegExp('[\\?&]' + key + '=([^&#]*)');
668 /** @type {?} */
669 const results = regex.exec(url);
670 return results ? decodeURIComponent(results[1].replace(/\+/g, ' ')) : null;
671});
672/** @type {?} */
673const proxyEvent = (/**
674 * @template T
675 * @param {?} emitter
676 * @param {?} el
677 * @param {?} eventName
678 * @return {?}
679 */
680(emitter, el, eventName) => {
681 if (((/** @type {?} */ (el)))) {
682 el.addEventListener(eventName, (/**
683 * @param {?} ev
684 * @return {?}
685 */
686 (ev) => {
687 // ?? cordova might emit "null" events
688 emitter.next(ev != null ? (/** @type {?} */ (((/** @type {?} */ (ev))).detail)) : undefined);
689 }));
690 }
691});
692
693/**
694 * @fileoverview added by tsickle
695 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
696 */
697class NavController {
698 /**
699 * @param {?} platform
700 * @param {?} location
701 * @param {?} serializer
702 * @param {?=} router
703 */
704 constructor(platform, location, serializer, router) {
705 this.location = location;
706 this.serializer = serializer;
707 this.router = router;
708 this.direction = DEFAULT_DIRECTION;
709 this.animated = DEFAULT_ANIMATED;
710 this.guessDirection = 'forward';
711 this.lastNavId = -1;
712 // Subscribe to router events to detect direction
713 if (router) {
714 router.events.subscribe((/**
715 * @param {?} ev
716 * @return {?}
717 */
718 ev => {
719 if (ev instanceof NavigationStart) {
720 /** @type {?} */
721 const id = (ev.restoredState) ? ev.restoredState.navigationId : ev.id;
722 this.guessDirection = id < this.lastNavId ? 'back' : 'forward';
723 this.guessAnimation = !ev.restoredState ? this.guessDirection : undefined;
724 this.lastNavId = this.guessDirection === 'forward' ? ev.id : id;
725 }
726 }));
727 }
728 // Subscribe to backButton events
729 platform.backButton.subscribeWithPriority(0, (/**
730 * @return {?}
731 */
732 () => this.pop()));
733 }
734 /**
735 * This method uses Angular's [Router](https://angular.io/api/router/Router) under the hood,
736 * it's equivalent to calling `this.router.navigateByUrl()`, but it's explicit about the **direction** of the transition.
737 *
738 * Going **forward** means that a new page is going to be pushed to the stack of the outlet (ion-router-outlet),
739 * and that it will show a "forward" animation by default.
740 *
741 * Navigating forward can also be triggered in a declarative manner by using the `[routerDirection]` directive:
742 *
743 * ```html
744 * <a routerLink="/path/to/page" routerDirection="forward">Link</a>
745 * ```
746 * @param {?} url
747 * @param {?=} options
748 * @return {?}
749 */
750 navigateForward(url, options = {}) {
751 this.setDirection('forward', options.animated, options.animationDirection);
752 return this.navigate(url, options);
753 }
754 /**
755 * This method uses Angular's [Router](https://angular.io/api/router/Router) under the hood,
756 * it's equivalent to calling:
757 *
758 * ```ts
759 * this.navController.setDirection('back');
760 * this.router.navigateByUrl(path);
761 * ```
762 *
763 * Going **back** means that all the pages in the stack until the navigated page is found will be popped,
764 * and that it will show a "back" animation by default.
765 *
766 * Navigating back can also be triggered in a declarative manner by using the `[routerDirection]` directive:
767 *
768 * ```html
769 * <a routerLink="/path/to/page" routerDirection="back">Link</a>
770 * ```
771 * @param {?} url
772 * @param {?=} options
773 * @return {?}
774 */
775 navigateBack(url, options = {}) {
776 this.setDirection('back', options.animated, options.animationDirection);
777 return this.navigate(url, options);
778 }
779 /**
780 * This method uses Angular's [Router](https://angular.io/api/router/Router) under the hood,
781 * it's equivalent to calling:
782 *
783 * ```ts
784 * this.navController.setDirection('root');
785 * this.router.navigateByUrl(path);
786 * ```
787 *
788 * Going **root** means that all existing pages in the stack will be removed,
789 * and the navigated page will become the single page in the stack.
790 *
791 * Navigating root can also be triggered in a declarative manner by using the `[routerDirection]` directive:
792 *
793 * ```html
794 * <a routerLink="/path/to/page" routerDirection="root">Link</a>
795 * ```
796 * @param {?} url
797 * @param {?=} options
798 * @return {?}
799 */
800 navigateRoot(url, options = {}) {
801 this.setDirection('root', options.animated, options.animationDirection);
802 return this.navigate(url, options);
803 }
804 /**
805 * Same as [Location](https://angular.io/api/common/Location)'s back() method.
806 * It will use the standard `window.history.back()` under the hood, but featuring a `back` animation
807 * by default.
808 * @param {?=} options
809 * @return {?}
810 */
811 back(options = { animated: true, animationDirection: 'back' }) {
812 this.setDirection('back', options.animated, options.animationDirection);
813 return this.location.back();
814 }
815 /**
816 * This methods goes back in the context of Ionic's stack navigation.
817 *
818 * It recursively finds the top active `ion-router-outlet` and calls `pop()`.
819 * This is the recommended way to go back when you are using `ion-router-outlet`.
820 * @return {?}
821 */
822 pop() {
823 return __awaiter(this, void 0, void 0, function* () {
824 /** @type {?} */
825 let outlet = this.topOutlet;
826 while (outlet) {
827 if (yield outlet.pop()) {
828 break;
829 }
830 else {
831 outlet = outlet.parentOutlet;
832 }
833 }
834 });
835 }
836 /**
837 * This methods specifies the direction of the next navigation performed by the Angular router.
838 *
839 * `setDirection()` does not trigger any transition, it just sets some flags to be consumed by `ion-router-outlet`.
840 *
841 * It's recommended to use `navigateForward()`, `navigateBack()` and `navigateRoot()` instead of `setDirection()`.
842 * @param {?} direction
843 * @param {?=} animated
844 * @param {?=} animationDirection
845 * @return {?}
846 */
847 setDirection(direction, animated, animationDirection) {
848 this.direction = direction;
849 this.animated = getAnimation(direction, animated, animationDirection);
850 }
851 /**
852 * \@internal
853 * @param {?} outlet
854 * @return {?}
855 */
856 setTopOutlet(outlet) {
857 this.topOutlet = outlet;
858 }
859 /**
860 * \@internal
861 * @return {?}
862 */
863 consumeTransition() {
864 /** @type {?} */
865 let direction = 'root';
866 /** @type {?} */
867 let animation;
868 if (this.direction === 'auto') {
869 direction = this.guessDirection;
870 animation = this.guessAnimation;
871 }
872 else {
873 animation = this.animated;
874 direction = this.direction;
875 }
876 this.direction = DEFAULT_DIRECTION;
877 this.animated = DEFAULT_ANIMATED;
878 return {
879 direction,
880 animation
881 };
882 }
883 /**
884 * @private
885 * @param {?} url
886 * @param {?} options
887 * @return {?}
888 */
889 navigate(url, options) {
890 if (Array.isArray(url)) {
891 return (/** @type {?} */ (this.router)).navigate(url, options);
892 }
893 else {
894 /**
895 * navigateByUrl ignores any properties that
896 * would change the url, so things like queryParams
897 * would be ignored unless we create a url tree
898 * More Info: https://github.com/angular/angular/issues/18798
899 * @type {?}
900 */
901 const urlTree = this.serializer.parse(url.toString());
902 if (options.queryParams !== undefined) {
903 urlTree.queryParams = Object.assign({}, options.queryParams);
904 }
905 if (options.fragment !== undefined) {
906 urlTree.fragment = options.fragment;
907 }
908 /**
909 * `navigateByUrl` will still apply `NavigationExtras` properties
910 * that do not modify the url, such as `replaceUrl` which is why
911 * `options` is passed in here.
912 */
913 return (/** @type {?} */ (this.router)).navigateByUrl(urlTree, options);
914 }
915 }
916}
917NavController.decorators = [
918 { type: Injectable, args: [{
919 providedIn: 'root',
920 },] },
921];
922/** @nocollapse */
923NavController.ctorParameters = () => [
924 { type: Platform },
925 { type: Location },
926 { type: UrlSerializer },
927 { type: Router, decorators: [{ type: Optional }] }
928];
929/** @nocollapse */ NavController.ngInjectableDef = defineInjectable({ factory: function NavController_Factory() { return new NavController(inject(Platform), inject(Location), inject(UrlSerializer), inject(Router, 8)); }, token: NavController, providedIn: "root" });
930/** @type {?} */
931const getAnimation = (/**
932 * @param {?} direction
933 * @param {?} animated
934 * @param {?} animationDirection
935 * @return {?}
936 */
937(direction, animated, animationDirection) => {
938 if (animated === false) {
939 return undefined;
940 }
941 if (animationDirection !== undefined) {
942 return animationDirection;
943 }
944 if (direction === 'forward' || direction === 'back') {
945 return direction;
946 }
947 else if (direction === 'root' && animated === true) {
948 return 'forward';
949 }
950 return undefined;
951});
952/** @type {?} */
953const DEFAULT_DIRECTION = 'auto';
954/** @type {?} */
955const DEFAULT_ANIMATED = undefined;
956
957/**
958 * @fileoverview added by tsickle
959 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
960 */
961/** @type {?} */
962const proxyInputs = (/**
963 * @param {?} Cmp
964 * @param {?} inputs
965 * @return {?}
966 */
967(Cmp, inputs) => {
968 /** @type {?} */
969 const Prototype = Cmp.prototype;
970 inputs.forEach((/**
971 * @param {?} item
972 * @return {?}
973 */
974 item => {
975 Object.defineProperty(Prototype, item, {
976 /**
977 * @return {?}
978 */
979 get() { return this.el[item]; },
980 /**
981 * @param {?} val
982 * @return {?}
983 */
984 set(val) {
985 this.z.runOutsideAngular((/**
986 * @return {?}
987 */
988 () => this.el[item] = val));
989 },
990 });
991 }));
992});
993/** @type {?} */
994const proxyMethods = (/**
995 * @param {?} Cmp
996 * @param {?} methods
997 * @return {?}
998 */
999(Cmp, methods) => {
1000 /** @type {?} */
1001 const Prototype = Cmp.prototype;
1002 methods.forEach((/**
1003 * @param {?} methodName
1004 * @return {?}
1005 */
1006 methodName => {
1007 Prototype[methodName] = (/**
1008 * @return {?}
1009 */
1010 function () {
1011 /** @type {?} */
1012 const args = arguments;
1013 return this.z.runOutsideAngular((/**
1014 * @return {?}
1015 */
1016 () => this.el[methodName].apply(this.el, args)));
1017 });
1018 }));
1019});
1020/** @type {?} */
1021const proxyOutputs = (/**
1022 * @param {?} instance
1023 * @param {?} el
1024 * @param {?} events
1025 * @return {?}
1026 */
1027(instance, el, events) => {
1028 events.forEach((/**
1029 * @param {?} eventName
1030 * @return {?}
1031 */
1032 eventName => instance[eventName] = fromEvent(el, eventName)));
1033});
1034
1035/**
1036 * @fileoverview added by tsickle
1037 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1038 */
1039class IonApp {
1040 /**
1041 * @param {?} c
1042 * @param {?} r
1043 * @param {?} z
1044 */
1045 constructor(c, r, z) {
1046 this.z = z;
1047 c.detach();
1048 this.el = r.nativeElement;
1049 }
1050}
1051IonApp.decorators = [
1052 { type: Component, args: [{ selector: 'ion-app', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
1053];
1054/** @nocollapse */
1055IonApp.ctorParameters = () => [
1056 { type: ChangeDetectorRef },
1057 { type: ElementRef },
1058 { type: NgZone }
1059];
1060class IonAvatar {
1061 /**
1062 * @param {?} c
1063 * @param {?} r
1064 * @param {?} z
1065 */
1066 constructor(c, r, z) {
1067 this.z = z;
1068 c.detach();
1069 this.el = r.nativeElement;
1070 }
1071}
1072IonAvatar.decorators = [
1073 { type: Component, args: [{ selector: 'ion-avatar', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
1074];
1075/** @nocollapse */
1076IonAvatar.ctorParameters = () => [
1077 { type: ChangeDetectorRef },
1078 { type: ElementRef },
1079 { type: NgZone }
1080];
1081class IonBackButton {
1082 /**
1083 * @param {?} c
1084 * @param {?} r
1085 * @param {?} z
1086 */
1087 constructor(c, r, z) {
1088 this.z = z;
1089 c.detach();
1090 this.el = r.nativeElement;
1091 }
1092}
1093IonBackButton.decorators = [
1094 { type: Component, args: [{ selector: 'ion-back-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'defaultHref', 'disabled', 'icon', 'mode', 'text', 'type'] },] },
1095];
1096/** @nocollapse */
1097IonBackButton.ctorParameters = () => [
1098 { type: ChangeDetectorRef },
1099 { type: ElementRef },
1100 { type: NgZone }
1101];
1102proxyInputs(IonBackButton, ['color', 'defaultHref', 'disabled', 'icon', 'mode', 'text', 'type']);
1103class IonBackdrop {
1104 /**
1105 * @param {?} c
1106 * @param {?} r
1107 * @param {?} z
1108 */
1109 constructor(c, r, z) {
1110 this.z = z;
1111 c.detach();
1112 this.el = r.nativeElement;
1113 proxyOutputs(this, this.el, ['ionBackdropTap']);
1114 }
1115}
1116IonBackdrop.decorators = [
1117 { type: Component, args: [{ selector: 'ion-backdrop', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['stopPropagation', 'tappable', 'visible'] },] },
1118];
1119/** @nocollapse */
1120IonBackdrop.ctorParameters = () => [
1121 { type: ChangeDetectorRef },
1122 { type: ElementRef },
1123 { type: NgZone }
1124];
1125proxyInputs(IonBackdrop, ['stopPropagation', 'tappable', 'visible']);
1126class IonBadge {
1127 /**
1128 * @param {?} c
1129 * @param {?} r
1130 * @param {?} z
1131 */
1132 constructor(c, r, z) {
1133 this.z = z;
1134 c.detach();
1135 this.el = r.nativeElement;
1136 }
1137}
1138IonBadge.decorators = [
1139 { type: Component, args: [{ selector: 'ion-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
1140];
1141/** @nocollapse */
1142IonBadge.ctorParameters = () => [
1143 { type: ChangeDetectorRef },
1144 { type: ElementRef },
1145 { type: NgZone }
1146];
1147proxyInputs(IonBadge, ['color', 'mode']);
1148class IonButton {
1149 /**
1150 * @param {?} c
1151 * @param {?} r
1152 * @param {?} z
1153 */
1154 constructor(c, r, z) {
1155 this.z = z;
1156 c.detach();
1157 this.el = r.nativeElement;
1158 proxyOutputs(this, this.el, ['ionFocus', 'ionBlur']);
1159 }
1160}
1161IonButton.decorators = [
1162 { type: Component, args: [{ selector: 'ion-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['buttonType', 'color', 'disabled', 'download', 'expand', 'fill', 'href', 'mode', 'rel', 'routerDirection', 'shape', 'size', 'strong', 'target', 'type'] },] },
1163];
1164/** @nocollapse */
1165IonButton.ctorParameters = () => [
1166 { type: ChangeDetectorRef },
1167 { type: ElementRef },
1168 { type: NgZone }
1169];
1170proxyInputs(IonButton, ['buttonType', 'color', 'disabled', 'download', 'expand', 'fill', 'href', 'mode', 'rel', 'routerDirection', 'shape', 'size', 'strong', 'target', 'type']);
1171class IonButtons {
1172 /**
1173 * @param {?} c
1174 * @param {?} r
1175 * @param {?} z
1176 */
1177 constructor(c, r, z) {
1178 this.z = z;
1179 c.detach();
1180 this.el = r.nativeElement;
1181 }
1182}
1183IonButtons.decorators = [
1184 { type: Component, args: [{ selector: 'ion-buttons', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['collapse'] },] },
1185];
1186/** @nocollapse */
1187IonButtons.ctorParameters = () => [
1188 { type: ChangeDetectorRef },
1189 { type: ElementRef },
1190 { type: NgZone }
1191];
1192proxyInputs(IonButtons, ['collapse']);
1193class IonCard {
1194 /**
1195 * @param {?} c
1196 * @param {?} r
1197 * @param {?} z
1198 */
1199 constructor(c, r, z) {
1200 this.z = z;
1201 c.detach();
1202 this.el = r.nativeElement;
1203 }
1204}
1205IonCard.decorators = [
1206 { type: Component, args: [{ selector: 'ion-card', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['button', 'color', 'disabled', 'download', 'href', 'mode', 'rel', 'routerDirection', 'target', 'type'] },] },
1207];
1208/** @nocollapse */
1209IonCard.ctorParameters = () => [
1210 { type: ChangeDetectorRef },
1211 { type: ElementRef },
1212 { type: NgZone }
1213];
1214proxyInputs(IonCard, ['button', 'color', 'disabled', 'download', 'href', 'mode', 'rel', 'routerDirection', 'target', 'type']);
1215class IonCardContent {
1216 /**
1217 * @param {?} c
1218 * @param {?} r
1219 * @param {?} z
1220 */
1221 constructor(c, r, z) {
1222 this.z = z;
1223 c.detach();
1224 this.el = r.nativeElement;
1225 }
1226}
1227IonCardContent.decorators = [
1228 { type: Component, args: [{ selector: 'ion-card-content', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['mode'] },] },
1229];
1230/** @nocollapse */
1231IonCardContent.ctorParameters = () => [
1232 { type: ChangeDetectorRef },
1233 { type: ElementRef },
1234 { type: NgZone }
1235];
1236proxyInputs(IonCardContent, ['mode']);
1237class IonCardHeader {
1238 /**
1239 * @param {?} c
1240 * @param {?} r
1241 * @param {?} z
1242 */
1243 constructor(c, r, z) {
1244 this.z = z;
1245 c.detach();
1246 this.el = r.nativeElement;
1247 }
1248}
1249IonCardHeader.decorators = [
1250 { type: Component, args: [{ selector: 'ion-card-header', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode', 'translucent'] },] },
1251];
1252/** @nocollapse */
1253IonCardHeader.ctorParameters = () => [
1254 { type: ChangeDetectorRef },
1255 { type: ElementRef },
1256 { type: NgZone }
1257];
1258proxyInputs(IonCardHeader, ['color', 'mode', 'translucent']);
1259class IonCardSubtitle {
1260 /**
1261 * @param {?} c
1262 * @param {?} r
1263 * @param {?} z
1264 */
1265 constructor(c, r, z) {
1266 this.z = z;
1267 c.detach();
1268 this.el = r.nativeElement;
1269 }
1270}
1271IonCardSubtitle.decorators = [
1272 { type: Component, args: [{ selector: 'ion-card-subtitle', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
1273];
1274/** @nocollapse */
1275IonCardSubtitle.ctorParameters = () => [
1276 { type: ChangeDetectorRef },
1277 { type: ElementRef },
1278 { type: NgZone }
1279];
1280proxyInputs(IonCardSubtitle, ['color', 'mode']);
1281class IonCardTitle {
1282 /**
1283 * @param {?} c
1284 * @param {?} r
1285 * @param {?} z
1286 */
1287 constructor(c, r, z) {
1288 this.z = z;
1289 c.detach();
1290 this.el = r.nativeElement;
1291 }
1292}
1293IonCardTitle.decorators = [
1294 { type: Component, args: [{ selector: 'ion-card-title', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
1295];
1296/** @nocollapse */
1297IonCardTitle.ctorParameters = () => [
1298 { type: ChangeDetectorRef },
1299 { type: ElementRef },
1300 { type: NgZone }
1301];
1302proxyInputs(IonCardTitle, ['color', 'mode']);
1303class IonCheckbox {
1304 /**
1305 * @param {?} c
1306 * @param {?} r
1307 * @param {?} z
1308 */
1309 constructor(c, r, z) {
1310 this.z = z;
1311 c.detach();
1312 this.el = r.nativeElement;
1313 proxyOutputs(this, this.el, ['ionChange', 'ionFocus', 'ionBlur']);
1314 }
1315}
1316IonCheckbox.decorators = [
1317 { type: Component, args: [{ selector: 'ion-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['checked', 'color', 'disabled', 'indeterminate', 'mode', 'name', 'value'] },] },
1318];
1319/** @nocollapse */
1320IonCheckbox.ctorParameters = () => [
1321 { type: ChangeDetectorRef },
1322 { type: ElementRef },
1323 { type: NgZone }
1324];
1325proxyInputs(IonCheckbox, ['checked', 'color', 'disabled', 'indeterminate', 'mode', 'name', 'value']);
1326class IonChip {
1327 /**
1328 * @param {?} c
1329 * @param {?} r
1330 * @param {?} z
1331 */
1332 constructor(c, r, z) {
1333 this.z = z;
1334 c.detach();
1335 this.el = r.nativeElement;
1336 }
1337}
1338IonChip.decorators = [
1339 { type: Component, args: [{ selector: 'ion-chip', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode', 'outline'] },] },
1340];
1341/** @nocollapse */
1342IonChip.ctorParameters = () => [
1343 { type: ChangeDetectorRef },
1344 { type: ElementRef },
1345 { type: NgZone }
1346];
1347proxyInputs(IonChip, ['color', 'mode', 'outline']);
1348class IonCol {
1349 /**
1350 * @param {?} c
1351 * @param {?} r
1352 * @param {?} z
1353 */
1354 constructor(c, r, z) {
1355 this.z = z;
1356 c.detach();
1357 this.el = r.nativeElement;
1358 }
1359}
1360IonCol.decorators = [
1361 { type: Component, args: [{ selector: 'ion-col', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['offset', 'offsetLg', 'offsetMd', 'offsetSm', 'offsetXl', 'offsetXs', 'pull', 'pullLg', 'pullMd', 'pullSm', 'pullXl', 'pullXs', 'push', 'pushLg', 'pushMd', 'pushSm', 'pushXl', 'pushXs', 'size', 'sizeLg', 'sizeMd', 'sizeSm', 'sizeXl', 'sizeXs'] },] },
1362];
1363/** @nocollapse */
1364IonCol.ctorParameters = () => [
1365 { type: ChangeDetectorRef },
1366 { type: ElementRef },
1367 { type: NgZone }
1368];
1369proxyInputs(IonCol, ['offset', 'offsetLg', 'offsetMd', 'offsetSm', 'offsetXl', 'offsetXs', 'pull', 'pullLg', 'pullMd', 'pullSm', 'pullXl', 'pullXs', 'push', 'pushLg', 'pushMd', 'pushSm', 'pushXl', 'pushXs', 'size', 'sizeLg', 'sizeMd', 'sizeSm', 'sizeXl', 'sizeXs']);
1370class IonContent {
1371 /**
1372 * @param {?} c
1373 * @param {?} r
1374 * @param {?} z
1375 */
1376 constructor(c, r, z) {
1377 this.z = z;
1378 c.detach();
1379 this.el = r.nativeElement;
1380 proxyOutputs(this, this.el, ['ionScrollStart', 'ionScroll', 'ionScrollEnd']);
1381 }
1382}
1383IonContent.decorators = [
1384 { type: Component, args: [{ selector: 'ion-content', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'forceOverscroll', 'fullscreen', 'scrollEvents', 'scrollX', 'scrollY'] },] },
1385];
1386/** @nocollapse */
1387IonContent.ctorParameters = () => [
1388 { type: ChangeDetectorRef },
1389 { type: ElementRef },
1390 { type: NgZone }
1391];
1392proxyMethods(IonContent, ['getScrollElement', 'scrollToTop', 'scrollToBottom', 'scrollByPoint', 'scrollToPoint']);
1393proxyInputs(IonContent, ['color', 'forceOverscroll', 'fullscreen', 'scrollEvents', 'scrollX', 'scrollY']);
1394class IonDatetime {
1395 /**
1396 * @param {?} c
1397 * @param {?} r
1398 * @param {?} z
1399 */
1400 constructor(c, r, z) {
1401 this.z = z;
1402 c.detach();
1403 this.el = r.nativeElement;
1404 proxyOutputs(this, this.el, ['ionCancel', 'ionChange', 'ionFocus', 'ionBlur']);
1405 }
1406}
1407IonDatetime.decorators = [
1408 { type: Component, args: [{ selector: 'ion-datetime', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['cancelText', 'dayNames', 'dayShortNames', 'dayValues', 'disabled', 'displayFormat', 'doneText', 'hourValues', 'max', 'min', 'minuteValues', 'mode', 'monthNames', 'monthShortNames', 'monthValues', 'name', 'pickerFormat', 'pickerOptions', 'placeholder', 'readonly', 'value', 'yearValues'] },] },
1409];
1410/** @nocollapse */
1411IonDatetime.ctorParameters = () => [
1412 { type: ChangeDetectorRef },
1413 { type: ElementRef },
1414 { type: NgZone }
1415];
1416proxyMethods(IonDatetime, ['open']);
1417proxyInputs(IonDatetime, ['cancelText', 'dayNames', 'dayShortNames', 'dayValues', 'disabled', 'displayFormat', 'doneText', 'hourValues', 'max', 'min', 'minuteValues', 'mode', 'monthNames', 'monthShortNames', 'monthValues', 'name', 'pickerFormat', 'pickerOptions', 'placeholder', 'readonly', 'value', 'yearValues']);
1418class IonFab {
1419 /**
1420 * @param {?} c
1421 * @param {?} r
1422 * @param {?} z
1423 */
1424 constructor(c, r, z) {
1425 this.z = z;
1426 c.detach();
1427 this.el = r.nativeElement;
1428 }
1429}
1430IonFab.decorators = [
1431 { type: Component, args: [{ selector: 'ion-fab', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['activated', 'edge', 'horizontal', 'vertical'] },] },
1432];
1433/** @nocollapse */
1434IonFab.ctorParameters = () => [
1435 { type: ChangeDetectorRef },
1436 { type: ElementRef },
1437 { type: NgZone }
1438];
1439proxyMethods(IonFab, ['close']);
1440proxyInputs(IonFab, ['activated', 'edge', 'horizontal', 'vertical']);
1441class IonFabButton {
1442 /**
1443 * @param {?} c
1444 * @param {?} r
1445 * @param {?} z
1446 */
1447 constructor(c, r, z) {
1448 this.z = z;
1449 c.detach();
1450 this.el = r.nativeElement;
1451 proxyOutputs(this, this.el, ['ionFocus', 'ionBlur']);
1452 }
1453}
1454IonFabButton.decorators = [
1455 { type: Component, args: [{ selector: 'ion-fab-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['activated', 'color', 'disabled', 'download', 'href', 'mode', 'rel', 'routerDirection', 'show', 'size', 'target', 'translucent', 'type'] },] },
1456];
1457/** @nocollapse */
1458IonFabButton.ctorParameters = () => [
1459 { type: ChangeDetectorRef },
1460 { type: ElementRef },
1461 { type: NgZone }
1462];
1463proxyInputs(IonFabButton, ['activated', 'color', 'disabled', 'download', 'href', 'mode', 'rel', 'routerDirection', 'show', 'size', 'target', 'translucent', 'type']);
1464class IonFabList {
1465 /**
1466 * @param {?} c
1467 * @param {?} r
1468 * @param {?} z
1469 */
1470 constructor(c, r, z) {
1471 this.z = z;
1472 c.detach();
1473 this.el = r.nativeElement;
1474 }
1475}
1476IonFabList.decorators = [
1477 { type: Component, args: [{ selector: 'ion-fab-list', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['activated', 'side'] },] },
1478];
1479/** @nocollapse */
1480IonFabList.ctorParameters = () => [
1481 { type: ChangeDetectorRef },
1482 { type: ElementRef },
1483 { type: NgZone }
1484];
1485proxyInputs(IonFabList, ['activated', 'side']);
1486class IonFooter {
1487 /**
1488 * @param {?} c
1489 * @param {?} r
1490 * @param {?} z
1491 */
1492 constructor(c, r, z) {
1493 this.z = z;
1494 c.detach();
1495 this.el = r.nativeElement;
1496 }
1497}
1498IonFooter.decorators = [
1499 { type: Component, args: [{ selector: 'ion-footer', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['mode', 'translucent'] },] },
1500];
1501/** @nocollapse */
1502IonFooter.ctorParameters = () => [
1503 { type: ChangeDetectorRef },
1504 { type: ElementRef },
1505 { type: NgZone }
1506];
1507proxyInputs(IonFooter, ['mode', 'translucent']);
1508class IonGrid {
1509 /**
1510 * @param {?} c
1511 * @param {?} r
1512 * @param {?} z
1513 */
1514 constructor(c, r, z) {
1515 this.z = z;
1516 c.detach();
1517 this.el = r.nativeElement;
1518 }
1519}
1520IonGrid.decorators = [
1521 { type: Component, args: [{ selector: 'ion-grid', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['fixed'] },] },
1522];
1523/** @nocollapse */
1524IonGrid.ctorParameters = () => [
1525 { type: ChangeDetectorRef },
1526 { type: ElementRef },
1527 { type: NgZone }
1528];
1529proxyInputs(IonGrid, ['fixed']);
1530class IonHeader {
1531 /**
1532 * @param {?} c
1533 * @param {?} r
1534 * @param {?} z
1535 */
1536 constructor(c, r, z) {
1537 this.z = z;
1538 c.detach();
1539 this.el = r.nativeElement;
1540 }
1541}
1542IonHeader.decorators = [
1543 { type: Component, args: [{ selector: 'ion-header', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['collapse', 'mode', 'translucent'] },] },
1544];
1545/** @nocollapse */
1546IonHeader.ctorParameters = () => [
1547 { type: ChangeDetectorRef },
1548 { type: ElementRef },
1549 { type: NgZone }
1550];
1551proxyInputs(IonHeader, ['collapse', 'mode', 'translucent']);
1552class IonIcon {
1553 /**
1554 * @param {?} c
1555 * @param {?} r
1556 * @param {?} z
1557 */
1558 constructor(c, r, z) {
1559 this.z = z;
1560 c.detach();
1561 this.el = r.nativeElement;
1562 }
1563}
1564IonIcon.decorators = [
1565 { type: Component, args: [{ selector: 'ion-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src'] },] },
1566];
1567/** @nocollapse */
1568IonIcon.ctorParameters = () => [
1569 { type: ChangeDetectorRef },
1570 { type: ElementRef },
1571 { type: NgZone }
1572];
1573proxyInputs(IonIcon, ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src']);
1574class IonImg {
1575 /**
1576 * @param {?} c
1577 * @param {?} r
1578 * @param {?} z
1579 */
1580 constructor(c, r, z) {
1581 this.z = z;
1582 c.detach();
1583 this.el = r.nativeElement;
1584 proxyOutputs(this, this.el, ['ionImgWillLoad', 'ionImgDidLoad', 'ionError']);
1585 }
1586}
1587IonImg.decorators = [
1588 { type: Component, args: [{ selector: 'ion-img', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['alt', 'src'] },] },
1589];
1590/** @nocollapse */
1591IonImg.ctorParameters = () => [
1592 { type: ChangeDetectorRef },
1593 { type: ElementRef },
1594 { type: NgZone }
1595];
1596proxyInputs(IonImg, ['alt', 'src']);
1597class IonInfiniteScroll {
1598 /**
1599 * @param {?} c
1600 * @param {?} r
1601 * @param {?} z
1602 */
1603 constructor(c, r, z) {
1604 this.z = z;
1605 c.detach();
1606 this.el = r.nativeElement;
1607 proxyOutputs(this, this.el, ['ionInfinite']);
1608 }
1609}
1610IonInfiniteScroll.decorators = [
1611 { type: Component, args: [{ selector: 'ion-infinite-scroll', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['disabled', 'position', 'threshold'] },] },
1612];
1613/** @nocollapse */
1614IonInfiniteScroll.ctorParameters = () => [
1615 { type: ChangeDetectorRef },
1616 { type: ElementRef },
1617 { type: NgZone }
1618];
1619proxyMethods(IonInfiniteScroll, ['complete']);
1620proxyInputs(IonInfiniteScroll, ['disabled', 'position', 'threshold']);
1621class IonInfiniteScrollContent {
1622 /**
1623 * @param {?} c
1624 * @param {?} r
1625 * @param {?} z
1626 */
1627 constructor(c, r, z) {
1628 this.z = z;
1629 c.detach();
1630 this.el = r.nativeElement;
1631 }
1632}
1633IonInfiniteScrollContent.decorators = [
1634 { type: Component, args: [{ selector: 'ion-infinite-scroll-content', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['loadingSpinner', 'loadingText'] },] },
1635];
1636/** @nocollapse */
1637IonInfiniteScrollContent.ctorParameters = () => [
1638 { type: ChangeDetectorRef },
1639 { type: ElementRef },
1640 { type: NgZone }
1641];
1642proxyInputs(IonInfiniteScrollContent, ['loadingSpinner', 'loadingText']);
1643class IonInput {
1644 /**
1645 * @param {?} c
1646 * @param {?} r
1647 * @param {?} z
1648 */
1649 constructor(c, r, z) {
1650 this.z = z;
1651 c.detach();
1652 this.el = r.nativeElement;
1653 proxyOutputs(this, this.el, ['ionInput', 'ionChange', 'ionBlur', 'ionFocus']);
1654 }
1655}
1656IonInput.decorators = [
1657 { type: Component, args: [{ selector: 'ion-input', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['accept', 'autocapitalize', 'autocomplete', 'autocorrect', 'autofocus', 'clearInput', 'clearOnEdit', 'color', 'debounce', 'disabled', 'inputmode', 'max', 'maxlength', 'min', 'minlength', 'mode', 'multiple', 'name', 'pattern', 'placeholder', 'readonly', 'required', 'size', 'spellcheck', 'step', 'type', 'value'] },] },
1658];
1659/** @nocollapse */
1660IonInput.ctorParameters = () => [
1661 { type: ChangeDetectorRef },
1662 { type: ElementRef },
1663 { type: NgZone }
1664];
1665proxyMethods(IonInput, ['setFocus', 'getInputElement']);
1666proxyInputs(IonInput, ['accept', 'autocapitalize', 'autocomplete', 'autocorrect', 'autofocus', 'clearInput', 'clearOnEdit', 'color', 'debounce', 'disabled', 'inputmode', 'max', 'maxlength', 'min', 'minlength', 'mode', 'multiple', 'name', 'pattern', 'placeholder', 'readonly', 'required', 'size', 'spellcheck', 'step', 'type', 'value']);
1667class IonItem {
1668 /**
1669 * @param {?} c
1670 * @param {?} r
1671 * @param {?} z
1672 */
1673 constructor(c, r, z) {
1674 this.z = z;
1675 c.detach();
1676 this.el = r.nativeElement;
1677 }
1678}
1679IonItem.decorators = [
1680 { type: Component, args: [{ selector: 'ion-item', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['button', 'color', 'detail', 'detailIcon', 'disabled', 'download', 'href', 'lines', 'mode', 'rel', 'routerDirection', 'target', 'type'] },] },
1681];
1682/** @nocollapse */
1683IonItem.ctorParameters = () => [
1684 { type: ChangeDetectorRef },
1685 { type: ElementRef },
1686 { type: NgZone }
1687];
1688proxyInputs(IonItem, ['button', 'color', 'detail', 'detailIcon', 'disabled', 'download', 'href', 'lines', 'mode', 'rel', 'routerDirection', 'target', 'type']);
1689class IonItemDivider {
1690 /**
1691 * @param {?} c
1692 * @param {?} r
1693 * @param {?} z
1694 */
1695 constructor(c, r, z) {
1696 this.z = z;
1697 c.detach();
1698 this.el = r.nativeElement;
1699 }
1700}
1701IonItemDivider.decorators = [
1702 { type: Component, args: [{ selector: 'ion-item-divider', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode', 'sticky'] },] },
1703];
1704/** @nocollapse */
1705IonItemDivider.ctorParameters = () => [
1706 { type: ChangeDetectorRef },
1707 { type: ElementRef },
1708 { type: NgZone }
1709];
1710proxyInputs(IonItemDivider, ['color', 'mode', 'sticky']);
1711class IonItemGroup {
1712 /**
1713 * @param {?} c
1714 * @param {?} r
1715 * @param {?} z
1716 */
1717 constructor(c, r, z) {
1718 this.z = z;
1719 c.detach();
1720 this.el = r.nativeElement;
1721 }
1722}
1723IonItemGroup.decorators = [
1724 { type: Component, args: [{ selector: 'ion-item-group', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
1725];
1726/** @nocollapse */
1727IonItemGroup.ctorParameters = () => [
1728 { type: ChangeDetectorRef },
1729 { type: ElementRef },
1730 { type: NgZone }
1731];
1732class IonItemOption {
1733 /**
1734 * @param {?} c
1735 * @param {?} r
1736 * @param {?} z
1737 */
1738 constructor(c, r, z) {
1739 this.z = z;
1740 c.detach();
1741 this.el = r.nativeElement;
1742 }
1743}
1744IonItemOption.decorators = [
1745 { type: Component, args: [{ selector: 'ion-item-option', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'disabled', 'download', 'expandable', 'href', 'mode', 'rel', 'target', 'type'] },] },
1746];
1747/** @nocollapse */
1748IonItemOption.ctorParameters = () => [
1749 { type: ChangeDetectorRef },
1750 { type: ElementRef },
1751 { type: NgZone }
1752];
1753proxyInputs(IonItemOption, ['color', 'disabled', 'download', 'expandable', 'href', 'mode', 'rel', 'target', 'type']);
1754class IonItemOptions {
1755 /**
1756 * @param {?} c
1757 * @param {?} r
1758 * @param {?} z
1759 */
1760 constructor(c, r, z) {
1761 this.z = z;
1762 c.detach();
1763 this.el = r.nativeElement;
1764 proxyOutputs(this, this.el, ['ionSwipe']);
1765 }
1766}
1767IonItemOptions.decorators = [
1768 { type: Component, args: [{ selector: 'ion-item-options', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['side'] },] },
1769];
1770/** @nocollapse */
1771IonItemOptions.ctorParameters = () => [
1772 { type: ChangeDetectorRef },
1773 { type: ElementRef },
1774 { type: NgZone }
1775];
1776proxyInputs(IonItemOptions, ['side']);
1777class IonItemSliding {
1778 /**
1779 * @param {?} c
1780 * @param {?} r
1781 * @param {?} z
1782 */
1783 constructor(c, r, z) {
1784 this.z = z;
1785 c.detach();
1786 this.el = r.nativeElement;
1787 proxyOutputs(this, this.el, ['ionDrag']);
1788 }
1789}
1790IonItemSliding.decorators = [
1791 { type: Component, args: [{ selector: 'ion-item-sliding', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['disabled'] },] },
1792];
1793/** @nocollapse */
1794IonItemSliding.ctorParameters = () => [
1795 { type: ChangeDetectorRef },
1796 { type: ElementRef },
1797 { type: NgZone }
1798];
1799proxyMethods(IonItemSliding, ['getOpenAmount', 'getSlidingRatio', 'open', 'close', 'closeOpened']);
1800proxyInputs(IonItemSliding, ['disabled']);
1801class IonLabel {
1802 /**
1803 * @param {?} c
1804 * @param {?} r
1805 * @param {?} z
1806 */
1807 constructor(c, r, z) {
1808 this.z = z;
1809 c.detach();
1810 this.el = r.nativeElement;
1811 }
1812}
1813IonLabel.decorators = [
1814 { type: Component, args: [{ selector: 'ion-label', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode', 'position'] },] },
1815];
1816/** @nocollapse */
1817IonLabel.ctorParameters = () => [
1818 { type: ChangeDetectorRef },
1819 { type: ElementRef },
1820 { type: NgZone }
1821];
1822proxyInputs(IonLabel, ['color', 'mode', 'position']);
1823class IonList {
1824 /**
1825 * @param {?} c
1826 * @param {?} r
1827 * @param {?} z
1828 */
1829 constructor(c, r, z) {
1830 this.z = z;
1831 c.detach();
1832 this.el = r.nativeElement;
1833 }
1834}
1835IonList.decorators = [
1836 { type: Component, args: [{ selector: 'ion-list', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['inset', 'lines', 'mode'] },] },
1837];
1838/** @nocollapse */
1839IonList.ctorParameters = () => [
1840 { type: ChangeDetectorRef },
1841 { type: ElementRef },
1842 { type: NgZone }
1843];
1844proxyMethods(IonList, ['closeSlidingItems']);
1845proxyInputs(IonList, ['inset', 'lines', 'mode']);
1846class IonListHeader {
1847 /**
1848 * @param {?} c
1849 * @param {?} r
1850 * @param {?} z
1851 */
1852 constructor(c, r, z) {
1853 this.z = z;
1854 c.detach();
1855 this.el = r.nativeElement;
1856 }
1857}
1858IonListHeader.decorators = [
1859 { type: Component, args: [{ selector: 'ion-list-header', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
1860];
1861/** @nocollapse */
1862IonListHeader.ctorParameters = () => [
1863 { type: ChangeDetectorRef },
1864 { type: ElementRef },
1865 { type: NgZone }
1866];
1867proxyInputs(IonListHeader, ['color', 'mode']);
1868class IonMenu {
1869 /**
1870 * @param {?} c
1871 * @param {?} r
1872 * @param {?} z
1873 */
1874 constructor(c, r, z) {
1875 this.z = z;
1876 c.detach();
1877 this.el = r.nativeElement;
1878 proxyOutputs(this, this.el, ['ionWillOpen', 'ionWillClose', 'ionDidOpen', 'ionDidClose']);
1879 }
1880}
1881IonMenu.decorators = [
1882 { type: Component, args: [{ selector: 'ion-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['contentId', 'disabled', 'maxEdgeStart', 'menuId', 'side', 'swipeGesture', 'type'] },] },
1883];
1884/** @nocollapse */
1885IonMenu.ctorParameters = () => [
1886 { type: ChangeDetectorRef },
1887 { type: ElementRef },
1888 { type: NgZone }
1889];
1890proxyMethods(IonMenu, ['isOpen', 'isActive', 'open', 'close', 'toggle', 'setOpen']);
1891proxyInputs(IonMenu, ['contentId', 'disabled', 'maxEdgeStart', 'menuId', 'side', 'swipeGesture', 'type']);
1892class IonMenuButton {
1893 /**
1894 * @param {?} c
1895 * @param {?} r
1896 * @param {?} z
1897 */
1898 constructor(c, r, z) {
1899 this.z = z;
1900 c.detach();
1901 this.el = r.nativeElement;
1902 }
1903}
1904IonMenuButton.decorators = [
1905 { type: Component, args: [{ selector: 'ion-menu-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['autoHide', 'color', 'disabled', 'menu', 'type'] },] },
1906];
1907/** @nocollapse */
1908IonMenuButton.ctorParameters = () => [
1909 { type: ChangeDetectorRef },
1910 { type: ElementRef },
1911 { type: NgZone }
1912];
1913proxyInputs(IonMenuButton, ['autoHide', 'color', 'disabled', 'menu', 'type']);
1914class IonMenuToggle {
1915 /**
1916 * @param {?} c
1917 * @param {?} r
1918 * @param {?} z
1919 */
1920 constructor(c, r, z) {
1921 this.z = z;
1922 c.detach();
1923 this.el = r.nativeElement;
1924 }
1925}
1926IonMenuToggle.decorators = [
1927 { type: Component, args: [{ selector: 'ion-menu-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['autoHide', 'menu'] },] },
1928];
1929/** @nocollapse */
1930IonMenuToggle.ctorParameters = () => [
1931 { type: ChangeDetectorRef },
1932 { type: ElementRef },
1933 { type: NgZone }
1934];
1935proxyInputs(IonMenuToggle, ['autoHide', 'menu']);
1936class IonNav {
1937 /**
1938 * @param {?} c
1939 * @param {?} r
1940 * @param {?} z
1941 */
1942 constructor(c, r, z) {
1943 this.z = z;
1944 c.detach();
1945 this.el = r.nativeElement;
1946 proxyOutputs(this, this.el, ['ionNavWillChange', 'ionNavDidChange']);
1947 }
1948}
1949IonNav.decorators = [
1950 { type: Component, args: [{ selector: 'ion-nav', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['animated', 'animation', 'root', 'rootParams', 'swipeGesture'] },] },
1951];
1952/** @nocollapse */
1953IonNav.ctorParameters = () => [
1954 { type: ChangeDetectorRef },
1955 { type: ElementRef },
1956 { type: NgZone }
1957];
1958proxyMethods(IonNav, ['push', 'insert', 'insertPages', 'pop', 'popTo', 'popToRoot', 'removeIndex', 'setRoot', 'setPages', 'getActive', 'getByIndex', 'canGoBack', 'getPrevious']);
1959proxyInputs(IonNav, ['animated', 'animation', 'root', 'rootParams', 'swipeGesture']);
1960class IonNavLink {
1961 /**
1962 * @param {?} c
1963 * @param {?} r
1964 * @param {?} z
1965 */
1966 constructor(c, r, z) {
1967 this.z = z;
1968 c.detach();
1969 this.el = r.nativeElement;
1970 }
1971}
1972IonNavLink.decorators = [
1973 { type: Component, args: [{ selector: 'ion-nav-link', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['component', 'componentProps', 'routerDirection'] },] },
1974];
1975/** @nocollapse */
1976IonNavLink.ctorParameters = () => [
1977 { type: ChangeDetectorRef },
1978 { type: ElementRef },
1979 { type: NgZone }
1980];
1981proxyInputs(IonNavLink, ['component', 'componentProps', 'routerDirection']);
1982class IonNavPop {
1983 /**
1984 * @param {?} c
1985 * @param {?} r
1986 * @param {?} z
1987 */
1988 constructor(c, r, z) {
1989 this.z = z;
1990 c.detach();
1991 this.el = r.nativeElement;
1992 }
1993}
1994IonNavPop.decorators = [
1995 { type: Component, args: [{ selector: 'ion-nav-pop', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
1996];
1997/** @nocollapse */
1998IonNavPop.ctorParameters = () => [
1999 { type: ChangeDetectorRef },
2000 { type: ElementRef },
2001 { type: NgZone }
2002];
2003class IonNavPush {
2004 /**
2005 * @param {?} c
2006 * @param {?} r
2007 * @param {?} z
2008 */
2009 constructor(c, r, z) {
2010 this.z = z;
2011 c.detach();
2012 this.el = r.nativeElement;
2013 }
2014}
2015IonNavPush.decorators = [
2016 { type: Component, args: [{ selector: 'ion-nav-push', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['component', 'componentProps'] },] },
2017];
2018/** @nocollapse */
2019IonNavPush.ctorParameters = () => [
2020 { type: ChangeDetectorRef },
2021 { type: ElementRef },
2022 { type: NgZone }
2023];
2024proxyInputs(IonNavPush, ['component', 'componentProps']);
2025class IonNavSetRoot {
2026 /**
2027 * @param {?} c
2028 * @param {?} r
2029 * @param {?} z
2030 */
2031 constructor(c, r, z) {
2032 this.z = z;
2033 c.detach();
2034 this.el = r.nativeElement;
2035 }
2036}
2037IonNavSetRoot.decorators = [
2038 { type: Component, args: [{ selector: 'ion-nav-set-root', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['component', 'componentProps'] },] },
2039];
2040/** @nocollapse */
2041IonNavSetRoot.ctorParameters = () => [
2042 { type: ChangeDetectorRef },
2043 { type: ElementRef },
2044 { type: NgZone }
2045];
2046proxyInputs(IonNavSetRoot, ['component', 'componentProps']);
2047class IonNote {
2048 /**
2049 * @param {?} c
2050 * @param {?} r
2051 * @param {?} z
2052 */
2053 constructor(c, r, z) {
2054 this.z = z;
2055 c.detach();
2056 this.el = r.nativeElement;
2057 }
2058}
2059IonNote.decorators = [
2060 { type: Component, args: [{ selector: 'ion-note', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
2061];
2062/** @nocollapse */
2063IonNote.ctorParameters = () => [
2064 { type: ChangeDetectorRef },
2065 { type: ElementRef },
2066 { type: NgZone }
2067];
2068proxyInputs(IonNote, ['color', 'mode']);
2069class IonProgressBar {
2070 /**
2071 * @param {?} c
2072 * @param {?} r
2073 * @param {?} z
2074 */
2075 constructor(c, r, z) {
2076 this.z = z;
2077 c.detach();
2078 this.el = r.nativeElement;
2079 }
2080}
2081IonProgressBar.decorators = [
2082 { type: Component, args: [{ selector: 'ion-progress-bar', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['buffer', 'color', 'mode', 'reversed', 'type', 'value'] },] },
2083];
2084/** @nocollapse */
2085IonProgressBar.ctorParameters = () => [
2086 { type: ChangeDetectorRef },
2087 { type: ElementRef },
2088 { type: NgZone }
2089];
2090proxyInputs(IonProgressBar, ['buffer', 'color', 'mode', 'reversed', 'type', 'value']);
2091class IonRadio {
2092 /**
2093 * @param {?} c
2094 * @param {?} r
2095 * @param {?} z
2096 */
2097 constructor(c, r, z) {
2098 this.z = z;
2099 c.detach();
2100 this.el = r.nativeElement;
2101 proxyOutputs(this, this.el, ['ionSelect', 'ionFocus', 'ionBlur']);
2102 }
2103}
2104IonRadio.decorators = [
2105 { type: Component, args: [{ selector: 'ion-radio', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['checked', 'color', 'disabled', 'mode', 'name', 'value'] },] },
2106];
2107/** @nocollapse */
2108IonRadio.ctorParameters = () => [
2109 { type: ChangeDetectorRef },
2110 { type: ElementRef },
2111 { type: NgZone }
2112];
2113proxyInputs(IonRadio, ['checked', 'color', 'disabled', 'mode', 'name', 'value']);
2114class IonRadioGroup {
2115 /**
2116 * @param {?} c
2117 * @param {?} r
2118 * @param {?} z
2119 */
2120 constructor(c, r, z) {
2121 this.z = z;
2122 c.detach();
2123 this.el = r.nativeElement;
2124 proxyOutputs(this, this.el, ['ionChange']);
2125 }
2126}
2127IonRadioGroup.decorators = [
2128 { type: Component, args: [{ selector: 'ion-radio-group', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['allowEmptySelection', 'name', 'value'] },] },
2129];
2130/** @nocollapse */
2131IonRadioGroup.ctorParameters = () => [
2132 { type: ChangeDetectorRef },
2133 { type: ElementRef },
2134 { type: NgZone }
2135];
2136proxyInputs(IonRadioGroup, ['allowEmptySelection', 'name', 'value']);
2137class IonRange {
2138 /**
2139 * @param {?} c
2140 * @param {?} r
2141 * @param {?} z
2142 */
2143 constructor(c, r, z) {
2144 this.z = z;
2145 c.detach();
2146 this.el = r.nativeElement;
2147 proxyOutputs(this, this.el, ['ionChange', 'ionFocus', 'ionBlur']);
2148 }
2149}
2150IonRange.decorators = [
2151 { type: Component, args: [{ selector: 'ion-range', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'debounce', 'disabled', 'dualKnobs', 'max', 'min', 'mode', 'name', 'pin', 'snaps', 'step', 'ticks', 'value'] },] },
2152];
2153/** @nocollapse */
2154IonRange.ctorParameters = () => [
2155 { type: ChangeDetectorRef },
2156 { type: ElementRef },
2157 { type: NgZone }
2158];
2159proxyInputs(IonRange, ['color', 'debounce', 'disabled', 'dualKnobs', 'max', 'min', 'mode', 'name', 'pin', 'snaps', 'step', 'ticks', 'value']);
2160class IonRefresher {
2161 /**
2162 * @param {?} c
2163 * @param {?} r
2164 * @param {?} z
2165 */
2166 constructor(c, r, z) {
2167 this.z = z;
2168 c.detach();
2169 this.el = r.nativeElement;
2170 proxyOutputs(this, this.el, ['ionRefresh', 'ionPull', 'ionStart']);
2171 }
2172}
2173IonRefresher.decorators = [
2174 { type: Component, args: [{ selector: 'ion-refresher', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['closeDuration', 'disabled', 'pullFactor', 'pullMax', 'pullMin', 'snapbackDuration'] },] },
2175];
2176/** @nocollapse */
2177IonRefresher.ctorParameters = () => [
2178 { type: ChangeDetectorRef },
2179 { type: ElementRef },
2180 { type: NgZone }
2181];
2182proxyMethods(IonRefresher, ['complete', 'cancel', 'getProgress']);
2183proxyInputs(IonRefresher, ['closeDuration', 'disabled', 'pullFactor', 'pullMax', 'pullMin', 'snapbackDuration']);
2184class IonRefresherContent {
2185 /**
2186 * @param {?} c
2187 * @param {?} r
2188 * @param {?} z
2189 */
2190 constructor(c, r, z) {
2191 this.z = z;
2192 c.detach();
2193 this.el = r.nativeElement;
2194 }
2195}
2196IonRefresherContent.decorators = [
2197 { type: Component, args: [{ selector: 'ion-refresher-content', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['pullingIcon', 'pullingText', 'refreshingSpinner', 'refreshingText'] },] },
2198];
2199/** @nocollapse */
2200IonRefresherContent.ctorParameters = () => [
2201 { type: ChangeDetectorRef },
2202 { type: ElementRef },
2203 { type: NgZone }
2204];
2205proxyInputs(IonRefresherContent, ['pullingIcon', 'pullingText', 'refreshingSpinner', 'refreshingText']);
2206class IonReorder {
2207 /**
2208 * @param {?} c
2209 * @param {?} r
2210 * @param {?} z
2211 */
2212 constructor(c, r, z) {
2213 this.z = z;
2214 c.detach();
2215 this.el = r.nativeElement;
2216 }
2217}
2218IonReorder.decorators = [
2219 { type: Component, args: [{ selector: 'ion-reorder', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
2220];
2221/** @nocollapse */
2222IonReorder.ctorParameters = () => [
2223 { type: ChangeDetectorRef },
2224 { type: ElementRef },
2225 { type: NgZone }
2226];
2227class IonReorderGroup {
2228 /**
2229 * @param {?} c
2230 * @param {?} r
2231 * @param {?} z
2232 */
2233 constructor(c, r, z) {
2234 this.z = z;
2235 c.detach();
2236 this.el = r.nativeElement;
2237 proxyOutputs(this, this.el, ['ionItemReorder']);
2238 }
2239}
2240IonReorderGroup.decorators = [
2241 { type: Component, args: [{ selector: 'ion-reorder-group', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['disabled'] },] },
2242];
2243/** @nocollapse */
2244IonReorderGroup.ctorParameters = () => [
2245 { type: ChangeDetectorRef },
2246 { type: ElementRef },
2247 { type: NgZone }
2248];
2249proxyMethods(IonReorderGroup, ['complete']);
2250proxyInputs(IonReorderGroup, ['disabled']);
2251class IonRippleEffect {
2252 /**
2253 * @param {?} c
2254 * @param {?} r
2255 * @param {?} z
2256 */
2257 constructor(c, r, z) {
2258 this.z = z;
2259 c.detach();
2260 this.el = r.nativeElement;
2261 }
2262}
2263IonRippleEffect.decorators = [
2264 { type: Component, args: [{ selector: 'ion-ripple-effect', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['type'] },] },
2265];
2266/** @nocollapse */
2267IonRippleEffect.ctorParameters = () => [
2268 { type: ChangeDetectorRef },
2269 { type: ElementRef },
2270 { type: NgZone }
2271];
2272proxyMethods(IonRippleEffect, ['addRipple']);
2273proxyInputs(IonRippleEffect, ['type']);
2274class IonRow {
2275 /**
2276 * @param {?} c
2277 * @param {?} r
2278 * @param {?} z
2279 */
2280 constructor(c, r, z) {
2281 this.z = z;
2282 c.detach();
2283 this.el = r.nativeElement;
2284 }
2285}
2286IonRow.decorators = [
2287 { type: Component, args: [{ selector: 'ion-row', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
2288];
2289/** @nocollapse */
2290IonRow.ctorParameters = () => [
2291 { type: ChangeDetectorRef },
2292 { type: ElementRef },
2293 { type: NgZone }
2294];
2295class IonSearchbar {
2296 /**
2297 * @param {?} c
2298 * @param {?} r
2299 * @param {?} z
2300 */
2301 constructor(c, r, z) {
2302 this.z = z;
2303 c.detach();
2304 this.el = r.nativeElement;
2305 proxyOutputs(this, this.el, ['ionInput', 'ionChange', 'ionCancel', 'ionClear', 'ionBlur', 'ionFocus']);
2306 }
2307}
2308IonSearchbar.decorators = [
2309 { type: Component, args: [{ selector: 'ion-searchbar', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['animated', 'autocomplete', 'autocorrect', 'cancelButtonIcon', 'cancelButtonText', 'clearIcon', 'color', 'debounce', 'disabled', 'inputmode', 'mode', 'placeholder', 'searchIcon', 'showCancelButton', 'spellcheck', 'type', 'value'] },] },
2310];
2311/** @nocollapse */
2312IonSearchbar.ctorParameters = () => [
2313 { type: ChangeDetectorRef },
2314 { type: ElementRef },
2315 { type: NgZone }
2316];
2317proxyMethods(IonSearchbar, ['setFocus', 'getInputElement']);
2318proxyInputs(IonSearchbar, ['animated', 'autocomplete', 'autocorrect', 'cancelButtonIcon', 'cancelButtonText', 'clearIcon', 'color', 'debounce', 'disabled', 'inputmode', 'mode', 'placeholder', 'searchIcon', 'showCancelButton', 'spellcheck', 'type', 'value']);
2319class IonSegment {
2320 /**
2321 * @param {?} c
2322 * @param {?} r
2323 * @param {?} z
2324 */
2325 constructor(c, r, z) {
2326 this.z = z;
2327 c.detach();
2328 this.el = r.nativeElement;
2329 proxyOutputs(this, this.el, ['ionChange']);
2330 }
2331}
2332IonSegment.decorators = [
2333 { type: Component, args: [{ selector: 'ion-segment', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'disabled', 'mode', 'scrollable', 'value'] },] },
2334];
2335/** @nocollapse */
2336IonSegment.ctorParameters = () => [
2337 { type: ChangeDetectorRef },
2338 { type: ElementRef },
2339 { type: NgZone }
2340];
2341proxyInputs(IonSegment, ['color', 'disabled', 'mode', 'scrollable', 'value']);
2342class IonSegmentButton {
2343 /**
2344 * @param {?} c
2345 * @param {?} r
2346 * @param {?} z
2347 */
2348 constructor(c, r, z) {
2349 this.z = z;
2350 c.detach();
2351 this.el = r.nativeElement;
2352 proxyOutputs(this, this.el, ['ionSelect']);
2353 }
2354}
2355IonSegmentButton.decorators = [
2356 { type: Component, args: [{ selector: 'ion-segment-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['checked', 'disabled', 'layout', 'mode', 'type', 'value'] },] },
2357];
2358/** @nocollapse */
2359IonSegmentButton.ctorParameters = () => [
2360 { type: ChangeDetectorRef },
2361 { type: ElementRef },
2362 { type: NgZone }
2363];
2364proxyInputs(IonSegmentButton, ['checked', 'disabled', 'layout', 'mode', 'type', 'value']);
2365class IonSelect {
2366 /**
2367 * @param {?} c
2368 * @param {?} r
2369 * @param {?} z
2370 */
2371 constructor(c, r, z) {
2372 this.z = z;
2373 c.detach();
2374 this.el = r.nativeElement;
2375 proxyOutputs(this, this.el, ['ionChange', 'ionCancel', 'ionFocus', 'ionBlur']);
2376 }
2377}
2378IonSelect.decorators = [
2379 { type: Component, args: [{ selector: 'ion-select', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['cancelText', 'compareWith', 'disabled', 'interface', 'interfaceOptions', 'mode', 'multiple', 'name', 'okText', 'placeholder', 'selectedText', 'value'] },] },
2380];
2381/** @nocollapse */
2382IonSelect.ctorParameters = () => [
2383 { type: ChangeDetectorRef },
2384 { type: ElementRef },
2385 { type: NgZone }
2386];
2387proxyMethods(IonSelect, ['open']);
2388proxyInputs(IonSelect, ['cancelText', 'compareWith', 'disabled', 'interface', 'interfaceOptions', 'mode', 'multiple', 'name', 'okText', 'placeholder', 'selectedText', 'value']);
2389class IonSelectOption {
2390 /**
2391 * @param {?} c
2392 * @param {?} r
2393 * @param {?} z
2394 */
2395 constructor(c, r, z) {
2396 this.z = z;
2397 c.detach();
2398 this.el = r.nativeElement;
2399 }
2400}
2401IonSelectOption.decorators = [
2402 { type: Component, args: [{ selector: 'ion-select-option', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['disabled', 'selected', 'value'] },] },
2403];
2404/** @nocollapse */
2405IonSelectOption.ctorParameters = () => [
2406 { type: ChangeDetectorRef },
2407 { type: ElementRef },
2408 { type: NgZone }
2409];
2410proxyInputs(IonSelectOption, ['disabled', 'selected', 'value']);
2411class IonSkeletonText {
2412 /**
2413 * @param {?} c
2414 * @param {?} r
2415 * @param {?} z
2416 */
2417 constructor(c, r, z) {
2418 this.z = z;
2419 c.detach();
2420 this.el = r.nativeElement;
2421 }
2422}
2423IonSkeletonText.decorators = [
2424 { type: Component, args: [{ selector: 'ion-skeleton-text', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['animated', 'width'] },] },
2425];
2426/** @nocollapse */
2427IonSkeletonText.ctorParameters = () => [
2428 { type: ChangeDetectorRef },
2429 { type: ElementRef },
2430 { type: NgZone }
2431];
2432proxyInputs(IonSkeletonText, ['animated', 'width']);
2433class IonSlide {
2434 /**
2435 * @param {?} c
2436 * @param {?} r
2437 * @param {?} z
2438 */
2439 constructor(c, r, z) {
2440 this.z = z;
2441 c.detach();
2442 this.el = r.nativeElement;
2443 }
2444}
2445IonSlide.decorators = [
2446 { type: Component, args: [{ selector: 'ion-slide', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
2447];
2448/** @nocollapse */
2449IonSlide.ctorParameters = () => [
2450 { type: ChangeDetectorRef },
2451 { type: ElementRef },
2452 { type: NgZone }
2453];
2454class IonSlides {
2455 /**
2456 * @param {?} c
2457 * @param {?} r
2458 * @param {?} z
2459 */
2460 constructor(c, r, z) {
2461 this.z = z;
2462 c.detach();
2463 this.el = r.nativeElement;
2464 proxyOutputs(this, this.el, ['ionSlidesDidLoad', 'ionSlideTap', 'ionSlideDoubleTap', 'ionSlideWillChange', 'ionSlideDidChange', 'ionSlideNextStart', 'ionSlidePrevStart', 'ionSlideNextEnd', 'ionSlidePrevEnd', 'ionSlideTransitionStart', 'ionSlideTransitionEnd', 'ionSlideDrag', 'ionSlideReachStart', 'ionSlideReachEnd', 'ionSlideTouchStart', 'ionSlideTouchEnd']);
2465 }
2466}
2467IonSlides.decorators = [
2468 { type: Component, args: [{ selector: 'ion-slides', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['mode', 'options', 'pager', 'scrollbar'] },] },
2469];
2470/** @nocollapse */
2471IonSlides.ctorParameters = () => [
2472 { type: ChangeDetectorRef },
2473 { type: ElementRef },
2474 { type: NgZone }
2475];
2476proxyMethods(IonSlides, ['update', 'updateAutoHeight', 'slideTo', 'slideNext', 'slidePrev', 'getActiveIndex', 'getPreviousIndex', 'length', 'isEnd', 'isBeginning', 'startAutoplay', 'stopAutoplay', 'lockSwipeToNext', 'lockSwipeToPrev', 'lockSwipes', 'getSwiper']);
2477proxyInputs(IonSlides, ['mode', 'options', 'pager', 'scrollbar']);
2478class IonSpinner {
2479 /**
2480 * @param {?} c
2481 * @param {?} r
2482 * @param {?} z
2483 */
2484 constructor(c, r, z) {
2485 this.z = z;
2486 c.detach();
2487 this.el = r.nativeElement;
2488 }
2489}
2490IonSpinner.decorators = [
2491 { type: Component, args: [{ selector: 'ion-spinner', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'duration', 'name', 'paused'] },] },
2492];
2493/** @nocollapse */
2494IonSpinner.ctorParameters = () => [
2495 { type: ChangeDetectorRef },
2496 { type: ElementRef },
2497 { type: NgZone }
2498];
2499proxyInputs(IonSpinner, ['color', 'duration', 'name', 'paused']);
2500class IonSplitPane {
2501 /**
2502 * @param {?} c
2503 * @param {?} r
2504 * @param {?} z
2505 */
2506 constructor(c, r, z) {
2507 this.z = z;
2508 c.detach();
2509 this.el = r.nativeElement;
2510 proxyOutputs(this, this.el, ['ionSplitPaneVisible']);
2511 }
2512}
2513IonSplitPane.decorators = [
2514 { type: Component, args: [{ selector: 'ion-split-pane', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['contentId', 'disabled', 'when'] },] },
2515];
2516/** @nocollapse */
2517IonSplitPane.ctorParameters = () => [
2518 { type: ChangeDetectorRef },
2519 { type: ElementRef },
2520 { type: NgZone }
2521];
2522proxyInputs(IonSplitPane, ['contentId', 'disabled', 'when']);
2523class IonTabBar {
2524 /**
2525 * @param {?} c
2526 * @param {?} r
2527 * @param {?} z
2528 */
2529 constructor(c, r, z) {
2530 this.z = z;
2531 c.detach();
2532 this.el = r.nativeElement;
2533 }
2534}
2535IonTabBar.decorators = [
2536 { type: Component, args: [{ selector: 'ion-tab-bar', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode', 'selectedTab', 'translucent'] },] },
2537];
2538/** @nocollapse */
2539IonTabBar.ctorParameters = () => [
2540 { type: ChangeDetectorRef },
2541 { type: ElementRef },
2542 { type: NgZone }
2543];
2544proxyInputs(IonTabBar, ['color', 'mode', 'selectedTab', 'translucent']);
2545class IonTabButton {
2546 /**
2547 * @param {?} c
2548 * @param {?} r
2549 * @param {?} z
2550 */
2551 constructor(c, r, z) {
2552 this.z = z;
2553 c.detach();
2554 this.el = r.nativeElement;
2555 }
2556}
2557IonTabButton.decorators = [
2558 { type: Component, args: [{ selector: 'ion-tab-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['disabled', 'download', 'href', 'layout', 'mode', 'rel', 'selected', 'tab', 'target'] },] },
2559];
2560/** @nocollapse */
2561IonTabButton.ctorParameters = () => [
2562 { type: ChangeDetectorRef },
2563 { type: ElementRef },
2564 { type: NgZone }
2565];
2566proxyInputs(IonTabButton, ['disabled', 'download', 'href', 'layout', 'mode', 'rel', 'selected', 'tab', 'target']);
2567class IonText {
2568 /**
2569 * @param {?} c
2570 * @param {?} r
2571 * @param {?} z
2572 */
2573 constructor(c, r, z) {
2574 this.z = z;
2575 c.detach();
2576 this.el = r.nativeElement;
2577 }
2578}
2579IonText.decorators = [
2580 { type: Component, args: [{ selector: 'ion-text', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
2581];
2582/** @nocollapse */
2583IonText.ctorParameters = () => [
2584 { type: ChangeDetectorRef },
2585 { type: ElementRef },
2586 { type: NgZone }
2587];
2588proxyInputs(IonText, ['color', 'mode']);
2589class IonTextarea {
2590 /**
2591 * @param {?} c
2592 * @param {?} r
2593 * @param {?} z
2594 */
2595 constructor(c, r, z) {
2596 this.z = z;
2597 c.detach();
2598 this.el = r.nativeElement;
2599 proxyOutputs(this, this.el, ['ionChange', 'ionInput', 'ionBlur', 'ionFocus']);
2600 }
2601}
2602IonTextarea.decorators = [
2603 { type: Component, args: [{ selector: 'ion-textarea', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['autoGrow', 'autocapitalize', 'autofocus', 'clearOnEdit', 'color', 'cols', 'debounce', 'disabled', 'maxlength', 'minlength', 'mode', 'name', 'placeholder', 'readonly', 'required', 'rows', 'spellcheck', 'value', 'wrap'] },] },
2604];
2605/** @nocollapse */
2606IonTextarea.ctorParameters = () => [
2607 { type: ChangeDetectorRef },
2608 { type: ElementRef },
2609 { type: NgZone }
2610];
2611proxyMethods(IonTextarea, ['setFocus', 'getInputElement']);
2612proxyInputs(IonTextarea, ['autoGrow', 'autocapitalize', 'autofocus', 'clearOnEdit', 'color', 'cols', 'debounce', 'disabled', 'maxlength', 'minlength', 'mode', 'name', 'placeholder', 'readonly', 'required', 'rows', 'spellcheck', 'value', 'wrap']);
2613class IonThumbnail {
2614 /**
2615 * @param {?} c
2616 * @param {?} r
2617 * @param {?} z
2618 */
2619 constructor(c, r, z) {
2620 this.z = z;
2621 c.detach();
2622 this.el = r.nativeElement;
2623 }
2624}
2625IonThumbnail.decorators = [
2626 { type: Component, args: [{ selector: 'ion-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>' },] },
2627];
2628/** @nocollapse */
2629IonThumbnail.ctorParameters = () => [
2630 { type: ChangeDetectorRef },
2631 { type: ElementRef },
2632 { type: NgZone }
2633];
2634class IonTitle {
2635 /**
2636 * @param {?} c
2637 * @param {?} r
2638 * @param {?} z
2639 */
2640 constructor(c, r, z) {
2641 this.z = z;
2642 c.detach();
2643 this.el = r.nativeElement;
2644 }
2645}
2646IonTitle.decorators = [
2647 { type: Component, args: [{ selector: 'ion-title', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'size'] },] },
2648];
2649/** @nocollapse */
2650IonTitle.ctorParameters = () => [
2651 { type: ChangeDetectorRef },
2652 { type: ElementRef },
2653 { type: NgZone }
2654];
2655proxyInputs(IonTitle, ['color', 'size']);
2656class IonToggle {
2657 /**
2658 * @param {?} c
2659 * @param {?} r
2660 * @param {?} z
2661 */
2662 constructor(c, r, z) {
2663 this.z = z;
2664 c.detach();
2665 this.el = r.nativeElement;
2666 proxyOutputs(this, this.el, ['ionChange', 'ionFocus', 'ionBlur']);
2667 }
2668}
2669IonToggle.decorators = [
2670 { type: Component, args: [{ selector: 'ion-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['checked', 'color', 'disabled', 'mode', 'name', 'value'] },] },
2671];
2672/** @nocollapse */
2673IonToggle.ctorParameters = () => [
2674 { type: ChangeDetectorRef },
2675 { type: ElementRef },
2676 { type: NgZone }
2677];
2678proxyInputs(IonToggle, ['checked', 'color', 'disabled', 'mode', 'name', 'value']);
2679class IonToolbar {
2680 /**
2681 * @param {?} c
2682 * @param {?} r
2683 * @param {?} z
2684 */
2685 constructor(c, r, z) {
2686 this.z = z;
2687 c.detach();
2688 this.el = r.nativeElement;
2689 }
2690}
2691IonToolbar.decorators = [
2692 { type: Component, args: [{ selector: 'ion-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: '<ng-content></ng-content>', inputs: ['color', 'mode'] },] },
2693];
2694/** @nocollapse */
2695IonToolbar.ctorParameters = () => [
2696 { type: ChangeDetectorRef },
2697 { type: ElementRef },
2698 { type: NgZone }
2699];
2700proxyInputs(IonToolbar, ['color', 'mode']);
2701
2702/**
2703 * @fileoverview added by tsickle
2704 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2705 */
2706class Config {
2707 /**
2708 * @param {?} key
2709 * @param {?=} fallback
2710 * @return {?}
2711 */
2712 get(key, fallback) {
2713 /** @type {?} */
2714 const c = getConfig();
2715 if (c) {
2716 return c.get(key, fallback);
2717 }
2718 return null;
2719 }
2720 /**
2721 * @param {?} key
2722 * @param {?=} fallback
2723 * @return {?}
2724 */
2725 getBoolean(key, fallback) {
2726 /** @type {?} */
2727 const c = getConfig();
2728 if (c) {
2729 return c.getBoolean(key, fallback);
2730 }
2731 return false;
2732 }
2733 /**
2734 * @param {?} key
2735 * @param {?=} fallback
2736 * @return {?}
2737 */
2738 getNumber(key, fallback) {
2739 /** @type {?} */
2740 const c = getConfig();
2741 if (c) {
2742 return c.getNumber(key, fallback);
2743 }
2744 return 0;
2745 }
2746 /**
2747 * @param {?} key
2748 * @param {?=} value
2749 * @return {?}
2750 */
2751 set(key, value) {
2752 console.warn(`[DEPRECATION][Config]: The Config.set() method is deprecated and will be removed in Ionic Framework 6.0. Please see https://ionicframework.com/docs/angular/config for alternatives.`);
2753 /** @type {?} */
2754 const c = getConfig();
2755 if (c) {
2756 c.set(key, value);
2757 }
2758 }
2759}
2760Config.decorators = [
2761 { type: Injectable, args: [{
2762 providedIn: 'root'
2763 },] },
2764];
2765/** @nocollapse */ Config.ngInjectableDef = defineInjectable({ factory: function Config_Factory() { return new Config(); }, token: Config, providedIn: "root" });
2766/** @type {?} */
2767const ConfigToken = new InjectionToken('USERCONFIG');
2768/** @type {?} */
2769const getConfig = (/**
2770 * @return {?}
2771 */
2772() => {
2773 if (typeof ((/** @type {?} */ (window))) !== 'undefined') {
2774 /** @type {?} */
2775 const Ionic = ((/** @type {?} */ ((/** @type {?} */ (window))))).Ionic;
2776 if (Ionic && Ionic.config) {
2777 return Ionic.config;
2778 }
2779 }
2780 return null;
2781});
2782
2783/**
2784 * @fileoverview added by tsickle
2785 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2786 */
2787/**
2788 * \@description
2789 * NavParams are an object that exists on a page and can contain data for that particular view.
2790 * Similar to how data was pass to a view in V1 with `$stateParams`, NavParams offer a much more flexible
2791 * option with a simple `get` method.
2792 *
2793 * \@usage
2794 * ```ts
2795 * import { NavParams } from '\@ionic/angular';
2796 *
2797 * export class MyClass{
2798 *
2799 * constructor(navParams: NavParams){
2800 * // userParams is an object we have in our nav-parameters
2801 * navParams.get('userParams');
2802 * }
2803 *
2804 * }
2805 * ```
2806 */
2807class NavParams {
2808 /**
2809 * @param {?=} data
2810 */
2811 constructor(data = {}) {
2812 this.data = data;
2813 }
2814 /**
2815 * Get the value of a nav-parameter for the current view
2816 *
2817 * ```ts
2818 * import { NavParams } from 'ionic-angular';
2819 *
2820 * export class MyClass{
2821 * constructor(public navParams: NavParams){
2822 * // userParams is an object we have in our nav-parameters
2823 * this.navParams.get('userParams');
2824 * }
2825 * }
2826 * ```
2827 *
2828 * @param {?} param Which param you want to look up
2829 * @return {?}
2830 */
2831 get(param) {
2832 return this.data[param];
2833 }
2834}
2835
2836/**
2837 * @fileoverview added by tsickle
2838 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2839 */
2840class AngularDelegate {
2841 /**
2842 * @param {?} zone
2843 * @param {?} appRef
2844 */
2845 constructor(zone, appRef) {
2846 this.zone = zone;
2847 this.appRef = appRef;
2848 }
2849 /**
2850 * @param {?} resolver
2851 * @param {?} injector
2852 * @param {?=} location
2853 * @return {?}
2854 */
2855 create(resolver, injector, location) {
2856 return new AngularFrameworkDelegate(resolver, injector, location, this.appRef, this.zone);
2857 }
2858}
2859AngularDelegate.decorators = [
2860 { type: Injectable },
2861];
2862/** @nocollapse */
2863AngularDelegate.ctorParameters = () => [
2864 { type: NgZone },
2865 { type: ApplicationRef }
2866];
2867class AngularFrameworkDelegate {
2868 /**
2869 * @param {?} resolver
2870 * @param {?} injector
2871 * @param {?} location
2872 * @param {?} appRef
2873 * @param {?} zone
2874 */
2875 constructor(resolver, injector, location, appRef, zone) {
2876 this.resolver = resolver;
2877 this.injector = injector;
2878 this.location = location;
2879 this.appRef = appRef;
2880 this.zone = zone;
2881 this.elRefMap = new WeakMap();
2882 this.elEventsMap = new WeakMap();
2883 }
2884 /**
2885 * @param {?} container
2886 * @param {?} component
2887 * @param {?=} params
2888 * @param {?=} cssClasses
2889 * @return {?}
2890 */
2891 attachViewToDom(container, component, params, cssClasses) {
2892 return this.zone.run((/**
2893 * @return {?}
2894 */
2895 () => {
2896 return new Promise((/**
2897 * @param {?} resolve
2898 * @return {?}
2899 */
2900 resolve => {
2901 /** @type {?} */
2902 const el = attachView(this.zone, this.resolver, this.injector, this.location, this.appRef, this.elRefMap, this.elEventsMap, container, component, params, cssClasses);
2903 resolve(el);
2904 }));
2905 }));
2906 }
2907 /**
2908 * @param {?} _container
2909 * @param {?} component
2910 * @return {?}
2911 */
2912 removeViewFromDom(_container, component) {
2913 return this.zone.run((/**
2914 * @return {?}
2915 */
2916 () => {
2917 return new Promise((/**
2918 * @param {?} resolve
2919 * @return {?}
2920 */
2921 resolve => {
2922 /** @type {?} */
2923 const componentRef = this.elRefMap.get(component);
2924 if (componentRef) {
2925 componentRef.destroy();
2926 this.elRefMap.delete(component);
2927 /** @type {?} */
2928 const unbindEvents = this.elEventsMap.get(component);
2929 if (unbindEvents) {
2930 unbindEvents();
2931 this.elEventsMap.delete(component);
2932 }
2933 }
2934 resolve();
2935 }));
2936 }));
2937 }
2938}
2939/** @type {?} */
2940const attachView = (/**
2941 * @param {?} zone
2942 * @param {?} resolver
2943 * @param {?} injector
2944 * @param {?} location
2945 * @param {?} appRef
2946 * @param {?} elRefMap
2947 * @param {?} elEventsMap
2948 * @param {?} container
2949 * @param {?} component
2950 * @param {?} params
2951 * @param {?} cssClasses
2952 * @return {?}
2953 */
2954(zone, resolver, injector, location, appRef, elRefMap, elEventsMap, container, component, params, cssClasses) => {
2955 /** @type {?} */
2956 const factory = resolver.resolveComponentFactory(component);
2957 /** @type {?} */
2958 const childInjector = Injector.create({
2959 providers: getProviders(params),
2960 parent: injector
2961 });
2962 /** @type {?} */
2963 const componentRef = (location)
2964 ? location.createComponent(factory, location.length, childInjector)
2965 : factory.create(childInjector);
2966 /** @type {?} */
2967 const instance = componentRef.instance;
2968 /** @type {?} */
2969 const hostElement = componentRef.location.nativeElement;
2970 if (params) {
2971 Object.assign(instance, params);
2972 }
2973 if (cssClasses) {
2974 for (const clazz of cssClasses) {
2975 hostElement.classList.add(clazz);
2976 }
2977 }
2978 /** @type {?} */
2979 const unbindEvents = bindLifecycleEvents(zone, instance, hostElement);
2980 container.appendChild(hostElement);
2981 if (!location) {
2982 appRef.attachView(componentRef.hostView);
2983 }
2984 componentRef.changeDetectorRef.reattach();
2985 elRefMap.set(hostElement, componentRef);
2986 elEventsMap.set(hostElement, unbindEvents);
2987 return hostElement;
2988});
2989/** @type {?} */
2990const LIFECYCLES = [
2991 LIFECYCLE_WILL_ENTER,
2992 LIFECYCLE_DID_ENTER,
2993 LIFECYCLE_WILL_LEAVE,
2994 LIFECYCLE_DID_LEAVE,
2995 LIFECYCLE_WILL_UNLOAD
2996];
2997/** @type {?} */
2998const bindLifecycleEvents = (/**
2999 * @param {?} zone
3000 * @param {?} instance
3001 * @param {?} element
3002 * @return {?}
3003 */
3004(zone, instance, element) => {
3005 return zone.run((/**
3006 * @return {?}
3007 */
3008 () => {
3009 /** @type {?} */
3010 const unregisters = LIFECYCLES
3011 .filter((/**
3012 * @param {?} eventName
3013 * @return {?}
3014 */
3015 eventName => typeof instance[eventName] === 'function'))
3016 .map((/**
3017 * @param {?} eventName
3018 * @return {?}
3019 */
3020 eventName => {
3021 /** @type {?} */
3022 const handler = (/**
3023 * @param {?} ev
3024 * @return {?}
3025 */
3026 (ev) => instance[eventName](ev.detail));
3027 element.addEventListener(eventName, handler);
3028 return (/**
3029 * @return {?}
3030 */
3031 () => element.removeEventListener(eventName, handler));
3032 }));
3033 return (/**
3034 * @return {?}
3035 */
3036 () => unregisters.forEach((/**
3037 * @param {?} fn
3038 * @return {?}
3039 */
3040 fn => fn())));
3041 }));
3042});
3043/** @type {?} */
3044const NavParamsToken = new InjectionToken('NavParamsToken');
3045/** @type {?} */
3046const getProviders = (/**
3047 * @param {?} params
3048 * @return {?}
3049 */
3050(params) => {
3051 return [
3052 {
3053 provide: NavParamsToken, useValue: params
3054 },
3055 {
3056 provide: NavParams, useFactory: provideNavParamsInjectable, deps: [NavParamsToken]
3057 }
3058 ];
3059});
3060/** @type {?} */
3061const provideNavParamsInjectable = (/**
3062 * @param {?} params
3063 * @return {?}
3064 */
3065(params) => {
3066 return new NavParams(params);
3067});
3068
3069/**
3070 * @fileoverview added by tsickle
3071 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3072 */
3073/** @type {?} */
3074const insertView = (/**
3075 * @param {?} views
3076 * @param {?} view
3077 * @param {?} direction
3078 * @return {?}
3079 */
3080(views, view, direction) => {
3081 if (direction === 'root') {
3082 return setRoot(views, view);
3083 }
3084 else if (direction === 'forward') {
3085 return setForward(views, view);
3086 }
3087 else {
3088 return setBack(views, view);
3089 }
3090});
3091/** @type {?} */
3092const setRoot = (/**
3093 * @param {?} views
3094 * @param {?} view
3095 * @return {?}
3096 */
3097(views, view) => {
3098 views = views.filter((/**
3099 * @param {?} v
3100 * @return {?}
3101 */
3102 v => v.stackId !== view.stackId));
3103 views.push(view);
3104 return views;
3105});
3106/** @type {?} */
3107const setForward = (/**
3108 * @param {?} views
3109 * @param {?} view
3110 * @return {?}
3111 */
3112(views, view) => {
3113 /** @type {?} */
3114 const index = views.indexOf(view);
3115 if (index >= 0) {
3116 views = views.filter((/**
3117 * @param {?} v
3118 * @return {?}
3119 */
3120 v => v.stackId !== view.stackId || v.id <= view.id));
3121 }
3122 else {
3123 views.push(view);
3124 }
3125 return views;
3126});
3127/** @type {?} */
3128const setBack = (/**
3129 * @param {?} views
3130 * @param {?} view
3131 * @return {?}
3132 */
3133(views, view) => {
3134 /** @type {?} */
3135 const index = views.indexOf(view);
3136 if (index >= 0) {
3137 return views.filter((/**
3138 * @param {?} v
3139 * @return {?}
3140 */
3141 v => v.stackId !== view.stackId || v.id <= view.id));
3142 }
3143 else {
3144 return setRoot(views, view);
3145 }
3146});
3147/** @type {?} */
3148const getUrl = (/**
3149 * @param {?} router
3150 * @param {?} activatedRoute
3151 * @return {?}
3152 */
3153(router, activatedRoute) => {
3154 /** @type {?} */
3155 const urlTree = router.createUrlTree(['.'], { relativeTo: activatedRoute });
3156 return router.serializeUrl(urlTree);
3157});
3158/** @type {?} */
3159const isTabSwitch = (/**
3160 * @param {?} enteringView
3161 * @param {?} leavingView
3162 * @return {?}
3163 */
3164(enteringView, leavingView) => {
3165 if (!leavingView) {
3166 return true;
3167 }
3168 return enteringView.stackId !== leavingView.stackId;
3169});
3170/** @type {?} */
3171const computeStackId = (/**
3172 * @param {?} prefixUrl
3173 * @param {?} url
3174 * @return {?}
3175 */
3176(prefixUrl, url) => {
3177 if (!prefixUrl) {
3178 return undefined;
3179 }
3180 /** @type {?} */
3181 const segments = toSegments(url);
3182 for (let i = 0; i < segments.length; i++) {
3183 if (i >= prefixUrl.length) {
3184 return segments[i];
3185 }
3186 if (segments[i] !== prefixUrl[i]) {
3187 return undefined;
3188 }
3189 }
3190 return undefined;
3191});
3192/** @type {?} */
3193const toSegments = (/**
3194 * @param {?} path
3195 * @return {?}
3196 */
3197(path) => {
3198 return path
3199 .split('/')
3200 .map((/**
3201 * @param {?} s
3202 * @return {?}
3203 */
3204 s => s.trim()))
3205 .filter((/**
3206 * @param {?} s
3207 * @return {?}
3208 */
3209 s => s !== ''));
3210});
3211/** @type {?} */
3212const destroyView = (/**
3213 * @param {?} view
3214 * @return {?}
3215 */
3216(view) => {
3217 if (view) {
3218 // TODO lifecycle event
3219 view.ref.destroy();
3220 view.unlistenEvents();
3221 }
3222});
3223
3224/**
3225 * @fileoverview added by tsickle
3226 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3227 */
3228class StackController {
3229 /**
3230 * @param {?} tabsPrefix
3231 * @param {?} containerEl
3232 * @param {?} router
3233 * @param {?} navCtrl
3234 * @param {?} zone
3235 * @param {?} location
3236 */
3237 constructor(tabsPrefix, containerEl, router, navCtrl, zone, location) {
3238 this.containerEl = containerEl;
3239 this.router = router;
3240 this.navCtrl = navCtrl;
3241 this.zone = zone;
3242 this.location = location;
3243 this.views = [];
3244 this.skipTransition = false;
3245 this.nextId = 0;
3246 this.tabsPrefix = tabsPrefix !== undefined ? toSegments(tabsPrefix) : undefined;
3247 }
3248 /**
3249 * @param {?} ref
3250 * @param {?} activatedRoute
3251 * @return {?}
3252 */
3253 createView(ref, activatedRoute) {
3254 /** @type {?} */
3255 const url = getUrl(this.router, activatedRoute);
3256 /** @type {?} */
3257 const element = (/** @type {?} */ ((ref && ref.location && ref.location.nativeElement)));
3258 /** @type {?} */
3259 const unlistenEvents = bindLifecycleEvents(this.zone, ref.instance, element);
3260 return {
3261 id: this.nextId++,
3262 stackId: computeStackId(this.tabsPrefix, url),
3263 unlistenEvents,
3264 element,
3265 ref,
3266 url,
3267 };
3268 }
3269 /**
3270 * @param {?} activatedRoute
3271 * @return {?}
3272 */
3273 getExistingView(activatedRoute) {
3274 /** @type {?} */
3275 const activatedUrlKey = getUrl(this.router, activatedRoute);
3276 /** @type {?} */
3277 const view = this.views.find((/**
3278 * @param {?} vw
3279 * @return {?}
3280 */
3281 vw => vw.url === activatedUrlKey));
3282 if (view) {
3283 view.ref.changeDetectorRef.reattach();
3284 }
3285 return view;
3286 }
3287 /**
3288 * @param {?} enteringView
3289 * @return {?}
3290 */
3291 setActive(enteringView) {
3292 let { direction, animation } = this.navCtrl.consumeTransition();
3293 /** @type {?} */
3294 const leavingView = this.activeView;
3295 /** @type {?} */
3296 const tabSwitch = isTabSwitch(enteringView, leavingView);
3297 if (tabSwitch) {
3298 direction = 'back';
3299 animation = undefined;
3300 }
3301 /** @type {?} */
3302 const viewsSnapshot = this.views.slice();
3303 /** @type {?} */
3304 let currentNavigation;
3305 /** @type {?} */
3306 const router = ((/** @type {?} */ (this.router)));
3307 // Angular >= 7.2.0
3308 if (router.getCurrentNavigation) {
3309 currentNavigation = router.getCurrentNavigation();
3310 // Angular < 7.2.0
3311 }
3312 else if (router.navigations &&
3313 router.navigations.value) {
3314 currentNavigation = router.navigations.value;
3315 }
3316 /**
3317 * If the navigation action
3318 * sets `replaceUrl: true`
3319 * then we need to make sure
3320 * we remove the last item
3321 * from our views stack
3322 */
3323 if (currentNavigation &&
3324 currentNavigation.extras &&
3325 currentNavigation.extras.replaceUrl) {
3326 if (this.views.length > 0) {
3327 this.views.splice(-1, 1);
3328 }
3329 }
3330 /** @type {?} */
3331 const reused = this.views.includes(enteringView);
3332 /** @type {?} */
3333 const views = this.insertView(enteringView, direction);
3334 // Trigger change detection before transition starts
3335 // This will call ngOnInit() the first time too, just after the view
3336 // was attached to the dom, but BEFORE the transition starts
3337 if (!reused) {
3338 enteringView.ref.changeDetectorRef.detectChanges();
3339 }
3340 // Wait until previous transitions finish
3341 return this.zone.runOutsideAngular((/**
3342 * @return {?}
3343 */
3344 () => {
3345 return this.wait((/**
3346 * @return {?}
3347 */
3348 () => {
3349 // disconnect leaving page from change detection to
3350 // reduce jank during the page transition
3351 if (leavingView) {
3352 leavingView.ref.changeDetectorRef.detach();
3353 }
3354 // In case the enteringView is the same as the leavingPage we need to reattach()
3355 enteringView.ref.changeDetectorRef.reattach();
3356 return this.transition(enteringView, leavingView, animation, this.canGoBack(1), false)
3357 .then((/**
3358 * @return {?}
3359 */
3360 () => cleanupAsync(enteringView, views, viewsSnapshot, this.location)))
3361 .then((/**
3362 * @return {?}
3363 */
3364 () => ({
3365 enteringView,
3366 direction,
3367 animation,
3368 tabSwitch
3369 })));
3370 }));
3371 }));
3372 }
3373 /**
3374 * @param {?} deep
3375 * @param {?=} stackId
3376 * @return {?}
3377 */
3378 canGoBack(deep, stackId = this.getActiveStackId()) {
3379 return this.getStack(stackId).length > deep;
3380 }
3381 /**
3382 * @param {?} deep
3383 * @param {?=} stackId
3384 * @return {?}
3385 */
3386 pop(deep, stackId = this.getActiveStackId()) {
3387 return this.zone.run((/**
3388 * @return {?}
3389 */
3390 () => {
3391 /** @type {?} */
3392 const views = this.getStack(stackId);
3393 if (views.length <= deep) {
3394 return Promise.resolve(false);
3395 }
3396 /** @type {?} */
3397 const view = views[views.length - deep - 1];
3398 /** @type {?} */
3399 let url = view.url;
3400 /** @type {?} */
3401 const viewSavedData = view.savedData;
3402 if (viewSavedData) {
3403 /** @type {?} */
3404 const primaryOutlet = viewSavedData.get('primary');
3405 if (primaryOutlet &&
3406 primaryOutlet.route &&
3407 primaryOutlet.route._routerState &&
3408 primaryOutlet.route._routerState.snapshot &&
3409 primaryOutlet.route._routerState.snapshot.url) {
3410 url = primaryOutlet.route._routerState.snapshot.url;
3411 }
3412 }
3413 return this.navCtrl.navigateBack(url, view.savedExtras).then((/**
3414 * @return {?}
3415 */
3416 () => true));
3417 }));
3418 }
3419 /**
3420 * @return {?}
3421 */
3422 startBackTransition() {
3423 /** @type {?} */
3424 const leavingView = this.activeView;
3425 if (leavingView) {
3426 /** @type {?} */
3427 const views = this.getStack(leavingView.stackId);
3428 /** @type {?} */
3429 const enteringView = views[views.length - 2];
3430 return this.wait((/**
3431 * @return {?}
3432 */
3433 () => {
3434 return this.transition(enteringView, // entering view
3435 leavingView, // leaving view
3436 'back', this.canGoBack(2), true);
3437 }));
3438 }
3439 return Promise.resolve();
3440 }
3441 /**
3442 * @param {?} shouldComplete
3443 * @return {?}
3444 */
3445 endBackTransition(shouldComplete) {
3446 if (shouldComplete) {
3447 this.skipTransition = true;
3448 this.pop(1);
3449 }
3450 else if (this.activeView) {
3451 cleanup(this.activeView, this.views, this.views, this.location);
3452 }
3453 }
3454 /**
3455 * @param {?=} stackId
3456 * @return {?}
3457 */
3458 getLastUrl(stackId) {
3459 /** @type {?} */
3460 const views = this.getStack(stackId);
3461 return views.length > 0 ? views[views.length - 1] : undefined;
3462 }
3463 /**
3464 * @return {?}
3465 */
3466 getActiveStackId() {
3467 return this.activeView ? this.activeView.stackId : undefined;
3468 }
3469 /**
3470 * @return {?}
3471 */
3472 destroy() {
3473 this.containerEl = (/** @type {?} */ (undefined));
3474 this.views.forEach(destroyView);
3475 this.activeView = undefined;
3476 this.views = [];
3477 }
3478 /**
3479 * @private
3480 * @param {?} stackId
3481 * @return {?}
3482 */
3483 getStack(stackId) {
3484 return this.views.filter((/**
3485 * @param {?} v
3486 * @return {?}
3487 */
3488 v => v.stackId === stackId));
3489 }
3490 /**
3491 * @private
3492 * @param {?} enteringView
3493 * @param {?} direction
3494 * @return {?}
3495 */
3496 insertView(enteringView, direction) {
3497 this.activeView = enteringView;
3498 this.views = insertView(this.views, enteringView, direction);
3499 return this.views.slice();
3500 }
3501 /**
3502 * @private
3503 * @param {?} enteringView
3504 * @param {?} leavingView
3505 * @param {?} direction
3506 * @param {?} showGoBack
3507 * @param {?} progressAnimation
3508 * @return {?}
3509 */
3510 transition(enteringView, leavingView, direction, showGoBack, progressAnimation) {
3511 if (this.skipTransition) {
3512 this.skipTransition = false;
3513 return Promise.resolve(false);
3514 }
3515 if (leavingView === enteringView) {
3516 return Promise.resolve(false);
3517 }
3518 /** @type {?} */
3519 const enteringEl = enteringView ? enteringView.element : undefined;
3520 /** @type {?} */
3521 const leavingEl = leavingView ? leavingView.element : undefined;
3522 /** @type {?} */
3523 const containerEl = this.containerEl;
3524 if (enteringEl && enteringEl !== leavingEl) {
3525 enteringEl.classList.add('ion-page');
3526 enteringEl.classList.add('ion-page-invisible');
3527 if (enteringEl.parentElement !== containerEl) {
3528 containerEl.appendChild(enteringEl);
3529 }
3530 if (((/** @type {?} */ (containerEl))).commit) {
3531 return containerEl.commit(enteringEl, leavingEl, {
3532 deepWait: true,
3533 duration: direction === undefined ? 0 : undefined,
3534 direction,
3535 showGoBack,
3536 progressAnimation
3537 });
3538 }
3539 }
3540 return Promise.resolve(false);
3541 }
3542 /**
3543 * @private
3544 * @template T
3545 * @param {?} task
3546 * @return {?}
3547 */
3548 wait(task) {
3549 return __awaiter(this, void 0, void 0, function* () {
3550 if (this.runningTask !== undefined) {
3551 yield this.runningTask;
3552 this.runningTask = undefined;
3553 }
3554 /** @type {?} */
3555 const promise = this.runningTask = task();
3556 return promise;
3557 });
3558 }
3559}
3560/** @type {?} */
3561const cleanupAsync = (/**
3562 * @param {?} activeRoute
3563 * @param {?} views
3564 * @param {?} viewsSnapshot
3565 * @param {?} location
3566 * @return {?}
3567 */
3568(activeRoute, views, viewsSnapshot, location) => {
3569 if (typeof ((/** @type {?} */ (requestAnimationFrame))) === 'function') {
3570 return new Promise((/**
3571 * @param {?} resolve
3572 * @return {?}
3573 */
3574 resolve => {
3575 requestAnimationFrame((/**
3576 * @return {?}
3577 */
3578 () => {
3579 cleanup(activeRoute, views, viewsSnapshot, location);
3580 resolve();
3581 }));
3582 }));
3583 }
3584 return Promise.resolve();
3585});
3586/** @type {?} */
3587const cleanup = (/**
3588 * @param {?} activeRoute
3589 * @param {?} views
3590 * @param {?} viewsSnapshot
3591 * @param {?} location
3592 * @return {?}
3593 */
3594(activeRoute, views, viewsSnapshot, location) => {
3595 viewsSnapshot
3596 .filter((/**
3597 * @param {?} view
3598 * @return {?}
3599 */
3600 view => !views.includes(view)))
3601 .forEach(destroyView);
3602 views.forEach((/**
3603 * @param {?} view
3604 * @return {?}
3605 */
3606 view => {
3607 /**
3608 * In the event that a user navigated multiple
3609 * times in rapid succession, we want to make sure
3610 * we don't pre-emptively detach a view while
3611 * it is in mid-transition.
3612 *
3613 * In this instance we also do not care about query
3614 * params or fragments as it will be the same view regardless
3615 * @type {?}
3616 */
3617 const locationWithoutParams = location.path().split('?')[0];
3618 /** @type {?} */
3619 const locationWithoutFragment = locationWithoutParams.split('#')[0];
3620 if (view !== activeRoute && view.url !== locationWithoutFragment) {
3621 /** @type {?} */
3622 const element = view.element;
3623 element.setAttribute('aria-hidden', 'true');
3624 element.classList.add('ion-page-hidden');
3625 view.ref.changeDetectorRef.detach();
3626 }
3627 }));
3628});
3629
3630/**
3631 * @fileoverview added by tsickle
3632 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3633 */
3634class IonRouterOutlet {
3635 /**
3636 * @param {?} parentContexts
3637 * @param {?} location
3638 * @param {?} resolver
3639 * @param {?} name
3640 * @param {?} tabs
3641 * @param {?} config
3642 * @param {?} navCtrl
3643 * @param {?} commonLocation
3644 * @param {?} elementRef
3645 * @param {?} router
3646 * @param {?} zone
3647 * @param {?} activatedRoute
3648 * @param {?=} parentOutlet
3649 */
3650 constructor(parentContexts, location, resolver, name, tabs, config, navCtrl, commonLocation, elementRef, router, zone, activatedRoute, parentOutlet) {
3651 this.parentContexts = parentContexts;
3652 this.location = location;
3653 this.resolver = resolver;
3654 this.config = config;
3655 this.navCtrl = navCtrl;
3656 this.parentOutlet = parentOutlet;
3657 this.activated = null;
3658 this.activatedView = null;
3659 this._activatedRoute = null;
3660 // Maintain map of activated route proxies for each component instance
3661 this.proxyMap = new WeakMap();
3662 // Keep the latest activated route in a subject for the proxy routes to switch map to
3663 this.currentActivatedRoute$ = new BehaviorSubject(null);
3664 this.stackEvents = new EventEmitter();
3665 this.activateEvents = new EventEmitter();
3666 this.deactivateEvents = new EventEmitter();
3667 this.nativeEl = elementRef.nativeElement;
3668 this.name = name || PRIMARY_OUTLET;
3669 this.tabsPrefix = tabs === 'true' ? getUrl(router, activatedRoute) : undefined;
3670 this.stackCtrl = new StackController(this.tabsPrefix, this.nativeEl, router, navCtrl, zone, commonLocation);
3671 parentContexts.onChildOutletCreated(this.name, (/** @type {?} */ (this)));
3672 }
3673 /**
3674 * @param {?} animated
3675 * @return {?}
3676 */
3677 set animated(animated) {
3678 this.nativeEl.animated = animated;
3679 }
3680 /**
3681 * @param {?} swipe
3682 * @return {?}
3683 */
3684 set swipeGesture(swipe) {
3685 this._swipeGesture = swipe;
3686 this.nativeEl.swipeHandler = swipe ? {
3687 canStart: (/**
3688 * @return {?}
3689 */
3690 () => this.stackCtrl.canGoBack(1)),
3691 onStart: (/**
3692 * @return {?}
3693 */
3694 () => this.stackCtrl.startBackTransition()),
3695 onEnd: (/**
3696 * @param {?} shouldContinue
3697 * @return {?}
3698 */
3699 shouldContinue => this.stackCtrl.endBackTransition(shouldContinue))
3700 } : undefined;
3701 }
3702 /**
3703 * @return {?}
3704 */
3705 ngOnDestroy() {
3706 this.stackCtrl.destroy();
3707 }
3708 /**
3709 * @return {?}
3710 */
3711 getContext() {
3712 return this.parentContexts.getContext(this.name);
3713 }
3714 /**
3715 * @return {?}
3716 */
3717 ngOnInit() {
3718 if (!this.activated) {
3719 // If the outlet was not instantiated at the time the route got activated we need to populate
3720 // the outlet when it is initialized (ie inside a NgIf)
3721 /** @type {?} */
3722 const context = this.getContext();
3723 if (context && context.route) {
3724 this.activateWith(context.route, context.resolver || null);
3725 }
3726 }
3727 if (((/** @type {?} */ (this.nativeEl))).componentOnReady) {
3728 this.nativeEl.componentOnReady().then((/**
3729 * @return {?}
3730 */
3731 () => {
3732 if (this._swipeGesture === undefined) {
3733 this.swipeGesture = this.config.getBoolean('swipeBackEnabled', ((/** @type {?} */ (this.nativeEl))).mode === 'ios');
3734 }
3735 }));
3736 }
3737 }
3738 /**
3739 * @return {?}
3740 */
3741 get isActivated() {
3742 return !!this.activated;
3743 }
3744 /**
3745 * @return {?}
3746 */
3747 get component() {
3748 if (!this.activated) {
3749 throw new Error('Outlet is not activated');
3750 }
3751 return this.activated.instance;
3752 }
3753 /**
3754 * @return {?}
3755 */
3756 get activatedRoute() {
3757 if (!this.activated) {
3758 throw new Error('Outlet is not activated');
3759 }
3760 return (/** @type {?} */ (this._activatedRoute));
3761 }
3762 /**
3763 * @return {?}
3764 */
3765 get activatedRouteData() {
3766 if (this._activatedRoute) {
3767 return this._activatedRoute.snapshot.data;
3768 }
3769 return {};
3770 }
3771 /**
3772 * Called when the `RouteReuseStrategy` instructs to detach the subtree
3773 * @return {?}
3774 */
3775 detach() {
3776 throw new Error('incompatible reuse strategy');
3777 }
3778 /**
3779 * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree
3780 * @param {?} _ref
3781 * @param {?} _activatedRoute
3782 * @return {?}
3783 */
3784 attach(_ref, _activatedRoute) {
3785 throw new Error('incompatible reuse strategy');
3786 }
3787 /**
3788 * @return {?}
3789 */
3790 deactivate() {
3791 if (this.activated) {
3792 if (this.activatedView) {
3793 this.activatedView.savedData = new Map((/** @type {?} */ (this.getContext())).children['contexts']);
3794 /**
3795 * Ensure we are saving the NavigationExtras
3796 * data otherwise it will be lost
3797 */
3798 this.activatedView.savedExtras = {};
3799 /** @type {?} */
3800 const context = (/** @type {?} */ (this.getContext()));
3801 if (context.route) {
3802 /** @type {?} */
3803 const contextSnapshot = context.route.snapshot;
3804 this.activatedView.savedExtras.queryParams = contextSnapshot.queryParams;
3805 this.activatedView.savedExtras.fragment = contextSnapshot.fragment;
3806 }
3807 }
3808 /** @type {?} */
3809 const c = this.component;
3810 this.activatedView = null;
3811 this.activated = null;
3812 this._activatedRoute = null;
3813 this.deactivateEvents.emit(c);
3814 }
3815 }
3816 /**
3817 * @param {?} activatedRoute
3818 * @param {?} resolver
3819 * @return {?}
3820 */
3821 activateWith(activatedRoute, resolver) {
3822 if (this.isActivated) {
3823 throw new Error('Cannot activate an already activated outlet');
3824 }
3825 this._activatedRoute = activatedRoute;
3826 /** @type {?} */
3827 let cmpRef;
3828 /** @type {?} */
3829 let enteringView = this.stackCtrl.getExistingView(activatedRoute);
3830 if (enteringView) {
3831 cmpRef = this.activated = enteringView.ref;
3832 /** @type {?} */
3833 const saved = enteringView.savedData;
3834 if (saved) {
3835 // self-restore
3836 /** @type {?} */
3837 const context = (/** @type {?} */ (this.getContext()));
3838 context.children['contexts'] = saved;
3839 }
3840 // Updated activated route proxy for this component
3841 this.updateActivatedRouteProxy(cmpRef.instance, activatedRoute);
3842 }
3843 else {
3844 /** @type {?} */
3845 const snapshot = ((/** @type {?} */ (activatedRoute)))._futureSnapshot;
3846 /** @type {?} */
3847 const component = (/** @type {?} */ ((/** @type {?} */ (snapshot.routeConfig)).component));
3848 resolver = resolver || this.resolver;
3849 /** @type {?} */
3850 const factory = resolver.resolveComponentFactory(component);
3851 /** @type {?} */
3852 const childContexts = this.parentContexts.getOrCreateContext(this.name).children;
3853 // We create an activated route proxy object that will maintain future updates for this component
3854 // over its lifecycle in the stack.
3855 /** @type {?} */
3856 const component$ = new BehaviorSubject(null);
3857 /** @type {?} */
3858 const activatedRouteProxy = this.createActivatedRouteProxy(component$, activatedRoute);
3859 /** @type {?} */
3860 const injector = new OutletInjector(activatedRouteProxy, childContexts, this.location.injector);
3861 cmpRef = this.activated = this.location.createComponent(factory, this.location.length, injector);
3862 // Once the component is created we can push it to our local subject supplied to the proxy
3863 component$.next(cmpRef.instance);
3864 // Calling `markForCheck` to make sure we will run the change detection when the
3865 // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.
3866 enteringView = this.stackCtrl.createView(this.activated, activatedRoute);
3867 // Store references to the proxy by component
3868 this.proxyMap.set(cmpRef.instance, activatedRouteProxy);
3869 this.currentActivatedRoute$.next({ component: cmpRef.instance, activatedRoute });
3870 }
3871 this.activatedView = enteringView;
3872 this.stackCtrl.setActive(enteringView).then((/**
3873 * @param {?} data
3874 * @return {?}
3875 */
3876 data => {
3877 this.navCtrl.setTopOutlet(this);
3878 this.activateEvents.emit(cmpRef.instance);
3879 this.stackEvents.emit(data);
3880 }));
3881 }
3882 /**
3883 * Returns `true` if there are pages in the stack to go back.
3884 * @param {?=} deep
3885 * @param {?=} stackId
3886 * @return {?}
3887 */
3888 canGoBack(deep = 1, stackId) {
3889 return this.stackCtrl.canGoBack(deep, stackId);
3890 }
3891 /**
3892 * Resolves to `true` if it the outlet was able to sucessfully pop the last N pages.
3893 * @param {?=} deep
3894 * @param {?=} stackId
3895 * @return {?}
3896 */
3897 pop(deep = 1, stackId) {
3898 return this.stackCtrl.pop(deep, stackId);
3899 }
3900 /**
3901 * Returns the URL of the active page of each stack.
3902 * @param {?=} stackId
3903 * @return {?}
3904 */
3905 getLastUrl(stackId) {
3906 /** @type {?} */
3907 const active = this.stackCtrl.getLastUrl(stackId);
3908 return active ? active.url : undefined;
3909 }
3910 /**
3911 * Returns the active stack ID. In the context of ion-tabs, it means the active tab.
3912 * @return {?}
3913 */
3914 getActiveStackId() {
3915 return this.stackCtrl.getActiveStackId();
3916 }
3917 /**
3918 * Since the activated route can change over the life time of a component in an ion router outlet, we create
3919 * a proxy so that we can update the values over time as a user navigates back to components already in the stack.
3920 * @private
3921 * @param {?} component$
3922 * @param {?} activatedRoute
3923 * @return {?}
3924 */
3925 createActivatedRouteProxy(component$, activatedRoute) {
3926 /** @type {?} */
3927 const proxy = new ActivatedRoute();
3928 proxy._futureSnapshot = ((/** @type {?} */ (activatedRoute)))._futureSnapshot;
3929 proxy._routerState = ((/** @type {?} */ (activatedRoute)))._routerState;
3930 proxy.snapshot = activatedRoute.snapshot;
3931 proxy.outlet = activatedRoute.outlet;
3932 proxy.component = activatedRoute.component;
3933 // Setup wrappers for the observables so consumers don't have to worry about switching to new observables as the state updates
3934 ((/** @type {?} */ (proxy)))._paramMap = this.proxyObservable(component$, 'paramMap');
3935 ((/** @type {?} */ (proxy)))._queryParamMap = this.proxyObservable(component$, 'queryParamMap');
3936 proxy.url = this.proxyObservable(component$, 'url');
3937 proxy.params = this.proxyObservable(component$, 'params');
3938 proxy.queryParams = this.proxyObservable(component$, 'queryParams');
3939 proxy.fragment = this.proxyObservable(component$, 'fragment');
3940 proxy.data = this.proxyObservable(component$, 'data');
3941 return (/** @type {?} */ (proxy));
3942 }
3943 /**
3944 * Create a wrapped observable that will switch to the latest activated route matched by the given component
3945 * @private
3946 * @param {?} component$
3947 * @param {?} path
3948 * @return {?}
3949 */
3950 proxyObservable(component$, path) {
3951 return component$.pipe(
3952 // First wait until the component instance is pushed
3953 filter((/**
3954 * @param {?} component
3955 * @return {?}
3956 */
3957 component => !!component)), switchMap((/**
3958 * @param {?} component
3959 * @return {?}
3960 */
3961 component => this.currentActivatedRoute$.pipe(filter((/**
3962 * @param {?} current
3963 * @return {?}
3964 */
3965 current => current !== null && current.component === component)), switchMap((/**
3966 * @param {?} current
3967 * @return {?}
3968 */
3969 current => current && ((/** @type {?} */ (current.activatedRoute)))[path])), distinctUntilChanged()))));
3970 }
3971 /**
3972 * Updates the activated route proxy for the given component to the new incoming router state
3973 * @private
3974 * @param {?} component
3975 * @param {?} activatedRoute
3976 * @return {?}
3977 */
3978 updateActivatedRouteProxy(component, activatedRoute) {
3979 /** @type {?} */
3980 const proxy = this.proxyMap.get(component);
3981 if (!proxy) {
3982 throw new Error(`Could not find activated route proxy for view`);
3983 }
3984 ((/** @type {?} */ (proxy)))._futureSnapshot = ((/** @type {?} */ (activatedRoute)))._futureSnapshot;
3985 ((/** @type {?} */ (proxy)))._routerState = ((/** @type {?} */ (activatedRoute)))._routerState;
3986 proxy.snapshot = activatedRoute.snapshot;
3987 proxy.outlet = activatedRoute.outlet;
3988 proxy.component = activatedRoute.component;
3989 this.currentActivatedRoute$.next({ component, activatedRoute });
3990 }
3991}
3992IonRouterOutlet.decorators = [
3993 { type: Directive, args: [{
3994 selector: 'ion-router-outlet',
3995 exportAs: 'outlet',
3996 inputs: ['animated', 'swipeGesture']
3997 },] },
3998];
3999/** @nocollapse */
4000IonRouterOutlet.ctorParameters = () => [
4001 { type: ChildrenOutletContexts },
4002 { type: ViewContainerRef },
4003 { type: ComponentFactoryResolver },
4004 { type: String, decorators: [{ type: Attribute, args: ['name',] }] },
4005 { type: String, decorators: [{ type: Optional }, { type: Attribute, args: ['tabs',] }] },
4006 { type: Config },
4007 { type: NavController },
4008 { type: Location },
4009 { type: ElementRef },
4010 { type: Router },
4011 { type: NgZone },
4012 { type: ActivatedRoute },
4013 { type: IonRouterOutlet, decorators: [{ type: SkipSelf }, { type: Optional }] }
4014];
4015IonRouterOutlet.propDecorators = {
4016 stackEvents: [{ type: Output }],
4017 activateEvents: [{ type: Output, args: ['activate',] }],
4018 deactivateEvents: [{ type: Output, args: ['deactivate',] }]
4019};
4020class OutletInjector {
4021 /**
4022 * @param {?} route
4023 * @param {?} childContexts
4024 * @param {?} parent
4025 */
4026 constructor(route, childContexts, parent) {
4027 this.route = route;
4028 this.childContexts = childContexts;
4029 this.parent = parent;
4030 }
4031 /**
4032 * @param {?} token
4033 * @param {?=} notFoundValue
4034 * @return {?}
4035 */
4036 get(token, notFoundValue) {
4037 if (token === ActivatedRoute) {
4038 return this.route;
4039 }
4040 if (token === ChildrenOutletContexts) {
4041 return this.childContexts;
4042 }
4043 // tslint:disable-next-line
4044 return this.parent.get(token, notFoundValue);
4045 }
4046}
4047
4048/**
4049 * @fileoverview added by tsickle
4050 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4051 */
4052class IonTabs {
4053 /**
4054 * @param {?} navCtrl
4055 */
4056 constructor(navCtrl) {
4057 this.navCtrl = navCtrl;
4058 this.ionTabsWillChange = new EventEmitter();
4059 this.ionTabsDidChange = new EventEmitter();
4060 }
4061 /**
4062 * \@internal
4063 * @param {?} detail
4064 * @return {?}
4065 */
4066 onPageSelected(detail) {
4067 /** @type {?} */
4068 const stackId = detail.enteringView.stackId;
4069 if (detail.tabSwitch && stackId !== undefined) {
4070 if (this.tabBar) {
4071 this.tabBar.selectedTab = stackId;
4072 }
4073 this.ionTabsWillChange.emit({ tab: stackId });
4074 this.ionTabsDidChange.emit({ tab: stackId });
4075 }
4076 }
4077 /**
4078 * @param {?} tab
4079 * @return {?}
4080 */
4081 select(tab) {
4082 /** @type {?} */
4083 const alreadySelected = this.outlet.getActiveStackId() === tab;
4084 /** @type {?} */
4085 const href = `${this.outlet.tabsPrefix}/${tab}`;
4086 /** @type {?} */
4087 const url = alreadySelected
4088 ? href
4089 : this.outlet.getLastUrl(tab) || href;
4090 return this.navCtrl.navigateRoot(url, {
4091 animated: true,
4092 animationDirection: 'back'
4093 });
4094 }
4095 /**
4096 * @return {?}
4097 */
4098 getSelected() {
4099 return this.outlet.getActiveStackId();
4100 }
4101}
4102IonTabs.decorators = [
4103 { type: Component, args: [{
4104 selector: 'ion-tabs',
4105 template: `
4106 <ng-content select="[slot=top]"></ng-content>
4107 <div class="tabs-inner">
4108 <ion-router-outlet #outlet tabs="true" (stackEvents)="onPageSelected($event)"></ion-router-outlet>
4109 </div>
4110 <ng-content></ng-content>`,
4111 styles: [`
4112 :host {
4113 display: flex;
4114 position: absolute;
4115 top: 0;
4116 left: 0;
4117 right: 0;
4118 bottom: 0;
4119
4120 flex-direction: column;
4121
4122 width: 100%;
4123 height: 100%;
4124
4125 contain: layout size style;
4126 z-index: $z-index-page-container;
4127 }
4128 .tabs-inner {
4129 position: relative;
4130
4131 flex: 1;
4132
4133 contain: layout size style;
4134 }`
4135 ]
4136 },] },
4137];
4138/** @nocollapse */
4139IonTabs.ctorParameters = () => [
4140 { type: NavController }
4141];
4142IonTabs.propDecorators = {
4143 outlet: [{ type: ViewChild, args: ['outlet', { read: IonRouterOutlet },] }],
4144 tabBar: [{ type: ContentChild, args: [IonTabBar,] }],
4145 ionTabsWillChange: [{ type: Output }],
4146 ionTabsDidChange: [{ type: Output }],
4147 select: [{ type: HostListener, args: ['ionTabButtonClick', ['$event.detail.tab'],] }]
4148};
4149
4150/**
4151 * @fileoverview added by tsickle
4152 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4153 */
4154class IonBackButtonDelegate {
4155 /**
4156 * @param {?} routerOutlet
4157 * @param {?} navCtrl
4158 */
4159 constructor(routerOutlet, navCtrl) {
4160 this.routerOutlet = routerOutlet;
4161 this.navCtrl = navCtrl;
4162 }
4163 /**
4164 * \@internal
4165 * @param {?} ev
4166 * @return {?}
4167 */
4168 onClick(ev) {
4169 if (this.routerOutlet && this.routerOutlet.canGoBack()) {
4170 this.routerOutlet.pop();
4171 ev.preventDefault();
4172 }
4173 else if (this.defaultHref != null) {
4174 this.navCtrl.navigateBack(this.defaultHref);
4175 ev.preventDefault();
4176 }
4177 }
4178}
4179IonBackButtonDelegate.decorators = [
4180 { type: Directive, args: [{
4181 selector: 'ion-back-button',
4182 inputs: ['defaultHref']
4183 },] },
4184];
4185/** @nocollapse */
4186IonBackButtonDelegate.ctorParameters = () => [
4187 { type: IonRouterOutlet, decorators: [{ type: Optional }] },
4188 { type: NavController }
4189];
4190IonBackButtonDelegate.propDecorators = {
4191 onClick: [{ type: HostListener, args: ['click', ['$event'],] }]
4192};
4193
4194/**
4195 * @fileoverview added by tsickle
4196 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4197 */
4198class NavDelegate {
4199 /**
4200 * @param {?} ref
4201 * @param {?} resolver
4202 * @param {?} injector
4203 * @param {?} angularDelegate
4204 * @param {?} location
4205 */
4206 constructor(ref, resolver, injector, angularDelegate, location) {
4207 ref.nativeElement.delegate = angularDelegate.create(resolver, injector, location);
4208 }
4209}
4210NavDelegate.decorators = [
4211 { type: Directive, args: [{
4212 selector: 'ion-nav',
4213 },] },
4214];
4215/** @nocollapse */
4216NavDelegate.ctorParameters = () => [
4217 { type: ElementRef },
4218 { type: ComponentFactoryResolver },
4219 { type: Injector },
4220 { type: AngularDelegate },
4221 { type: ViewContainerRef }
4222];
4223
4224/**
4225 * @fileoverview added by tsickle
4226 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4227 */
4228class RouterLinkDelegate {
4229 /**
4230 * @param {?} locationStrategy
4231 * @param {?} navCtrl
4232 * @param {?} elementRef
4233 * @param {?} router
4234 * @param {?=} routerLink
4235 */
4236 constructor(locationStrategy, navCtrl, elementRef, router, routerLink) {
4237 this.locationStrategy = locationStrategy;
4238 this.navCtrl = navCtrl;
4239 this.elementRef = elementRef;
4240 this.router = router;
4241 this.routerLink = routerLink;
4242 this.routerDirection = 'forward';
4243 }
4244 /**
4245 * @return {?}
4246 */
4247 ngOnInit() {
4248 this.updateTargetUrlAndHref();
4249 }
4250 /**
4251 * @return {?}
4252 */
4253 ngOnChanges() {
4254 this.updateTargetUrlAndHref();
4255 }
4256 /**
4257 * @return {?}
4258 */
4259 ngOnDestroy() {
4260 if (this.subscription) {
4261 this.subscription.unsubscribe();
4262 }
4263 }
4264 /**
4265 * @private
4266 * @return {?}
4267 */
4268 updateTargetUrlAndHref() {
4269 if (this.routerLink) {
4270 /** @type {?} */
4271 const href = this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.routerLink.urlTree));
4272 this.elementRef.nativeElement.href = href;
4273 }
4274 }
4275 /**
4276 * \@internal
4277 * @param {?} ev
4278 * @return {?}
4279 */
4280 onClick(ev) {
4281 this.navCtrl.setDirection(this.routerDirection);
4282 ev.preventDefault();
4283 }
4284}
4285RouterLinkDelegate.decorators = [
4286 { type: Directive, args: [{
4287 selector: '[routerLink]',
4288 inputs: ['routerDirection']
4289 },] },
4290];
4291/** @nocollapse */
4292RouterLinkDelegate.ctorParameters = () => [
4293 { type: LocationStrategy },
4294 { type: NavController },
4295 { type: ElementRef },
4296 { type: Router },
4297 { type: RouterLink, decorators: [{ type: Optional }] }
4298];
4299RouterLinkDelegate.propDecorators = {
4300 onClick: [{ type: HostListener, args: ['click', ['$event'],] }]
4301};
4302
4303/**
4304 * @fileoverview added by tsickle
4305 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4306 */
4307/**
4308 * @hidden
4309 */
4310class VirtualFooter {
4311 /**
4312 * @param {?} templateRef
4313 */
4314 constructor(templateRef) {
4315 this.templateRef = templateRef;
4316 }
4317}
4318VirtualFooter.decorators = [
4319 { type: Directive, args: [{ selector: '[virtualFooter]' },] },
4320];
4321/** @nocollapse */
4322VirtualFooter.ctorParameters = () => [
4323 { type: TemplateRef }
4324];
4325
4326/**
4327 * @fileoverview added by tsickle
4328 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4329 */
4330/**
4331 * @hidden
4332 */
4333class VirtualHeader {
4334 /**
4335 * @param {?} templateRef
4336 */
4337 constructor(templateRef) {
4338 this.templateRef = templateRef;
4339 }
4340}
4341VirtualHeader.decorators = [
4342 { type: Directive, args: [{ selector: '[virtualHeader]' },] },
4343];
4344/** @nocollapse */
4345VirtualHeader.ctorParameters = () => [
4346 { type: TemplateRef }
4347];
4348
4349/**
4350 * @fileoverview added by tsickle
4351 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4352 */
4353/**
4354 * @hidden
4355 */
4356class VirtualItem {
4357 /**
4358 * @param {?} templateRef
4359 * @param {?} viewContainer
4360 */
4361 constructor(templateRef, viewContainer) {
4362 this.templateRef = templateRef;
4363 this.viewContainer = viewContainer;
4364 }
4365}
4366VirtualItem.decorators = [
4367 { type: Directive, args: [{ selector: '[virtualItem]' },] },
4368];
4369/** @nocollapse */
4370VirtualItem.ctorParameters = () => [
4371 { type: TemplateRef },
4372 { type: ViewContainerRef }
4373];
4374
4375/**
4376 * @fileoverview added by tsickle
4377 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4378 */
4379class IonVirtualScroll {
4380 /**
4381 * @param {?} z
4382 * @param {?} iterableDiffers
4383 * @param {?} elementRef
4384 */
4385 constructor(z, iterableDiffers, elementRef) {
4386 this.z = z;
4387 this.iterableDiffers = iterableDiffers;
4388 this.refMap = new WeakMap();
4389 this.el = (/** @type {?} */ (elementRef.nativeElement));
4390 this.el.nodeRender = this.nodeRender.bind(this);
4391 }
4392 /**
4393 * @param {?} changes
4394 * @return {?}
4395 */
4396 ngOnChanges(changes) {
4397 if (this.trackBy && 'items' in changes) {
4398 // React on virtualScroll changes only once all inputs have been initialized
4399 /** @type {?} */
4400 const value = changes['items'].currentValue;
4401 if (this.differ === undefined && value != null) {
4402 try {
4403 this.differ = this.iterableDiffers.find(value).create(this.trackBy);
4404 }
4405 catch (e) {
4406 throw new Error(`Cannot find a differ supporting object '${value}'. VirtualScroll only supports binding to Iterables such as Arrays.`);
4407 }
4408 }
4409 }
4410 }
4411 /**
4412 * @return {?}
4413 */
4414 ngDoCheck() {
4415 // and if there actually are changes
4416 /** @type {?} */
4417 const changes = this.differ !== undefined && this.items ? this.differ.diff(this.items) : null;
4418 if (changes === null) {
4419 return;
4420 }
4421 // TODO: optimize
4422 this.checkRange(0);
4423 }
4424 /**
4425 * @private
4426 * @param {?} el
4427 * @param {?} cell
4428 * @param {?} index
4429 * @return {?}
4430 */
4431 nodeRender(el, cell, index) {
4432 return this.z.run((/**
4433 * @return {?}
4434 */
4435 () => {
4436 /** @type {?} */
4437 let node;
4438 if (!el) {
4439 node = this.itmTmp.viewContainer.createEmbeddedView(this.getComponent(cell.type), { $implicit: cell.value, index }, index);
4440 el = getElement(node);
4441 this.refMap.set(el, node);
4442 }
4443 else {
4444 node = (/** @type {?} */ (this.refMap.get(el)));
4445 /** @type {?} */
4446 const ctx = node.context;
4447 ctx.$implicit = cell.value;
4448 ctx.index = cell.index;
4449 }
4450 // run sync change detections
4451 node.detectChanges();
4452 return el;
4453 }));
4454 }
4455 /**
4456 * @private
4457 * @param {?} type
4458 * @return {?}
4459 */
4460 getComponent(type) {
4461 switch (type) {
4462 case 'item': return this.itmTmp.templateRef;
4463 case 'header': return this.hdrTmp.templateRef;
4464 case 'footer': return this.ftrTmp.templateRef;
4465 }
4466 throw new Error('template for virtual item was not provided');
4467 }
4468}
4469IonVirtualScroll.decorators = [
4470 { type: Component, args: [{
4471 selector: 'ion-virtual-scroll',
4472 template: '<ng-content></ng-content>',
4473 changeDetection: ChangeDetectionStrategy.OnPush,
4474 inputs: [
4475 'approxItemHeight',
4476 'approxHeaderHeight',
4477 'approxFooterHeight',
4478 'headerFn',
4479 'footerFn',
4480 'items',
4481 'itemHeight',
4482 'headerHeight',
4483 'footerHeight',
4484 'trackBy'
4485 ]
4486 },] },
4487];
4488/** @nocollapse */
4489IonVirtualScroll.ctorParameters = () => [
4490 { type: NgZone },
4491 { type: IterableDiffers },
4492 { type: ElementRef }
4493];
4494IonVirtualScroll.propDecorators = {
4495 itmTmp: [{ type: ContentChild, args: [VirtualItem,] }],
4496 hdrTmp: [{ type: ContentChild, args: [VirtualHeader,] }],
4497 ftrTmp: [{ type: ContentChild, args: [VirtualFooter,] }]
4498};
4499/** @type {?} */
4500const getElement = (/**
4501 * @param {?} view
4502 * @return {?}
4503 */
4504(view) => {
4505 /** @type {?} */
4506 const rootNodes = view.rootNodes;
4507 for (let i = 0; i < rootNodes.length; i++) {
4508 if (rootNodes[i].nodeType === 1) {
4509 return rootNodes[i];
4510 }
4511 }
4512 throw new Error('virtual element was not created');
4513});
4514proxyInputs(IonVirtualScroll, [
4515 'approxItemHeight',
4516 'approxHeaderHeight',
4517 'approxFooterHeight',
4518 'headerFn',
4519 'footerFn',
4520 'items',
4521 'itemHeight',
4522 'headerHeight',
4523 'footerHeight'
4524]);
4525proxyMethods(IonVirtualScroll, [
4526 'checkEnd',
4527 'checkRange',
4528 'positionForItem'
4529]);
4530
4531/**
4532 * @fileoverview added by tsickle
4533 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4534 */
4535class CssUtilsDeprecations {
4536 /**
4537 * @param {?} ref
4538 */
4539 constructor(ref) {
4540 /** @type {?} */
4541 const el = ((/** @type {?} */ (ref.nativeElement)));
4542 /** @type {?} */
4543 const attributes = Array.from(el.attributes)
4544 .map((/**
4545 * @param {?} a
4546 * @return {?}
4547 */
4548 a => a.name))
4549 .filter((/**
4550 * @param {?} n
4551 * @return {?}
4552 */
4553 n => DEPRECATED_ATTRIBUTES.includes(n)));
4554 if (attributes.length > 0) {
4555 console.warn(`[DEPRECATED][CSS] Ionic CSS attributes are deprecated.
4556Replace:
4557'<${el.tagName.toLowerCase()} ${attributes.map((/**
4558 * @param {?} n
4559 * @return {?}
4560 */
4561 n => `${n}`)).join(' ')}>'
4562
4563With:
4564'<${el.tagName.toLowerCase()} class="${attributes.map((/**
4565 * @param {?} n
4566 * @return {?}
4567 */
4568 n => `ion-${n}`)).join(' ')}">'
4569 `);
4570 }
4571 }
4572}
4573CssUtilsDeprecations.decorators = [
4574 { type: Directive, args: [{
4575 selector: '[align-self-start], [align-self-end], [align-self-center], [align-self-stretch], [align-self-baseline], [align-self-auto], [wrap-reverse], [justify-content-start], [justify-content-center], [justify-content-end], [justify-content-around], [justify-content-between], [justify-content-evenly], [align-items-start], [align-items-center], [align-items-end], [align-items-stretch], [align-items-baseline], [float-left], [float-right], [float-start], [float-end], [float-sm-left], [float-sm-right], [float-sm-start], [float-sm-end], [float-md-left], [float-md-right], [float-md-start], [float-md-end], [float-lg-left], [float-lg-right], [float-lg-start], [float-lg-end], [float-xl-left], [float-xl-right], [float-xl-start], [float-xl-end], [text-center], [text-justify], [text-start], [text-end], [text-left], [text-right], [text-nowrap], [text-wrap], [text-sm-center], [text-sm-justify], [text-sm-start], [text-sm-end], [text-sm-left], [text-sm-right], [text-sm-nowrap], [text-sm-wrap], [text-md-center], [text-md-justify], [text-md-start], [text-md-end], [text-md-left], [text-md-right], [text-md-nowrap], [text-md-wrap], [text-lg-center], [text-lg-justify], [text-lg-start], [text-lg-end], [text-lg-left], [text-lg-right], [text-lg-nowrap], [text-lg-wrap], [text-xl-center], [text-xl-justify], [text-xl-start], [text-xl-end], [text-xl-left], [text-xl-right], [text-xl-nowrap], [text-xl-wrap], [text-uppercase], [text-lowercase], [text-capitalize], [text-sm-uppercase], [text-sm-lowercase], [text-sm-capitalize], [text-md-uppercase], [text-md-lowercase], [text-md-capitalize], [text-lg-uppercase], [text-lg-lowercase], [text-lg-capitalize], [text-xl-uppercase], [text-xl-lowercase], [text-xl-capitalize], [no-padding], [padding], [padding-top], [padding-bottom], [padding-start], [padding-end], [padding-vertical], [padding-horizontal], [no-margin], [margin], [margin-top], [margin-bottom], [margin-start], [margin-end], [margin-vertical], [margin-horizontal]',
4576 },] },
4577];
4578/** @nocollapse */
4579CssUtilsDeprecations.ctorParameters = () => [
4580 { type: ElementRef }
4581];
4582/** @type {?} */
4583const DEPRECATED_ATTRIBUTES = [
4584 'align-self-start',
4585 'align-self-end',
4586 'align-self-center',
4587 'align-self-stretch',
4588 'align-self-baseline',
4589 'align-self-auto',
4590 'wrap-reverse',
4591 'justify-content-start',
4592 'justify-content-center',
4593 'justify-content-end',
4594 'justify-content-around',
4595 'justify-content-between',
4596 'justify-content-evenly',
4597 'align-items-start',
4598 'align-items-center',
4599 'align-items-end',
4600 'align-items-stretch',
4601 'align-items-baseline',
4602 'float-left',
4603 'float-right',
4604 'float-start',
4605 'float-end',
4606 'float-sm-left',
4607 'float-sm-right',
4608 'float-sm-start',
4609 'float-sm-end',
4610 'float-md-left',
4611 'float-md-right',
4612 'float-md-start',
4613 'float-md-end',
4614 'float-lg-left',
4615 'float-lg-right',
4616 'float-lg-start',
4617 'float-lg-end',
4618 'float-xl-left',
4619 'float-xl-right',
4620 'float-xl-start',
4621 'float-xl-end',
4622 'text-center',
4623 'text-justify',
4624 'text-start',
4625 'text-end',
4626 'text-left',
4627 'text-right',
4628 'text-nowrap',
4629 'text-wrap',
4630 'text-sm-center',
4631 'text-sm-justify',
4632 'text-sm-start',
4633 'text-sm-end',
4634 'text-sm-left',
4635 'text-sm-right',
4636 'text-sm-nowrap',
4637 'text-sm-wrap',
4638 'text-md-center',
4639 'text-md-justify',
4640 'text-md-start',
4641 'text-md-end',
4642 'text-md-left',
4643 'text-md-right',
4644 'text-md-nowrap',
4645 'text-md-wrap',
4646 'text-lg-center',
4647 'text-lg-justify',
4648 'text-lg-start',
4649 'text-lg-end',
4650 'text-lg-left',
4651 'text-lg-right',
4652 'text-lg-nowrap',
4653 'text-lg-wrap',
4654 'text-xl-center',
4655 'text-xl-justify',
4656 'text-xl-start',
4657 'text-xl-end',
4658 'text-xl-left',
4659 'text-xl-right',
4660 'text-xl-nowrap',
4661 'text-xl-wrap',
4662 'text-uppercase',
4663 'text-lowercase',
4664 'text-capitalize',
4665 'text-sm-uppercase',
4666 'text-sm-lowercase',
4667 'text-sm-capitalize',
4668 'text-md-uppercase',
4669 'text-md-lowercase',
4670 'text-md-capitalize',
4671 'text-lg-uppercase',
4672 'text-lg-lowercase',
4673 'text-lg-capitalize',
4674 'text-xl-uppercase',
4675 'text-xl-lowercase',
4676 'text-xl-capitalize',
4677 'no-padding',
4678 'padding',
4679 'padding-top',
4680 'padding-bottom',
4681 'padding-start',
4682 'padding-end',
4683 'padding-vertical',
4684 'padding-horizontal',
4685 'no-margin',
4686 'margin',
4687 'margin-top',
4688 'margin-bottom',
4689 'margin-start',
4690 'margin-end',
4691 'margin-vertical',
4692 'margin-horizontal'
4693];
4694
4695/**
4696 * @fileoverview added by tsickle
4697 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4698 */
4699/**
4700 * @template Opts, Overlay
4701 */
4702class OverlayBaseController {
4703 /**
4704 * @param {?} ctrl
4705 */
4706 constructor(ctrl) {
4707 this.ctrl = ctrl;
4708 }
4709 /**
4710 * Creates a new overlay
4711 * @param {?=} opts
4712 * @return {?}
4713 */
4714 create(opts) {
4715 // TODO: next major release opts is not optional
4716 return this.ctrl.create((/** @type {?} */ ((opts || {}))));
4717 }
4718 /**
4719 * When `id` is not provided, it dismisses the top overlay.
4720 * @param {?=} data
4721 * @param {?=} role
4722 * @param {?=} id
4723 * @return {?}
4724 */
4725 dismiss(data, role, id) {
4726 return this.ctrl.dismiss(data, role, id);
4727 }
4728 /**
4729 * Returns the top overlay.
4730 * @return {?}
4731 */
4732 getTop() {
4733 return this.ctrl.getTop();
4734 }
4735}
4736
4737/**
4738 * @fileoverview added by tsickle
4739 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4740 */
4741class ActionSheetController extends OverlayBaseController {
4742 constructor() {
4743 super(actionSheetController);
4744 }
4745}
4746ActionSheetController.decorators = [
4747 { type: Injectable, args: [{
4748 providedIn: 'root',
4749 },] },
4750];
4751/** @nocollapse */
4752ActionSheetController.ctorParameters = () => [];
4753/** @nocollapse */ ActionSheetController.ngInjectableDef = defineInjectable({ factory: function ActionSheetController_Factory() { return new ActionSheetController(); }, token: ActionSheetController, providedIn: "root" });
4754
4755/**
4756 * @fileoverview added by tsickle
4757 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4758 */
4759class AlertController extends OverlayBaseController {
4760 constructor() {
4761 super(alertController);
4762 }
4763}
4764AlertController.decorators = [
4765 { type: Injectable, args: [{
4766 providedIn: 'root',
4767 },] },
4768];
4769/** @nocollapse */
4770AlertController.ctorParameters = () => [];
4771/** @nocollapse */ AlertController.ngInjectableDef = defineInjectable({ factory: function AlertController_Factory() { return new AlertController(); }, token: AlertController, providedIn: "root" });
4772
4773/**
4774 * @fileoverview added by tsickle
4775 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4776 */
4777class Events {
4778 constructor() {
4779 this.c = new Map();
4780 console.warn(`[DEPRECATION][Events]: The Events provider is deprecated and it will be removed in the next major release.
4781 - Use "Observables" for a similar pub/sub architecture: https://angular.io/guide/observables
4782 - Use "Redux" for advanced state management: https://ngrx.io`);
4783 }
4784 /**
4785 * Subscribe to an event topic. Events that get posted to that topic will trigger the provided handler.
4786 *
4787 * @param {?} topic the topic to subscribe to
4788 * @param {...?} handlers
4789 * @return {?}
4790 */
4791 subscribe(topic, ...handlers) {
4792 /** @type {?} */
4793 let topics = this.c.get(topic);
4794 if (!topics) {
4795 this.c.set(topic, topics = []);
4796 }
4797 topics.push(...handlers);
4798 }
4799 /**
4800 * Unsubscribe from the given topic. Your handler will no longer receive events published to this topic.
4801 *
4802 * @param {?} topic the topic to unsubscribe from
4803 * @param {?=} handler the event handler
4804 *
4805 * @return {?} true if a handler was removed
4806 */
4807 unsubscribe(topic, handler) {
4808 if (!handler) {
4809 return this.c.delete(topic);
4810 }
4811 /** @type {?} */
4812 const topics = this.c.get(topic);
4813 if (!topics) {
4814 return false;
4815 }
4816 // We need to find and remove a specific handler
4817 /** @type {?} */
4818 const index = topics.indexOf(handler);
4819 if (index < 0) {
4820 // Wasn't found, wasn't removed
4821 return false;
4822 }
4823 topics.splice(index, 1);
4824 if (topics.length === 0) {
4825 this.c.delete(topic);
4826 }
4827 return true;
4828 }
4829 /**
4830 * Publish an event to the given topic.
4831 *
4832 * @param {?} topic the topic to publish to
4833 * @param {...?} args
4834 * @return {?}
4835 */
4836 publish(topic, ...args) {
4837 /** @type {?} */
4838 const topics = this.c.get(topic);
4839 if (!topics) {
4840 return null;
4841 }
4842 return topics.map((/**
4843 * @param {?} handler
4844 * @return {?}
4845 */
4846 handler => {
4847 try {
4848 return handler(...args);
4849 }
4850 catch (e) {
4851 console.error(e);
4852 return null;
4853 }
4854 }));
4855 }
4856}
4857Events.decorators = [
4858 { type: Injectable, args: [{
4859 providedIn: 'root',
4860 },] },
4861];
4862/** @nocollapse */
4863Events.ctorParameters = () => [];
4864/** @nocollapse */ Events.ngInjectableDef = defineInjectable({ factory: function Events_Factory() { return new Events(); }, token: Events, providedIn: "root" });
4865
4866/**
4867 * @fileoverview added by tsickle
4868 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4869 */
4870class LoadingController extends OverlayBaseController {
4871 constructor() {
4872 super(loadingController);
4873 }
4874}
4875LoadingController.decorators = [
4876 { type: Injectable, args: [{
4877 providedIn: 'root',
4878 },] },
4879];
4880/** @nocollapse */
4881LoadingController.ctorParameters = () => [];
4882/** @nocollapse */ LoadingController.ngInjectableDef = defineInjectable({ factory: function LoadingController_Factory() { return new LoadingController(); }, token: LoadingController, providedIn: "root" });
4883
4884/**
4885 * @fileoverview added by tsickle
4886 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4887 */
4888class MenuController {
4889 /**
4890 * Programmatically open the Menu.
4891 * @param {?=} menuId
4892 * @return {?} returns a promise when the menu is fully opened
4893 */
4894 open(menuId) {
4895 return menuController.open(menuId);
4896 }
4897 /**
4898 * Programmatically close the Menu. If no `menuId` is given as the first
4899 * argument then it'll close any menu which is open. If a `menuId`
4900 * is given then it'll close that exact menu.
4901 * @param {?=} menuId
4902 * @return {?} returns a promise when the menu is fully closed
4903 */
4904 close(menuId) {
4905 return menuController.close(menuId);
4906 }
4907 /**
4908 * Toggle the menu. If it's closed, it will open, and if opened, it
4909 * will close.
4910 * @param {?=} menuId
4911 * @return {?} returns a promise when the menu has been toggled
4912 */
4913 toggle(menuId) {
4914 return menuController.toggle(menuId);
4915 }
4916 /**
4917 * Used to enable or disable a menu. For example, there could be multiple
4918 * left menus, but only one of them should be able to be opened at the same
4919 * time. If there are multiple menus on the same side, then enabling one menu
4920 * will also automatically disable all the others that are on the same side.
4921 * @param {?} shouldEnable
4922 * @param {?=} menuId
4923 * @return {?} Returns the instance of the menu, which is useful for chaining.
4924 */
4925 enable(shouldEnable, menuId) {
4926 return menuController.enable(shouldEnable, menuId);
4927 }
4928 /**
4929 * Used to enable or disable the ability to swipe open the menu.
4930 * @deprecated Use swipeGesture() instead.
4931 * @param {?} shouldEnable True if it should be swipe-able, false if not.
4932 * @param {?=} menuId
4933 * @return {?} Returns the instance of the menu, which is useful for chaining.
4934 */
4935 swipeEnable(shouldEnable, menuId) {
4936 console.warn('[DEPRECATED][ion-menu-controller] swipeEnable() is deprecated. Use MenuController.swipeGesture() instead');
4937 return this.swipeGesture(shouldEnable, menuId);
4938 }
4939 /**
4940 * Used to enable or disable the ability to swipe open the menu.
4941 * @param {?} shouldEnable True if it should be swipe-able, false if not.
4942 * @param {?=} menuId
4943 * @return {?} Returns the instance of the menu, which is useful for chaining.
4944 */
4945 swipeGesture(shouldEnable, menuId) {
4946 return menuController.swipeGesture(shouldEnable, menuId);
4947 }
4948 /**
4949 * @param {?=} menuId
4950 * @return {?} Returns true if the specified menu is currently open, otherwise false.
4951 * If the menuId is not specified, it returns true if ANY menu is currenly open.
4952 */
4953 isOpen(menuId) {
4954 return menuController.isOpen(menuId);
4955 }
4956 /**
4957 * @param {?=} menuId
4958 * @return {?} Returns true if the menu is currently enabled, otherwise false.
4959 */
4960 isEnabled(menuId) {
4961 return menuController.isEnabled(menuId);
4962 }
4963 /**
4964 * Used to get a menu instance. If a `menuId` is not provided then it'll
4965 * return the first menu found. If a `menuId` is `left` or `right`, then
4966 * it'll return the enabled menu on that side. Otherwise, if a `menuId` is
4967 * provided, then it'll try to find the menu using the menu's `id`
4968 * property. If a menu is not found then it'll return `null`.
4969 * @param {?=} menuId
4970 * @return {?} Returns the instance of the menu if found, otherwise `null`.
4971 */
4972 get(menuId) {
4973 return menuController.get(menuId);
4974 }
4975 /**
4976 * @return {?} Returns the instance of the menu already opened, otherwise `null`.
4977 */
4978 getOpen() {
4979 return menuController.getOpen();
4980 }
4981 /**
4982 * @return {?} Returns an array of all menu instances.
4983 */
4984 getMenus() {
4985 return menuController.getMenus();
4986 }
4987}
4988MenuController.decorators = [
4989 { type: Injectable, args: [{
4990 providedIn: 'root',
4991 },] },
4992];
4993/** @nocollapse */ MenuController.ngInjectableDef = defineInjectable({ factory: function MenuController_Factory() { return new MenuController(); }, token: MenuController, providedIn: "root" });
4994
4995/**
4996 * @fileoverview added by tsickle
4997 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4998 */
4999class PickerController extends OverlayBaseController {
5000 constructor() {
5001 super(pickerController);
5002 }
5003}
5004PickerController.decorators = [
5005 { type: Injectable, args: [{
5006 providedIn: 'root',
5007 },] },
5008];
5009/** @nocollapse */
5010PickerController.ctorParameters = () => [];
5011/** @nocollapse */ PickerController.ngInjectableDef = defineInjectable({ factory: function PickerController_Factory() { return new PickerController(); }, token: PickerController, providedIn: "root" });
5012
5013/**
5014 * @fileoverview added by tsickle
5015 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5016 */
5017class ModalController extends OverlayBaseController {
5018 /**
5019 * @param {?} angularDelegate
5020 * @param {?} resolver
5021 * @param {?} injector
5022 */
5023 constructor(angularDelegate, resolver, injector) {
5024 super(modalController);
5025 this.angularDelegate = angularDelegate;
5026 this.resolver = resolver;
5027 this.injector = injector;
5028 }
5029 /**
5030 * @param {?} opts
5031 * @return {?}
5032 */
5033 create(opts) {
5034 return super.create(Object.assign({}, opts, { delegate: this.angularDelegate.create(this.resolver, this.injector) }));
5035 }
5036}
5037ModalController.decorators = [
5038 { type: Injectable },
5039];
5040/** @nocollapse */
5041ModalController.ctorParameters = () => [
5042 { type: AngularDelegate },
5043 { type: ComponentFactoryResolver },
5044 { type: Injector }
5045];
5046
5047/**
5048 * @fileoverview added by tsickle
5049 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5050 */
5051class PopoverController extends OverlayBaseController {
5052 /**
5053 * @param {?} angularDelegate
5054 * @param {?} resolver
5055 * @param {?} injector
5056 */
5057 constructor(angularDelegate, resolver, injector) {
5058 super(popoverController);
5059 this.angularDelegate = angularDelegate;
5060 this.resolver = resolver;
5061 this.injector = injector;
5062 }
5063 /**
5064 * @param {?} opts
5065 * @return {?}
5066 */
5067 create(opts) {
5068 return super.create(Object.assign({}, opts, { delegate: this.angularDelegate.create(this.resolver, this.injector) }));
5069 }
5070}
5071PopoverController.decorators = [
5072 { type: Injectable },
5073];
5074/** @nocollapse */
5075PopoverController.ctorParameters = () => [
5076 { type: AngularDelegate },
5077 { type: ComponentFactoryResolver },
5078 { type: Injector }
5079];
5080
5081/**
5082 * @fileoverview added by tsickle
5083 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5084 */
5085class ToastController extends OverlayBaseController {
5086 constructor() {
5087 super(toastController);
5088 }
5089}
5090ToastController.decorators = [
5091 { type: Injectable, args: [{
5092 providedIn: 'root',
5093 },] },
5094];
5095/** @nocollapse */
5096ToastController.ctorParameters = () => [];
5097/** @nocollapse */ ToastController.ngInjectableDef = defineInjectable({ factory: function ToastController_Factory() { return new ToastController(); }, token: ToastController, providedIn: "root" });
5098
5099/**
5100 * @fileoverview added by tsickle
5101 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5102 */
5103class DomController {
5104 /**
5105 * Schedules a task to run during the READ phase of the next frame.
5106 * This task should only read the DOM, but never modify it.
5107 * @param {?} cb
5108 * @return {?}
5109 */
5110 read(cb) {
5111 getQueue().read(cb);
5112 }
5113 /**
5114 * Schedules a task to run during the WRITE phase of the next frame.
5115 * This task should write the DOM, but never READ it.
5116 * @param {?} cb
5117 * @return {?}
5118 */
5119 write(cb) {
5120 getQueue().write(cb);
5121 }
5122}
5123DomController.decorators = [
5124 { type: Injectable, args: [{
5125 providedIn: 'root',
5126 },] },
5127];
5128/** @nocollapse */ DomController.ngInjectableDef = defineInjectable({ factory: function DomController_Factory() { return new DomController(); }, token: DomController, providedIn: "root" });
5129/** @type {?} */
5130const getQueue = (/**
5131 * @return {?}
5132 */
5133() => {
5134 /** @type {?} */
5135 const win = typeof ((/** @type {?} */ (window))) !== 'undefined' ? window : (/** @type {?} */ (null));
5136 if (win != null) {
5137 /** @type {?} */
5138 const Ionic = win.Ionic;
5139 if (Ionic && Ionic.queue) {
5140 return Ionic.queue;
5141 }
5142 return {
5143 read: (/**
5144 * @param {?} cb
5145 * @return {?}
5146 */
5147 (cb) => win.requestAnimationFrame(cb)),
5148 write: (/**
5149 * @param {?} cb
5150 * @return {?}
5151 */
5152 (cb) => win.requestAnimationFrame(cb))
5153 };
5154 }
5155 return {
5156 read: (/**
5157 * @param {?} cb
5158 * @return {?}
5159 */
5160 (cb) => cb()),
5161 write: (/**
5162 * @param {?} cb
5163 * @return {?}
5164 */
5165 (cb) => cb())
5166 };
5167});
5168
5169/**
5170 * @fileoverview added by tsickle
5171 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5172 */
5173class IonicRouteStrategy {
5174 /**
5175 * @param {?} _route
5176 * @return {?}
5177 */
5178 shouldDetach(_route) {
5179 return false;
5180 }
5181 /**
5182 * @param {?} _route
5183 * @return {?}
5184 */
5185 shouldAttach(_route) {
5186 return false;
5187 }
5188 /**
5189 * @param {?} _route
5190 * @param {?} _detachedTree
5191 * @return {?}
5192 */
5193 store(_route, _detachedTree) {
5194 return;
5195 }
5196 /**
5197 * @param {?} _route
5198 * @return {?}
5199 */
5200 retrieve(_route) {
5201 return null;
5202 }
5203 /**
5204 * @param {?} future
5205 * @param {?} curr
5206 * @return {?}
5207 */
5208 shouldReuseRoute(future, curr) {
5209 if (future.routeConfig !== curr.routeConfig) {
5210 return false;
5211 }
5212 // checking router params
5213 /** @type {?} */
5214 const futureParams = future.params;
5215 /** @type {?} */
5216 const currentParams = curr.params;
5217 /** @type {?} */
5218 const keysA = Object.keys(futureParams);
5219 /** @type {?} */
5220 const keysB = Object.keys(currentParams);
5221 if (keysA.length !== keysB.length) {
5222 return false;
5223 }
5224 // Test for A's keys different from B.
5225 for (const key of keysA) {
5226 if (currentParams[key] !== futureParams[key]) {
5227 return false;
5228 }
5229 }
5230 return true;
5231 }
5232}
5233
5234/**
5235 * @fileoverview added by tsickle
5236 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5237 */
5238/** @type {?} */
5239let didInitialize = false;
5240/** @type {?} */
5241const appInitialize = (/**
5242 * @param {?} config
5243 * @param {?} doc
5244 * @param {?} zone
5245 * @return {?}
5246 */
5247(config, doc, zone) => {
5248 return (/**
5249 * @return {?}
5250 */
5251 () => {
5252 /** @type {?} */
5253 const win = (/** @type {?} */ (doc.defaultView));
5254 if (win) {
5255 if (didInitialize) {
5256 console.warn('Ionic Angular was already initialized. Make sure IonicModule.forRoot() is just called once.');
5257 }
5258 didInitialize = true;
5259 /** @type {?} */
5260 const Ionic = win.Ionic = win.Ionic || {};
5261 Ionic.config = Object.assign({}, config, { _zoneGate: (/**
5262 * @param {?} h
5263 * @return {?}
5264 */
5265 (h) => zone.run(h)) });
5266 /** @type {?} */
5267 const aelFn = '__zone_symbol__addEventListener' in ((/** @type {?} */ (doc.body)))
5268 ? '__zone_symbol__addEventListener'
5269 : 'addEventListener';
5270 return applyPolyfills().then((/**
5271 * @return {?}
5272 */
5273 () => {
5274 return defineCustomElements(win, {
5275 exclude: ['ion-tabs', 'ion-tab'],
5276 syncQueue: true,
5277 raf,
5278 jmp: (/**
5279 * @param {?} h
5280 * @return {?}
5281 */
5282 (h) => zone.runOutsideAngular(h)),
5283 /**
5284 * @param {?} elm
5285 * @param {?} eventName
5286 * @param {?} cb
5287 * @param {?} opts
5288 * @return {?}
5289 */
5290 ael(elm, eventName, cb, opts) {
5291 ((/** @type {?} */ (elm)))[aelFn](eventName, cb, opts);
5292 },
5293 /**
5294 * @param {?} elm
5295 * @param {?} eventName
5296 * @param {?} cb
5297 * @param {?} opts
5298 * @return {?}
5299 */
5300 rel(elm, eventName, cb, opts) {
5301 elm.removeEventListener(eventName, cb, opts);
5302 }
5303 });
5304 }));
5305 }
5306 });
5307});
5308
5309/**
5310 * @fileoverview added by tsickle
5311 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5312 */
5313/** @type {?} */
5314const DECLARATIONS = [
5315 // proxies
5316 IonApp,
5317 IonAvatar,
5318 IonBackButton,
5319 IonBackdrop,
5320 IonBadge,
5321 IonButton,
5322 IonButtons,
5323 IonCard,
5324 IonCardContent,
5325 IonCardHeader,
5326 IonCardSubtitle,
5327 IonCardTitle,
5328 IonCheckbox,
5329 IonChip,
5330 IonCol,
5331 IonContent,
5332 IonDatetime,
5333 IonFab,
5334 IonFabButton,
5335 IonFabList,
5336 IonFooter,
5337 IonGrid,
5338 IonHeader,
5339 IonIcon,
5340 IonImg,
5341 IonInfiniteScroll,
5342 IonInfiniteScrollContent,
5343 IonInput,
5344 IonItem,
5345 IonItemDivider,
5346 IonItemGroup,
5347 IonItemOption,
5348 IonItemOptions,
5349 IonItemSliding,
5350 IonLabel,
5351 IonList,
5352 IonListHeader,
5353 IonMenu,
5354 IonMenuButton,
5355 IonMenuToggle,
5356 IonNav,
5357 IonNavLink,
5358 IonNavPop,
5359 IonNavPush,
5360 IonNavSetRoot,
5361 IonNote,
5362 IonProgressBar,
5363 IonRadio,
5364 IonRadioGroup,
5365 IonRange,
5366 IonRefresher,
5367 IonRefresherContent,
5368 IonReorder,
5369 IonReorderGroup,
5370 IonRippleEffect,
5371 IonRow,
5372 IonSearchbar,
5373 IonSegment,
5374 IonSegmentButton,
5375 IonSelect,
5376 IonSelectOption,
5377 IonSkeletonText,
5378 IonSlide,
5379 IonSlides,
5380 IonSpinner,
5381 IonSplitPane,
5382 IonTabBar,
5383 IonTabButton,
5384 IonText,
5385 IonTextarea,
5386 IonThumbnail,
5387 IonToggle,
5388 IonToolbar,
5389 IonTitle,
5390 IonTabs,
5391 // ngModel accessors
5392 BooleanValueAccessor,
5393 NumericValueAccessor,
5394 RadioValueAccessor,
5395 SelectValueAccessor,
5396 TextValueAccessor,
5397 // navigation
5398 IonRouterOutlet,
5399 IonBackButtonDelegate,
5400 NavDelegate,
5401 RouterLinkDelegate,
5402 // virtual scroll
5403 VirtualFooter,
5404 VirtualHeader,
5405 VirtualItem,
5406 IonVirtualScroll,
5407 // Deprecations
5408 CssUtilsDeprecations
5409];
5410class IonicModule {
5411 /**
5412 * @param {?=} config
5413 * @return {?}
5414 */
5415 static forRoot(config) {
5416 return {
5417 ngModule: IonicModule,
5418 providers: [
5419 {
5420 provide: ConfigToken,
5421 useValue: config
5422 },
5423 {
5424 provide: APP_INITIALIZER,
5425 useFactory: appInitialize,
5426 multi: true,
5427 deps: [
5428 ConfigToken,
5429 DOCUMENT,
5430 NgZone
5431 ]
5432 }
5433 ]
5434 };
5435 }
5436}
5437IonicModule.decorators = [
5438 { type: NgModule, args: [{
5439 declarations: DECLARATIONS,
5440 exports: DECLARATIONS,
5441 providers: [AngularDelegate, ModalController, PopoverController],
5442 imports: [CommonModule]
5443 },] },
5444];
5445
5446export { ActionSheetController, AlertController, AngularDelegate, BooleanValueAccessor, Config, CssUtilsDeprecations, DomController, Events, IonApp, IonAvatar, IonBackButton, IonBackButtonDelegate, IonBackdrop, IonBadge, IonButton, IonButtons, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonCheckbox, IonChip, IonCol, IonContent, IonDatetime, IonFab, IonFabButton, IonFabList, IonFooter, IonGrid, IonHeader, IonIcon, IonImg, IonInfiniteScroll, IonInfiniteScrollContent, IonInput, IonItem, IonItemDivider, IonItemGroup, IonItemOption, IonItemOptions, IonItemSliding, IonLabel, IonList, IonListHeader, IonMenu, IonMenuButton, IonMenuToggle, IonNav, IonNavLink, IonNavPop, IonNavPush, IonNavSetRoot, IonNote, IonProgressBar, IonRadio, IonRadioGroup, IonRange, IonRefresher, IonRefresherContent, IonReorder, IonReorderGroup, IonRippleEffect, IonRouterOutlet, IonRow, IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption, IonSkeletonText, IonSlide, IonSlides, IonSpinner, IonSplitPane, IonTabBar, IonTabButton, IonTabs, IonText, IonTextarea, IonThumbnail, IonTitle, IonToggle, IonToolbar, IonVirtualScroll, IonicModule, IonicRouteStrategy, LoadingController, MenuController, ModalController, NavController, NavDelegate, NavParams, NumericValueAccessor, PickerController, Platform, PopoverController, RadioValueAccessor, RouterLinkDelegate, SelectValueAccessor, TextValueAccessor, ToastController, VirtualFooter, VirtualHeader, VirtualItem, ConfigToken as ɵa, ValueAccessor as ɵb, OverlayBaseController as ɵd, appInitialize as ɵe };