Passer à la navigation

Getting Started

  1. Installez le package

    Fenêtre de terminal
    npm install @capgo/capacitor-sheets
  2. Enregistrez les composants web

    import '@capgo/capacitor-sheets';
  3. Ajoutez la mise en page pour les zones de sécurité

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

    <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;
    }

Les zones de sécurité sont activées par défaut via safe-area="auto". La vue de la feuille lit les valeurs de l'environnement de navigateur et les variables de remplacement 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 feuille :

<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 applications avec des barres de statut en surimpression ou des barres système, gardez 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 se définit par true. Désactivez-le uniquement lorsque votre application possède déjà une évitement de clavier :

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

Tous les helpers de framework configurent le même élément personnalisé sous-jacent. Vous pouvez également contrôler une feuille 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 l'état contrôlé, les analyses, ou l'animation coordonnée :

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 se charge également les déclarations JSX pour les éléments personnalisés. Si TypeScript signale encore des balises inconnues, ajoutez un fichier de déclaration à l'intérieur de votre arborescence source :

src/capgo-feuilles.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émentObjectif
cap-sheetÉtat de la feuille, dénivellations, gestes, comportement modal et événements
cap-sheet-triggerActions déclaratives, fermer, basculer et étapes
cap-sheet-portalPortail de corps facultatif pour la superposition de couches
cap-sheet-viewHôte de vue fixe avec marge de zone de sécurité et padding de clavier
cap-sheet-backdropFond d'écran synchronisé avec progress-bar
cap-sheet-contentSurface de feuille accessible
cap-sheet-bleeding-backgroundExtension de fond pour les feuilles avec bords arrondis
cap-sheet-handleManche de détent pouvant être traîné et accessible au clavier
cap-sheet-titleTitre accessible
cap-sheet-descriptionDescription accessible
cap-sheet-special-wrapperFonction de composition pour des feuilles détachées, des cartes et des lightboxes
cap-sheet-stackGroupage de feuilles empilées
cap-sheet-outletSortie de progress-bar pour les effets de profondeur, de parallaxe et de page
cap-scrollAide de progression de la roue de défilement
cap-fixedAideur de couche fixe
cap-islandContenu de l'île flottante lié
cap-external-overlayContenu d'overlay géré en dehors de l'arbre de feuille
OptionAttributPar défautDescription
contentPlacementcontent-placementbottomtop, bottom, left, rightou center
detentsdetentsaucunLongueurs CSS séparées par espace telles que 18em 32em
safeAreasafe-areaautoBords de zone de sécurité protégée
swipeswipetrueActiver les gestes de pointeur, toucher, trackpad et roue
swipeDismissalswipe-dismissaltrueAutoriser les gestes pour fermer à la position de repos 0
inertOutsideinert-outsidetrueEmpêcher l'interaction derrière les feuilles de modal
focusTrapfocus-traptrueConserver l'attention du clavier à l'intérieur de la feuille
closeOnOutsideClickclose-on-outside-clicktrueFermer en cliquant sur le fond ou la vue
closeOnEscapeclose-on-escapetrueFermer en appuyant sur la touche Échap
nativeFocusScrollPreventionnative-focus-scroll-preventiontrueConserver les champs de saisie en focus visible au-dessus du clavier
themeColorDimmingtheme-color-dimmingautoDimmer la couleur du thème WebView pendant la 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 Accueil pour planifier le travail de plugin natif, connectez-le avec Capgo Répertoire des plugins pour le flux de travail du produit dans Capgo Répertoire des plugins, Capacitor Plugins par Capgo pour les détails d'implémentation dans Capacitor Plugins par Capgo, Ajout ou Mise à jour de Plugins pour les détails d'implémentation dans Ajout ou Mise à jour de Plugins, Alternatives de plugins d'entreprise Ionic Enterprise pour le flux de travail du produit dans les alternatives Ionic Enterprise Plugin Capgo Builds natifs pour le flux de travail du produit dans Capgo Builds natifs.