diff --git a/packages/core/src/components.d.ts b/packages/core/src/components.d.ts index 9335a45882..8ce9194f20 100644 --- a/packages/core/src/components.d.ts +++ b/packages/core/src/components.d.ts @@ -2737,8 +2737,6 @@ declare global { enabled?: boolean; icon?: string; path?: string; - root?: string; - rootParams?: any; selected?: boolean; show?: boolean; tabsHideOnSubPages?: boolean; diff --git a/packages/core/src/components/app/app.scss b/packages/core/src/components/app/app.scss index 3791e72377..d6e71692ce 100644 --- a/packages/core/src/components/app/app.scss +++ b/packages/core/src/components/app/app.scss @@ -148,22 +148,8 @@ sub { } -// Nav Container Structure -// -------------------------------------------------- - -ion-app, -ion-nav, -ion-tabs, -.ion-page { - @include position(0, null, null, 0); - - position: absolute; - z-index: $z-index-page-container; - - width: 100%; - height: 100%; - - contain: layout size style; +ion-app { + @extend .ion-page } // Page Container Structure diff --git a/packages/core/src/components/app/app.tsx b/packages/core/src/components/app/app.tsx index de7bc47c69..f0f759b402 100644 --- a/packages/core/src/components/app/app.tsx +++ b/packages/core/src/components/app/app.tsx @@ -95,7 +95,7 @@ export class App { render() { const dom = []; if (this.useRouter) { - dom.push(); + // dom.push(); } return dom; } diff --git a/packages/core/src/components/nav/nav.scss b/packages/core/src/components/nav/nav.scss new file mode 100644 index 0000000000..c0fe7d406f --- /dev/null +++ b/packages/core/src/components/nav/nav.scss @@ -0,0 +1,7 @@ +// Util +// -------------------------------------------------- +@import "../../themes/util"; + +ion-nav { + @extend .ion-page +} \ No newline at end of file diff --git a/packages/core/src/components/nav/nav.tsx b/packages/core/src/components/nav/nav.tsx index 14a2cf5e43..33e8368a68 100644 --- a/packages/core/src/components/nav/nav.tsx +++ b/packages/core/src/components/nav/nav.tsx @@ -58,6 +58,7 @@ const queueMap = new Map(); /* it is very important to keep this class in sync with ./nav-interface interface */ @Component({ tag: 'ion-nav', + styleUrl: 'nav.scss' }) export class Nav implements PublicNav { diff --git a/packages/core/src/components/page/page.scss b/packages/core/src/components/page/page.scss new file mode 100644 index 0000000000..8c4babdc97 --- /dev/null +++ b/packages/core/src/components/page/page.scss @@ -0,0 +1,8 @@ +// Util +// -------------------------------------------------- +@import "../../themes/util"; + +ion-page { + @extend .ion-page +} + diff --git a/packages/core/src/components/page/page.tsx b/packages/core/src/components/page/page.tsx index a16198e15e..b29c2413d6 100644 --- a/packages/core/src/components/page/page.tsx +++ b/packages/core/src/components/page/page.tsx @@ -3,6 +3,7 @@ import { Component } from '@stencil/core'; @Component({ tag: 'ion-page', + styleUrl: 'page.scss' }) export class Page { diff --git a/packages/core/src/components/tab-button/tab-button.tsx b/packages/core/src/components/tab-button/tab-button.tsx index 79f06ce7d9..e16f75ceeb 100644 --- a/packages/core/src/components/tab-button/tab-button.tsx +++ b/packages/core/src/components/tab-button/tab-button.tsx @@ -11,16 +11,16 @@ export class TabButton { @Prop() selected = false; @Prop() tab: HTMLIonTabElement; - @Event() ionTabbarClick: EventEmitter; - @Event() ionTabButtonDidLoad: EventEmitter; - @Event() ionTabButtonDidUnload: EventEmitter; + @Event() ionTabbarClick: EventEmitter; + @Event() ionTabButtonDidLoad: EventEmitter; + @Event() ionTabButtonDidUnload: EventEmitter; componentDidLoad() { - this.ionTabButtonDidLoad.emit({ button: this }); + this.ionTabButtonDidLoad.emit(); } componentDidUnload() { - this.ionTabButtonDidUnload.emit({ button: this }); + this.ionTabButtonDidUnload.emit(); } @Listen('click') @@ -72,3 +72,11 @@ export class TabButton { return items; } } + +export interface TabButtonEvent extends CustomEvent { + detail: TabButtonEventDetail; +} + +export interface TabButtonEventDetail extends HTMLIonTabElement { + +} diff --git a/packages/core/src/components/tab/readme.md b/packages/core/src/components/tab/readme.md index a09d38a3d4..164cad5a3d 100644 --- a/packages/core/src/components/tab/readme.md +++ b/packages/core/src/components/tab/readme.md @@ -80,16 +80,6 @@ string string -#### root - -string - - -#### rootParams - -any - - #### selected boolean @@ -142,16 +132,6 @@ string string -#### root - -string - - -#### rootParams - -any - - #### selected boolean @@ -179,19 +159,10 @@ string ## Methods -#### _setActive() - - -#### getActive() - - -#### getNav() - - #### getPath() -#### goToRoot() +#### setActive() diff --git a/packages/core/src/components/tab/tab.tsx b/packages/core/src/components/tab/tab.tsx index e0a4e91972..92e1d5a0e2 100644 --- a/packages/core/src/components/tab/tab.tsx +++ b/packages/core/src/components/tab/tab.tsx @@ -1,5 +1,4 @@ import { Component, Element, Event, EventEmitter, Method, Prop, PropDidChange, State } from '@stencil/core'; -import { PublicViewController, StencilElement } from '../../index'; @Component({ @@ -7,24 +6,11 @@ import { PublicViewController, StencilElement } from '../../index'; }) export class Tab { - private nav: Promise; - private resolveNav: (el: HTMLIonNavElement) => void; - @Element() el: HTMLElement; @State() init = false; @State() active = false; - /** - * @input {Page} Set the root page for this tab. - */ - @Prop() root: string; - - /** - * @input {object} Any nav-params to pass to the root page of this tab. - */ - @Prop() rootParams: any; - /** * @input {string} Set the root page for this tab. */ @@ -73,51 +59,24 @@ export class Tab { */ @Prop() tabsHideOnSubPages = false; - constructor() { - this.nav = new Promise((resolve) => this.resolveNav = resolve); - } @Prop({ mutable: true }) selected = false; @PropDidChange('selected') selectedChanged(selected: boolean) { if (selected) { - this.ionSelect.emit(this.el); + this.ionSelect.emit(); } } /** * @output {Tab} Emitted when the current tab is selected. */ - @Event() ionSelect: EventEmitter; - - protected componentDidUpdate() { - if (this.init && this.resolveNav) { - const nav = this.el.querySelector('ion-nav') as any as StencilElement; - nav.componentOnReady(this.resolveNav); - this.resolveNav = null; - } - } + @Event() ionSelect: EventEmitter; @Method() - _setActive(shouldActive: boolean): Promise { - if (this.active === shouldActive) { - return Promise.resolve(); - } - this.active = shouldActive; - this.selected = shouldActive; - - const needsLifecycle = this.init; - if (shouldActive) { - this.init = true; - } - if (needsLifecycle) { - if (shouldActive) { - // lifecycle didEnter - } else { - // lifecycle didLeave - } - } - return this.nav; + setActive(active: boolean): Promise { + this.active = active; + return Promise.resolve(); } @Method() @@ -131,21 +90,6 @@ export class Tab { return ''; } - @Method() - goToRoot(opts: any = {}) { - return this.nav.then(nav => nav && nav.setRoot(nav.root, null, opts)); - } - - @Method() - getActive(): Promise { - return this.nav.then(nav => nav && nav.getActive()); - } - - @Method() - getNav(): Promise { - return this.nav; - } - hostData() { const visible = this.active && this.selected; return { @@ -159,9 +103,14 @@ export class Tab { } render() { - if (this.init) { - return ; - } - return null; + return ; } } + +export interface TabEvent extends CustomEvent { + detail: TabEventDetail; +} + +export interface TabEventDetail { + +} diff --git a/packages/core/src/components/tabs/readme.md b/packages/core/src/components/tabs/readme.md index cc65d97de2..35cc2abfc0 100644 --- a/packages/core/src/components/tabs/readme.md +++ b/packages/core/src/components/tabs/readme.md @@ -167,9 +167,6 @@ boolean #### ionChange -#### ionNavChanged - - ## Methods #### getByIndex() @@ -178,24 +175,15 @@ boolean #### getIndex() -#### getRoutes() - - #### getSelected() -#### getState() - - #### getTabs() #### select() -#### setRouteId() - - ---------------------------------------------- diff --git a/packages/core/src/components/tabs/tabs.scss b/packages/core/src/components/tabs/tabs.scss index a9239112c2..665d65c46d 100644 --- a/packages/core/src/components/tabs/tabs.scss +++ b/packages/core/src/components/tabs/tabs.scss @@ -1,5 +1,9 @@ @import "../../themes/ionic.globals"; +// Util +// -------------------------------------------------- +@import "../../themes/util"; + // Tabs // -------------------------------------------------- @@ -215,3 +219,8 @@ ion-tabbar.scrollable .scroll-inner { ion-tabbar.scrollable ion-button.inactive { visibility: hidden; } + + +ion-tabs { + @extend .ion-page +} diff --git a/packages/core/src/components/tabs/tabs.tsx b/packages/core/src/components/tabs/tabs.tsx index ef9a6008d5..d1821efc0d 100644 --- a/packages/core/src/components/tabs/tabs.tsx +++ b/packages/core/src/components/tabs/tabs.tsx @@ -1,7 +1,5 @@ import { Component, Element, Event, EventEmitter, Listen, Method, Prop, State } from '@stencil/core'; -import { Config, NavState, RouterEntries } from '../../index'; - -export interface NavOptions { } +import { Config } from '../../index'; @Component({ @@ -61,7 +59,6 @@ export class Tabs { * @output {any} Emitted when the tab changes. */ @Event() ionChange: EventEmitter; - @Event() ionNavChanged: EventEmitter; componentDidLoad() { this.loadConfig('tabsPlacement', 'bottom'); @@ -69,10 +66,7 @@ export class Tabs { this.loadConfig('tabsHighlight', true); this.initTabs(); - const useRouter = this.config.getBoolean('useRouter', false); - if (!useRouter) { - this.initSelect(); - } + this.initSelect(); } componentDidUnload() { @@ -106,21 +100,21 @@ export class Tabs { // The same selected was selected // we need to set root in the nested ion-nav if it exist - if (this.selectedTab === selectedTab) { + /*if (this.selectedTab === selectedTab) { return selectedTab.goToRoot(); } + */ const leavingTab = this.selectedTab; this.selectedTab = selectedTab; - let promise = selectedTab._setActive(true); + let promise = selectedTab.setActive(true); if (leavingTab) { - promise = promise.then(() => leavingTab._setActive(false)); + promise = promise.then(() => leavingTab.setActive(false)); } return promise.then(() => { this.ionChange.emit(selectedTab); - this.ionNavChanged.emit({ isPop: false }); }); } @@ -152,7 +146,7 @@ export class Tabs { return this.tabs; } - @Method() + /*@Method() getState(): NavState { const selectedTab = this.getSelected(); if (!selectedTab) { @@ -175,6 +169,7 @@ export class Tabs { return a; } + @Method() setRouteId(id: any, _: any = {}): Promise { if (this.selectedTab === id) { @@ -182,10 +177,11 @@ export class Tabs { } return this.select(id); } + */ private initTabs() { const tabs = this.tabs = Array.from(this.el.querySelectorAll('ion-tab')); - for (let tab of tabs) { + for (const tab of tabs) { const id = `t-${this.tabsId}-${++this.ids}`; tab.btnId = 'tab-' + id; tab.id = 'tabpanel-' + id; @@ -194,18 +190,16 @@ export class Tabs { private initSelect() { // find pre-selected tabs - let selectedTab = this.tabs.find(t => t.selected); + const selectedTab = this.tabs.find(t => t.selected) || this.tabs.find(t => t.show && t.enabled); // reset all tabs none is selected - for (let tab of this.tabs) { - tab.selected = false; + for (const tab of this.tabs) { + if (tab !== selectedTab) { + tab.selected = false; + } } - // find a tab candidate in case, the selected in null - if (!selectedTab) { - selectedTab = this.tabs.find(t => t.show && t.enabled); - } - selectedTab._setActive(true); + selectedTab.setActive(true); this.selectedTab = selectedTab; } @@ -241,3 +235,5 @@ export class Tabs { } let tabIds = -1; + + diff --git a/packages/core/src/components/tabs/test/basic/index.html b/packages/core/src/components/tabs/test/basic/index.html index 5879202c2a..e53daae581 100644 --- a/packages/core/src/components/tabs/test/basic/index.html +++ b/packages/core/src/components/tabs/test/basic/index.html @@ -14,68 +14,57 @@ - + + + + Tab One + + + + Tab One + + - - + + + + Tab Two + + + + Tab Two + + - + + + + Tab Three + + + + Tab Three + + - - + + + + Tab Four + + + + Tab Four + + - - - - diff --git a/packages/core/src/components/tabs/test/basic/page-tab.tsx b/packages/core/src/components/tabs/test/basic/page-tab.tsx deleted file mode 100644 index 7996f41a02..0000000000 --- a/packages/core/src/components/tabs/test/basic/page-tab.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Component, Element } from '@stencil/core'; - -export interface Route { - path: string | null; - component: string; -} - -@Component({ - tag: 'page-tab' -}) -export class PageTab { - - @Element() element: HTMLElement; - - getTabs() { - return this.element.closest('ion-tabs') as HTMLIonTabsElement; - } - - setLayout(value: string) { - this.getTabs().tabbarLayout = value; - } - - setPlacement(value: string) { - this.getTabs().tabbarPlacement = value; - } - - setHidden(value: boolean) { - this.getTabs().tabbarHidden = value; - } - - setHighlight(value: boolean) { - this.getTabs().tabbarHighlight = value; - } - - render() { - return [ - - - Tab page - - , - -

-

Set tabbar layout

- this.setLayout('icon-top')}>icon-top - this.setLayout('icon-start')}>icon-start - this.setLayout('icon-end')}>icon-end - this.setLayout('icon-bottom')}>icon-bottom - this.setLayout('icon-hide')}>icon-hide - this.setLayout('title-hide')}>title-hide -

-

-

Set tabbar placement

- this.setPlacement('top')}>top - this.setPlacement('bottom')}>bottom -

-

-

Set tabbar hidden

- this.setHidden(true)}>hidden - this.setHidden(false)}>visible -

-

-

Set tabbar highlight

- this.setHighlight(true)}>enabled - this.setHighlight(false)}>disabled -

-

Not found

-

/

-

/tab2

-

/tab3

-

/tab4

-

/tab4/paginaaaa-two

- - - - - - - - - - - - -
- ]; - } -} diff --git a/packages/core/src/components/tabs/test/div/index.html b/packages/core/src/components/tabs/test/div/index.html new file mode 100644 index 0000000000..a2b2f8047d --- /dev/null +++ b/packages/core/src/components/tabs/test/div/index.html @@ -0,0 +1,46 @@ + + + + + Tab - Basic + + + + + + + +
Div One
+
+ + +
Div Two
+
+ + +
Div Three
+
+ + + + diff --git a/packages/core/src/components/tabs/test/no-ion-app/index.html b/packages/core/src/components/tabs/test/no-ion-app/index.html new file mode 100644 index 0000000000..f08c7311f9 --- /dev/null +++ b/packages/core/src/components/tabs/test/no-ion-app/index.html @@ -0,0 +1,45 @@ + + + + + Tab - Basic + + + + + + + +
Div One
+
+ + +
Div Two
+
+ + +
Div Three
+
+ + + diff --git a/packages/core/src/components/tabs/test/vanilla/index.html b/packages/core/src/components/tabs/test/vanilla/index.html new file mode 100644 index 0000000000..89833ddef0 --- /dev/null +++ b/packages/core/src/components/tabs/test/vanilla/index.html @@ -0,0 +1,48 @@ + + + + + Tab - Basic + + + + + + + + +
Div One
+
+ + +
Div Two
+
+ + +
Div Three
+
+
+ + + + diff --git a/packages/core/src/themes/ionic.globals.scss b/packages/core/src/themes/ionic.globals.scss index fbda7510d7..f596ff4ef2 100644 --- a/packages/core/src/themes/ionic.globals.scss +++ b/packages/core/src/themes/ionic.globals.scss @@ -47,3 +47,19 @@ $z-index-item-options: 1; // scss-lint:disable DefaultRule $z-index-item-divider: 100; // scss-lint:disable DefaultRule $z-index-reorder-selected: 100; // scss-lint:disable DefaultRule + +.ion-page { + position: absolute; + + top: 0; + left: 0; + right: 0; + bottom: 0; + + z-index: $z-index-page-container; + + width: 100%; + height: 100%; + + contain: layout size style; +} \ No newline at end of file diff --git a/packages/core/src/themes/util.scss b/packages/core/src/themes/util.scss index 305698d4ff..5fcc789661 100755 --- a/packages/core/src/themes/util.scss +++ b/packages/core/src/themes/util.scss @@ -40,31 +40,3 @@ $focus-outline-box-shadow: 0 0 8px 1px $focus-outline-border-color !default; ion-input :focus { outline: none; } - - -// Click Block -// -------------------------------------------------- -// Fill the screen to block clicks (a better pointer-events: none) -// to avoid full-page reflows and paints which can cause flickers - -.click-block { - display: none; -} - -.click-block-enabled { - @include position(0, 0, 0, 0); - @include transform(translate3d(0, -100%, 0), translateY(1px)); - - position: absolute; - - z-index: $z-index-click-block; - display: block; - - opacity: 0; - - contain: strict; -} - -.click-block-active { - @include transform(translate3d(0, 0, 0)); -}