Aller au contenu

Premiers pas

GitHub

Vous pouvez utiliser notre configuration assistée par IA pour installer le plugin. Ajoutez les skills Capgo à votre outil d'IA avec la commande suivante :

Fenêtre de terminal
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Utilisez ensuite le prompt suivant :

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-sheets` plugin in my project.

Si vous préférez la configuration manuelle, installez le plugin avec les commandes suivantes, puis suivez les instructions spécifiques à chaque plateforme ci-dessous :

  1. Installer le package

    Fenêtre de terminal
    bun add @capgo/capacitor-sheets
  2. Enregistrer les web components

    import '@capgo/capacitor-sheets';
  3. Ajouter le réglage du viewport pour les safe areas

    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
  4. Rendre un sheet

    <cap-sheet-trigger for="booking-sheet" action="present">Open route</cap-sheet-trigger>
    <cap-sheet id="booking-sheet" detents="18em 32em" content-placement="bottom">
    <cap-sheet-portal>
    <cap-sheet-view>
    <cap-sheet-backdrop></cap-sheet-backdrop>
    <cap-sheet-content class="route-sheet">
    <cap-sheet-bleeding-background></cap-sheet-bleeding-background>
    <cap-sheet-handle></cap-sheet-handle>
    <cap-sheet-title>Evening route</cap-sheet-title>
    <cap-sheet-description>Choose a route and confirm pickup.</cap-sheet-description>
    <cap-sheet-trigger action="dismiss">Done</cap-sheet-trigger>
    </cap-sheet-content>
    </cap-sheet-view>
    </cap-sheet-portal>
    </cap-sheet>
    .route-sheet {
    width: min(100%, 34em);
    padding: 0 1.25em 1.25em;
    }
  • Enregistrer les composants: import @capgo/capacitor-sheets once at bootstrap or elements will not upgrade.
  • Ajustement du viewport: manquant viewport-fit=cover casse le padding de la safe area sur les téléphones à encoche.
  • Clavier: activez la prévention du scroll au focus documentée lorsque les inputs se trouvent dans des bottom sheets.

Les safe areas sont activées par défaut via safe-area="auto"La vue de la feuille lit les valeurs de l'environnement du navigateur ainsi que les variables de repli Capacitor :

env(safe-area-inset-top)
env(safe-area-inset-bottom)
env(safe-area-inset-left)
env(safe-area-inset-right)
var(--safe-area-inset-top)
var(--safe-area-inset-bottom)
var(--safe-area-inset-left)
var(--safe-area-inset-right)

Choisissez les bords protégés par sheet :

<cap-sheet safe-area="auto"></cap-sheet>
<cap-sheet safe-area="bottom left right"></cap-sheet>
<cap-sheet safe-area="none"></cap-sheet>

Pour les apps avec des barres de statut ou système en overlay, conservez les plugins natifs responsables de l'exposition des valeurs d'inset correctes :

import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
plugins: {
StatusBar: {
overlaysWebView: true,
},
Keyboard: {
resize: 'body',
resizeOnFullScreen: true,
},
SystemBars: {
insetsHandling: 'css',
},
},
};
export default config;

La gestion du clavier est contrôlée par native-focus-scroll-prevention, qui utilise par défaut true. Désactivez-l’uniquement si votre app gère déjà l'évitement du clavier :

<cap-sheet native-focus-scroll-prevention="false"></cap-sheet>

Tous les helpers du framework configurent le même élément personnalisé sous-jacent. Vous pouvez également contrôler une sheet directement :

const sheet = document.querySelector('cap-sheet');
await sheet?.present();
await sheet?.stepTo(2);
await sheet?.step('down');
await sheet?.dismiss();

Écoutez les événements pour gérer l'état, l'analytics ou coordonner les animations :

sheet?.addEventListener('cap-sheet-presented-change', (event) => {
console.log(event.detail.presented);
});
sheet?.addEventListener('cap-sheet-active-detent-change', (event) => {
console.log(event.detail.activeDetent);
});
sheet?.addEventListener('cap-sheet-travel', (event) => {
console.log(event.detail.progress);
});
import { useEffect, useRef } from 'react';
import { setupSheet } from '@capgo/capacitor-sheets/react';
import '@capgo/capacitor-sheets';
export function BookingSheet() {
const sheetRef = useRef<HTMLElement>(null);
useEffect(() => {
if (!sheetRef.current) return;
return setupSheet(sheetRef.current, {
detents: ['18em', '32em'],
contentPlacement: 'bottom',
onPresentedChange: ({ presented }) => console.log({ presented }),
});
}, []);
return (
<cap-sheet id="booking-sheet" ref={sheetRef}>
<cap-sheet-trigger action="present">Open</cap-sheet-trigger>
<cap-sheet-view>
<cap-sheet-backdrop />
<cap-sheet-content>
<cap-sheet-handle />
<cap-sheet-title>React sheet</cap-sheet-title>
</cap-sheet-content>
</cap-sheet-view>
</cap-sheet>
);
}

Importation depuis @capgo/capacitor-sheets/react enregistre également les typages JSX pour les éléments personnalisés. Si TypeScript signale toujours des balises inconnues, ajoutez un fichier de déclaration dans votre arborescence source :

src/capgo-sheets.d.ts
import '@capgo/capacitor-sheets/react';
<script setup lang="ts">
import { onMounted, onUnmounted, ref } from 'vue';
import { setupSheet } from '@capgo/capacitor-sheets/vue';
import '@capgo/capacitor-sheets';
const sheetRef = ref<HTMLElement | null>(null);
let cleanup: (() => void) | undefined;
onMounted(() => {
if (sheetRef.value) {
cleanup = setupSheet(sheetRef.value, {
detents: ['18em', '32em'],
contentPlacement: 'bottom',
});
}
});
onUnmounted(() => cleanup?.());
</script>
<template>
<cap-sheet id="booking-sheet" ref="sheetRef">
<cap-sheet-trigger action="present">Open</cap-sheet-trigger>
<cap-sheet-view>
<cap-sheet-backdrop />
<cap-sheet-content>
<cap-sheet-handle />
<cap-sheet-title>Vue sheet</cap-sheet-title>
</cap-sheet-content>
</cap-sheet-view>
</cap-sheet>
</template>
import { AfterViewInit, Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, ViewChild } from '@angular/core';
import { setupSheet } from '@capgo/capacitor-sheets/angular';
import '@capgo/capacitor-sheets';
@Component({
selector: 'app-root',
standalone: true,
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `
<cap-sheet id="booking-sheet" #sheet>
<cap-sheet-trigger action="present">Open</cap-sheet-trigger>
<cap-sheet-view>
<cap-sheet-backdrop></cap-sheet-backdrop>
<cap-sheet-content>
<cap-sheet-handle></cap-sheet-handle>
<cap-sheet-title>Angular sheet</cap-sheet-title>
</cap-sheet-content>
</cap-sheet-view>
</cap-sheet>
`,
})
export class AppComponent implements AfterViewInit {
@ViewChild('sheet', { static: true }) sheet?: ElementRef<HTMLElement>;
ngAfterViewInit(): void {
if (this.sheet?.nativeElement) {
setupSheet(this.sheet.nativeElement, {
detents: ['18em', '32em'],
contentPlacement: 'bottom',
});
}
}
}
<script lang="ts">
import { sheet } from '@capgo/capacitor-sheets/svelte';
import '@capgo/capacitor-sheets';
</script>
<cap-sheet id="booking-sheet" use:sheet={{ detents: ['18em', '32em'], contentPlacement: 'bottom' }}>
<cap-sheet-trigger action="present">Open</cap-sheet-trigger>
<cap-sheet-view>
<cap-sheet-backdrop />
<cap-sheet-content>
<cap-sheet-handle />
<cap-sheet-title>Svelte sheet</cap-sheet-title>
</cap-sheet-content>
</cap-sheet-view>
</cap-sheet>
import { onCleanup, onMount } from 'solid-js';
import { setupSheet } from '@capgo/capacitor-sheets/solid';
import '@capgo/capacitor-sheets';
export function BookingSheet() {
let sheetEl!: HTMLElement;
onMount(() => {
const cleanup = setupSheet(sheetEl, {
detents: ['18em', '32em'],
contentPlacement: 'bottom',
});
onCleanup(cleanup);
});
return (
<cap-sheet id="booking-sheet" ref={sheetEl}>
<cap-sheet-trigger action="present">Open</cap-sheet-trigger>
<cap-sheet-view>
<cap-sheet-backdrop />
<cap-sheet-content>
<cap-sheet-handle />
<cap-sheet-title>Solid sheet</cap-sheet-title>
</cap-sheet-content>
</cap-sheet-view>
</cap-sheet>
);
}
ÉlémentFinalité
cap-sheetÉtat de la sheet, detents, gestes, comportement modal et événements
cap-sheet-triggerActions déclaratives : present, dismiss, toggle et step
cap-sheet-portalBody portal optionnel pour l'empilement des overlays
cap-sheet-viewConteneur viewport fixe avec padding safe-area et clavier
cap-sheet-backdropBackdrop synchronisé avec la progression
cap-sheet-contentSurface de la sheet accessible
cap-sheet-bleeding-backgroundExtension d'arrière-plan pour les sheets à bords arrondis
cap-sheet-handlePoignée de detent déplaçable et accessible au clavier
cap-sheet-titleTitre accessible
cap-sheet-descriptionDescription accessible
cap-sheet-special-wrapperHook de composition pour sheets, cards et lightboxes détachés
cap-sheet-stackGroupement de sheets empilés
cap-sheet-outletSortie de progression pour effets de profondeur, parallaxe et de page
cap-scrollAide à la progression du scroll
cap-fixedAide pour les couches fixes
cap-islandContenu lié en îlot flottant
cap-external-overlayContenu en overlay géré hors de l'arbre des sheets
OptionAttributPar défautDescription
contentPlacementcontent-placementbottomtop, bottom, left, right, ou center
detentsdetentsaucuneLongueurs CSS séparées par des espaces, telles que 18em 32em
safeAreasafe-areaautoBords de la safe-area protégés
swipeswipetrueActiver les gestes de pointeur, tactile, trackpad et molette
swipeDismissalswipe-dismissaltrueAutoriser les gestes pour revenir au detent 0
inertOutsideinert-outsidetrueEmpêcher l'interaction derrière les modal sheets
focusTrapfocus-traptrueMaintenir le focus du clavier dans la sheet
closeOnOutsideClickclose-on-outside-clicktrueFermer en cliquant sur l'arrière-plan ou la vue
closeOnEscapeclose-on-escapetrueFermer en appuyant sur Échap
nativeFocusScrollPreventionnative-focus-scroll-preventiontrueGarder les champs de saisie visibles au-dessus du clavier
themeColorDimmingtheme-color-dimmingautoAssombrir la couleur du thème WebView pendant le modal
  • @capgo/capacitor-sheets
  • @capgo/capacitor-sheets/react
  • @capgo/capacitor-sheets/vue
  • @capgo/capacitor-sheets/angular
  • @capgo/capacitor-sheets/svelte
  • @capgo/capacitor-sheets/solid

Si vous utilisez Premiers pas pour planifier le travail sur les plugins natifs, connectez-l’à Répertoire des plugins Capgo pour le workflow produit dans le répertoire des plugins Capgo, Plugins Capacitor par Capgo pour les détails d'implémentation dans les plugins Capacitor par Capgo, Ajouter ou mettre à jour des plugins pour les détails d'implémentation dans Adding or Updating Plugins, Alternatives aux plugins Ionic Enterprise pour le workflow produit dans Ionic Enterprise Plugin Alternatives, et Capgo Native Build pour le workflow produit dans Capgo Native Builds.