Aller au contenu principal
@capgo/capacitor-native-navigation UI & système Open source

Navigation native Plugin Capacitor

Affichez des navbars, tabbars et shells de transition natifs par-dessus une Capacitor WebView plein écran

Installer

bun add @capgo/capacitor-native-navigation bunx cap sync
npm, pnpm ou yarn
  • npm install @capgo/capacitor-native-navigation
  • pnpm add @capgo/capacitor-native-navigation
  • yarn add @capgo/capacitor-native-navigation

Démo

Démos Native Navigation

Chrome de navigation native, sélection d'onglets, icônes SVG et options de style, présentés en démos WebP animées.

Assets sources
Démo animée d'un shell de navigation native avec navbar native, onglets et contenu WebView
Shell natif
Flux de navigation natif animé montrant la sélection d'onglets, la transition push et le retour natif
Flux de tap
Démo animée d'icônes SVG natives montrant les icônes SVG inline, la teinte native, les labels et la sélection d'onglets
Icônes SVG
Démo des options de navigation native animée avec couleurs dynamiques, labels sélectionnés, badges et transitions de zoom
Options de style

Guide

Comment utiliser Native Navigation dans Capacitor

Tester sur l'appareil

Téléchargez l'application Capgo, puis scannez le QR code.

Lien QR pour l'aperçu du plugin Native Navigation code

Utilisation de @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation affiche la barre de navigation native en haut, la barre d'onglets en bas et les shells de transition de route par-dessus une seule WebView Capacitor plein écran. Votre framework web garde la main sur les routes et le contenu, tandis que le natif gère le cadre de l'app.

Installer et synchroniser

npm install @capgo/capacitor-native-navigation
npx cap sync

Configurer le cadre natif

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  colors: {
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
});

Afficher une navbar native

await NativeNavigation.setNavbar({
  title: 'Inbox',
  subtitle: 'Native chrome',
  transparent: true,
  backButton: { visible: false },
  rightItems: [
    {
      id: 'compose',
      title: 'Compose',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',
      },
    },
  ],
});

Ajouter des lignes de segments multi-niveaux sous la navbar

Passer segments vers setNavbar pour empiler des rangées de segments natifs sous la barre, par exemple un sélecteur de scope en haut et des onglets de section en dessous. Les rangées se dessinent de haut en bas et chacune ajoute 44pt (iOS) ou 48dp (Android) à la navbar et aux insets renvoyés. iOS utilise UISegmentedControl et des pilules en verre ; Android utilise les Material segmented buttons et les filter chips.

iOS Android
Enregistrement iOS : appui sur les sections Account, le passage à Organization remplace la deuxième rangée par huit chips défilantes, sélection de Billing Enregistrement Android : rangée segmentée Account / Organization au-dessus de chips de section défilantes, changement de scope et sélection de Billing
const sections = {
  account: ['General', 'Notifications', 'Password', 'Two-factor'],
  organization: ['General', 'Members', 'Plans', 'Usage', 'Credits', 'Billing', 'Security', 'Webhooks'],
};
const selection = { scope: 'account', section: 'general' };

const renderNavbar = () =>
  NativeNavigation.setNavbar({
    title: 'Settings',
    segments: [
      {
        id: 'scope',
        selectedId: selection.scope,
        items: [
          { id: 'account', title: 'Account' },
          { id: 'organization', title: 'Organization' },
        ],
      },
      {
        id: 'section',
        style: 'scroll', // scrolling chips; `auto` uses `segmented` for up to 4 items
        selectedId: selection.section,
        items: sections[selection.scope].map((title) => ({ id: title.toLowerCase(), title })),
      },
    ],
  });

await NativeNavigation.addListener('navbarSegmentSelect', async ({ groupId, id }) => {
  if (groupId === 'scope') {
    selection.scope = id;
    selection.section = 'general'; // the second level depends on the first one
  } else {
    selection.section = id;
  }
  await renderNavbar();
});

await renderNavbar();

Selection moves natively when the user taps, but every setNavbar appel applique selectedId à nouveau. Conservez les ids sélectionnés dans votre état et passez-les à chaque appel ultérieur setNavbar ; pour rejeter une sélection, envoyez la précédente selectedId. Les éléments acceptent également icon, accessibilityLabel, et enabled. Passer segments: [] pour supprimer les lignes. Disponible depuis la 8.13.0.

Afficher une tabbar native

await NativeNavigation.setTabbar({
  selectedId: 'inbox',
  labelVisibilityMode: 'selected',
  icons: true,
  colors: {
    dynamic: true,
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
  tabs: [
    {
      id: 'inbox',
      title: 'Inbox',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="m4 13 4 4h8l4-4"/></svg>',
      },
    },
    {
      id: 'search',
      title: 'Search',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>',
      },
    },
  ],
});

Connecter les événements natifs à votre routeur

Les barres natives émettent une intention. Votre routeur effectue toujours le changement de route :

await NativeNavigation.addListener('navbarBack', () => {
  router.back();
});

await NativeNavigation.addListener('navbarItemTap', ({ id }) => {
  if (id === 'compose') router.push('/compose');
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  router.push(`/${id}`);
});

Animer les changements de route

Utilisez une transaction de transition autour de votre mise à jour de route web habituelle :

const transition = await NativeNavigation.beginTransition({
  direction: 'forward',
});

router.push('/message/42');
await router.ready?.();

await NativeNavigation.setNavbar({
  title: 'Message',
  backButton: { visible: true, title: 'Inbox' },
});

await NativeNavigation.finishTransition({
  id: transition.id,
  direction: 'forward',
});

Ajouter une transition de zoom

Utilisez les helpers de zoom pour les routes ouvertes depuis une carte, un élément de grille ou un aperçu média.

import { beginZoomTransition, finishZoomTransition } from '@capgo/capacitor-native-navigation';

const card = document.querySelector('[data-message-card]');
if (card) {
  const transition = await beginZoomTransition(card, { cornerRadius: 18 });

  router.push('/message/42');
  await router.ready?.();

  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });

  await finishZoomTransition(undefined, {
    id: transition.id,
    cornerRadius: 18,
  });
}

Ajouter du padding avec les insets natifs

Quand contentInsetMode est css, le plugin écrit des variables CSS pour les barres natives :

.page {
  padding-top: var(--cap-native-navigation-top);
  padding-bottom: var(--cap-native-navigation-bottom);
}

Choix des icônes

Les icônes sont des descripteurs natifs, pas des nœuds React ou Vue. Utilisez du SVG si vous ne souhaitez pas inclure d'assets natifs dans le bundle :

const icon = {
  svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
  template: true,
  ios: { sfSymbol: 'house.fill' },
  android: { resource: 'ic_menu_view' },
};

Le SVG inline prend en charge path, line, polyline, polygon, circle, et rect, ce qui couvre les jeux d'icônes courants comme Lucide et Feather.

Combinez avec @capgo/capacitor-transitions

Utilisez Native Navigation pour la barre de navigation native, la tabbar, les insets de safe-area et les événements d’intent natifs. Utilisez @capgo/capacitor-transitions pour la pile de pages WebView sous cette interface native.

npm install @capgo/capacitor-native-navigation @capgo/capacitor-transitions
npx cap sync

Initialisez les deux packages une seule fois :

import { NativeNavigation } from '@capgo/capacitor-native-navigation';
import '@capgo/capacitor-transitions';
import { initTransitions, setupRouterOutlet, setDirection } from '@capgo/capacitor-transitions/react';

initTransitions({ platform: 'auto' });

const outlet = document.querySelector('cap-router-outlet');
if (outlet) {
  setupRouterOutlet(outlet, { platform: 'auto', swipeGesture: 'auto' });
}

await NativeNavigation.configure({
  contentInsetMode: 'css',
});

Concentrez l'outlet de transition sur les pages, pas sur des barres web en double :

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-content slot="content" fullscreen>
      <main class="page">Inbox content</main>
    </cap-content>
  </cap-page>
</cap-router-outlet>

Pilotez les deux packages depuis les mêmes actions de routeur :

async function openMessage(id: string) {
  setDirection('forward');
  await router.push(`/messages/${id}`);
  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });
}

await NativeNavigation.addListener('navbarBack', () => {
  setDirection('back');
  router.back();
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  setDirection('root');
  router.push(`/${id}`);
});

Choisissez une couche d’animation par changement de route. Laissez @capgo/capacitor-transitions Animez les pushes de pages classiques et utilisez les helpers de zoom de Native Navigation uniquement pour les routes à élément partagé ou de zoom.

Référence complète

Continuez depuis Using @capgo/capacitor-native-navigation

Si vous utilisez Utilisation de @capgo/capacitor-native-navigation pour planifier le comportement des médias et de l'interface natifs, connectez-l’à @capgo/capacitor-native-navigation pour les détails d’implémentation dans @capgo/capacitor-native-navigation, Prise en main pour les détails d'implémentation dans Getting Started Utiliser @capgo/capacitor-live-activities pour la capacité native dans Utiliser @capgo/capacitor-live-activities @capgo/capacitor-live-activities pour les détails d'implémentation dans @capgo/capacitor-live-activities, et Utiliser @capgo/capacitor-video-player pour la fonctionnalité native dans Utilisation de @capgo/capacitor-video-player.

FAQ

FAQ du plugin Native Navigation

Comment installer le plugin Native Navigation dans une application Capacitor ?

Exécutez « bun add @capgo/capacitor-native-navigation » (ou « npm install @capgo/capacitor-native-navigation »), puis lancez « bunx cap sync » pour que les projets iOS et Android prennent en compte le code natif. Importez-le depuis « @capgo/capacitor-native-navigation » dans votre code.

Est-ce que @capgo/capacitor-native-navigation fonctionne avec React, Vue et Angular ?

Oui. Native Navigation est un package Capacitor, il fonctionne donc avec n'importe quel framework web qui tourne dans Capacitor, y compris Ionic, React, Vue, Angular, Svelte et le JavaScript pur.

Quelle version de Capacitor est supportée par @capgo/capacitor-native-navigation ?

Les plugins Capgo suivent la version majeure de Capacitor : utilisez la version majeure du plugin qui correspond à la version majeure de votre Capacitor (par exemple le plugin v8 avec Capacitor 8). Le tableau de compatibilité du README de GitHub recense les versions maintenues.

Est-ce que @capgo/capacitor-native-navigation est gratuit et open source ?

Oui. Le code source est public sur GitHub à l'adresse https://github.com/Cap-go/capacitor-native-navigation/ et le package est gratuit à installer depuis npm. Les rapports de bugs et les pull requests sont les bienvenus.

Puis-je mettre à jour code utilisant Native Navigation sans passer par une revue de l'App Store ?

L'installation ou la mise à jour du plugin modifie le code natif, ce qui impose un nouveau build pour les stores. Ensuite, les changements JavaScript, HTML et CSS qui appellent le plugin peuvent être livrés instantanément via les live updates de Capgo.

Déployez des modifications de Native Navigation sans attendre la revue de l’app

Une fois le plugin intégré à votre build de store, Capgo live updates déploie vos changements JavaScript, HTML et CSS aux utilisateurs en quelques minutes.

Commencez avec Capgo