123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*!
- * (C) Ionic http://ionicframework.com - MIT License
- */
- import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
- import { p as printIonError } from './index4.js';
- const tabsCss = ":host{left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%;contain:layout size style;z-index:0}.tabs-inner{position:relative;-ms-flex:1;flex:1;contain:layout size style}";
- const IonTabsStyle0 = tabsCss;
- const Tabs = /*@__PURE__*/ proxyCustomElement(class Tabs extends HTMLElement {
- constructor() {
- super();
- this.__registerHost();
- this.__attachShadow();
- this.ionNavWillLoad = createEvent(this, "ionNavWillLoad", 7);
- this.ionTabsWillChange = createEvent(this, "ionTabsWillChange", 3);
- this.ionTabsDidChange = createEvent(this, "ionTabsDidChange", 3);
- this.transitioning = false;
- this.onTabClicked = (ev) => {
- const { href, tab } = ev.detail;
- if (this.useRouter && href !== undefined) {
- const router = document.querySelector('ion-router');
- if (router) {
- router.push(href);
- }
- }
- else {
- this.select(tab);
- }
- };
- this.selectedTab = undefined;
- this.useRouter = false;
- }
- async componentWillLoad() {
- if (!this.useRouter) {
- /**
- * JavaScript and StencilJS use `ion-router`, while
- * the other frameworks use `ion-router-outlet`.
- *
- * If either component is present then tabs will not use
- * a basic tab-based navigation. It will use the history
- * stack or URL updates associated with the router.
- */
- this.useRouter =
- (!!this.el.querySelector('ion-router-outlet') || !!document.querySelector('ion-router')) &&
- !this.el.closest('[no-router]');
- }
- if (!this.useRouter) {
- const tabs = this.tabs;
- if (tabs.length > 0) {
- await this.select(tabs[0]);
- }
- }
- this.ionNavWillLoad.emit();
- }
- componentWillRender() {
- const tabBar = this.el.querySelector('ion-tab-bar');
- if (tabBar) {
- const tab = this.selectedTab ? this.selectedTab.tab : undefined;
- tabBar.selectedTab = tab;
- }
- }
- /**
- * Select a tab by the value of its `tab` property or an element reference. This method is only available for vanilla JavaScript projects. The Angular, React, and Vue implementations of tabs are coupled to each framework's router.
- *
- * @param tab The tab instance to select. If passed a string, it should be the value of the tab's `tab` property.
- */
- async select(tab) {
- const selectedTab = getTab(this.tabs, tab);
- if (!this.shouldSwitch(selectedTab)) {
- return false;
- }
- await this.setActive(selectedTab);
- await this.notifyRouter();
- this.tabSwitch();
- return true;
- }
- /**
- * Get a specific tab by the value of its `tab` property or an element reference. This method is only available for vanilla JavaScript projects. The Angular, React, and Vue implementations of tabs are coupled to each framework's router.
- *
- * @param tab The tab instance to select. If passed a string, it should be the value of the tab's `tab` property.
- */
- async getTab(tab) {
- return getTab(this.tabs, tab);
- }
- /**
- * Get the currently selected tab. This method is only available for vanilla JavaScript projects. The Angular, React, and Vue implementations of tabs are coupled to each framework's router.
- */
- getSelected() {
- return Promise.resolve(this.selectedTab ? this.selectedTab.tab : undefined);
- }
- /** @internal */
- async setRouteId(id) {
- const selectedTab = getTab(this.tabs, id);
- if (!this.shouldSwitch(selectedTab)) {
- return { changed: false, element: this.selectedTab };
- }
- await this.setActive(selectedTab);
- return {
- changed: true,
- element: this.selectedTab,
- markVisible: () => this.tabSwitch(),
- };
- }
- /** @internal */
- async getRouteId() {
- var _a;
- const tabId = (_a = this.selectedTab) === null || _a === void 0 ? void 0 : _a.tab;
- return tabId !== undefined ? { id: tabId, element: this.selectedTab } : undefined;
- }
- setActive(selectedTab) {
- if (this.transitioning) {
- return Promise.reject('transitioning already happening');
- }
- this.transitioning = true;
- this.leavingTab = this.selectedTab;
- this.selectedTab = selectedTab;
- this.ionTabsWillChange.emit({ tab: selectedTab.tab });
- selectedTab.active = true;
- return Promise.resolve();
- }
- tabSwitch() {
- const selectedTab = this.selectedTab;
- const leavingTab = this.leavingTab;
- this.leavingTab = undefined;
- this.transitioning = false;
- if (!selectedTab) {
- return;
- }
- if (leavingTab !== selectedTab) {
- if (leavingTab) {
- leavingTab.active = false;
- }
- this.ionTabsDidChange.emit({ tab: selectedTab.tab });
- }
- }
- notifyRouter() {
- if (this.useRouter) {
- const router = document.querySelector('ion-router');
- if (router) {
- return router.navChanged('forward');
- }
- }
- return Promise.resolve(false);
- }
- shouldSwitch(selectedTab) {
- const leavingTab = this.selectedTab;
- return selectedTab !== undefined && selectedTab !== leavingTab && !this.transitioning;
- }
- get tabs() {
- return Array.from(this.el.querySelectorAll('ion-tab'));
- }
- render() {
- return (h(Host, { key: '20b97196d78c1b3f3faf31618a8a2347e087f06b', onIonTabButtonClick: this.onTabClicked }, h("slot", { key: 'b0823fbae6e47743cfd12c376b365ad7e32cec7c', name: "top" }), h("div", { key: 'eaffd7e4d69ab9489a387e3bbb36e3bab72203a0', class: "tabs-inner" }, h("slot", { key: '20bb66a2937e3ec473aa59c4075ce581b5411677' })), h("slot", { key: '1529dd361f050f52074f51c73b3982ba827dc3a5', name: "bottom" })));
- }
- get el() { return this; }
- static get style() { return IonTabsStyle0; }
- }, [1, "ion-tabs", {
- "useRouter": [1028, "use-router"],
- "selectedTab": [32],
- "select": [64],
- "getTab": [64],
- "getSelected": [64],
- "setRouteId": [64],
- "getRouteId": [64]
- }]);
- const getTab = (tabs, tab) => {
- const tabEl = typeof tab === 'string' ? tabs.find((t) => t.tab === tab) : tab;
- if (!tabEl) {
- printIonError(`[ion-tabs] - Tab with id: "${tabEl}" does not exist`);
- }
- return tabEl;
- };
- function defineCustomElement$1() {
- if (typeof customElements === "undefined") {
- return;
- }
- const components = ["ion-tabs"];
- components.forEach(tagName => { switch (tagName) {
- case "ion-tabs":
- if (!customElements.get(tagName)) {
- customElements.define(tagName, Tabs);
- }
- break;
- } });
- }
- const IonTabs = Tabs;
- const defineCustomElement = defineCustomElement$1;
- export { IonTabs, defineCustomElement };
|