Skip to content

docs(nav): component playground for modal navigation #2463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Aug 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 7 additions & 20 deletions docs/api/nav.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
title: "ion-nav"
hide_table_of_contents: true
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
Expand All @@ -22,24 +21,10 @@ import APITOCInline from '@components/page/api/APITOCInline';

<EncapsulationPill type="shadow" />

<h2 className="table-of-contents__title">Contents</h2>

<APITOCInline
toc={toc}
maxHeadingLevel={2}
autogenerated={[Props, Events, Methods, Parts, CustomProps, Slots]}
/>



Nav is a standalone component for loading arbitrary components and pushing new components on to the stack.

Unlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL.

## Using NavController

TODO: Playground Example

## Using NavLink

NavLink is a simplified API when interacting with Nav. Developers can customize the component, pass along component properties, modify the direction of the route animation or define a custom animation when navigating.
Expand All @@ -50,15 +35,17 @@ import NavLinkExample from '@site/static/usage/nav/nav-link/index.md';

## Navigation within a Modal

TODO: Playground Example
Modal can use Nav to offer a linear navigation that is independent of the URL.

:::note

## Animations
The example below uses a reference to Nav and the public method APIs to push and pop views. It is recommended to use NavLink in implementations that do not require this level of granular access and control.

TODO: Playground Example
:::

## Event Handling
import ModalNavigationExample from '@site/static/usage/nav/modal-navigation/index.md';

TODO: Playground Example
<ModalNavigationExample />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm seeing some weird transition animations in iOS mode: https://user-images.githubusercontent.com/90629384/184921906-98e49071-f095-4424-b437-689e636d9adb.mp4

It doesn't happen in Stackblitz, so maybe this is related to the Playground component?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a strange one... the style block that is causing this issue is:

ion-modal .ion-page:not(ion-nav.ion-page) {
    position: relative;
    contain: layout style;
    height: 100%;
}

somehow it's stripping the space within the :not tag, as ours is:

ion-modal .ion-page:not(ion-nav .ion-page) {
    position: relative;
    contain: layout style;
    height: 100%;
}

We can see that issue directly from the CDN: https://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css.

I'll need to work with Liam to uncover why this is happening. I don't see this as a blocker though, as the Stackblitz examples work & when developers install the package they will not have this issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, this will be resolved once: ionic-team/ionic-framework#25767 is merged, we deploy the next patch & jsDelivr cache is purged.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Word 👍


## Interfaces

Expand Down
61 changes: 40 additions & 21 deletions static/code/stackblitz/react/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions static/usage/nav/modal-navigation/angular/app_component_html.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
```html
<ion-header>
<ion-toolbar>
<ion-title>Modal Navigation</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-button id="openModal">Open Modal</ion-button>
<ion-modal #modal trigger="openModal" (willPresent)="onWillPresent()">
<ng-template>
<ion-header>
<ion-toolbar>
<ion-title>Modal</ion-title>
<ion-buttons slot="end">
<ion-button (click)="modal.dismiss()"> Close </ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-nav #nav></ion-nav>
</ion-content>
</ng-template>
</ion-modal>
</ion-content>
```
18 changes: 18 additions & 0 deletions static/usage/nav/modal-navigation/angular/app_component_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
```ts
import { Component, ViewChild } from '@angular/core';
import { IonNav } from '@ionic/angular';

import { PageOneComponent } from './page-one.component';

@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
})
export class AppComponent {
@ViewChild('nav') private nav: IonNav;

onWillPresent() {
this.nav.setRoot(PageOneComponent);
}
}
```
20 changes: 20 additions & 0 deletions static/usage/nav/modal-navigation/angular/app_module_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
```ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule } from '@angular/router';

import { IonicModule } from '@ionic/angular';

import { AppComponent } from './app.component';

import { PageOneComponent } from './page-one.component';
import { PageTwoComponent } from './page-two.component';
import { PageThreeComponent } from './page-three.component';

@NgModule({
imports: [BrowserModule, RouterModule.forRoot([]), IonicModule.forRoot({})],
declarations: [AppComponent, PageOneComponent, PageTwoComponent, PageThreeComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
```
23 changes: 23 additions & 0 deletions static/usage/nav/modal-navigation/angular/page_one_component_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
```ts
import { Component } from '@angular/core';
import { IonNav } from '@ionic/angular';

import { PageTwoComponent } from './page-two.component';

@Component({
selector: 'app-page-one',
template: `
<ion-content class="ion-padding">
<h1>Page One</h1>
<ion-button (click)="navigateToPageTwo()">Go to Page Two</ion-button>
</ion-content>
`,
})
export class PageOneComponent {
constructor(private nav: IonNav) {}

navigateToPageTwo() {
this.nav.push(PageTwoComponent);
}
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
```ts
import { Component } from '@angular/core';
import { IonNav } from '@ionic/angular';

@Component({
selector: 'app-page-one',
template: `
<ion-content class="ion-padding">
<h1>Page Three</h1>
<ion-button (click)="navigateBack()">Go Back</ion-button>
<ion-button (click)="navigateToRoot()">Go to Root</ion-button>
</ion-content>
`,
})
export class PageThreeComponent {
constructor(private nav: IonNav) {}

navigateBack() {
this.nav.pop();
}

navigateToRoot() {
this.nav.popToRoot();
}
}
```
25 changes: 25 additions & 0 deletions static/usage/nav/modal-navigation/angular/page_two_component_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
```ts
import { Component } from '@angular/core';
import { IonNav } from '@ionic/angular';

import { PageThreeComponent } from './page-three.component';

@Component({
selector: 'app-page-two',
template: `
<ion-content class="ion-padding">
<h1>Page Two</h1>
<ion-button (click)="navigateToPageThree()">Go to Page Three</ion-button>
</ion-content>
`,
})
export class PageTwoComponent {
component = PageThreeComponent;

constructor(private nav: IonNav) {}

navigateToPageThree() {
this.nav.push(PageThreeComponent);
}
}
```
Loading