Saltar al contenido

Inicio rápido

  1. Instalar el paquete

    Ventana de terminal
    npm install @capgo/capacitor-sheets
  2. Registrar los componentes web

    import '@capgo/capacitor-sheets';
  3. Agregar la configuración de viewport para áreas seguras

    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
  4. Renderizar una hoja

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

Las áreas seguras están habilitadas por defecto a través de safe-area="auto". La vista de la hoja de cálculo lee tanto los valores del entorno del navegador como las variables de fallback 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)

Elegir los bordes protegidos por hoja:

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

Para aplicaciones con barras de estado de superposición o barras de sistema, mantenga los plugins nativos responsables de exponer valores de inset correctos:

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

El manejo del teclado está controlado por native-focus-scroll-prevention, que por defecto es true. Deshabilitarlo solo cuando su aplicación ya tenga el control de evitación del teclado:

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

Todos los ayudantes de marco configuran el mismo elemento personalizado subyacente. También puedes controlar una hoja directamente:

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

Escuchar eventos para estado controlado, análisis o animación coordinada:

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

Importar desde @capgo/capacitor-sheets/react también registra tipos de JSX para los elementos personalizados. Si TypeScript aún informa etiquetas desconocidas, agrega un archivo de declaración dentro de tu árbol de origen:

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>
);
}
ElementoPropósito
cap-sheetEstado de hoja, detentes, gestos, comportamiento modal y eventos
cap-sheet-triggerAcciones presentes, de cierre, de alternancia y de paso declarativas
cap-sheet-portalPortal de cuerpo opcional para capas de superposición
cap-sheet-viewHuespéd de vista fija con relleno de zona segura y relleno de teclado
cap-sheet-backdropFondo sincronizado con fondo de progreso
cap-sheet-contentSuperficie de hoja accesible
cap-sheet-bleeding-backgroundExtensión de fondo para hojas con borde redondeado
cap-sheet-handleManija de detente arrastrable y accesible con teclado
cap-sheet-titleTítulo accesible
cap-sheet-descriptionDescripción accesible
cap-sheet-special-wrapperHook de composición para hojas, tarjetas y ventanas emergentes desacopladas
cap-sheet-stackGrupo de hojas apiladas
cap-sheet-outletSalida de progreso para efectos de profundidad, parallax y de página
cap-scrollAyuda de progreso de desplazamiento
cap-fixedAyuda de capa fija
cap-islandContenido de isla flotante relacionado
cap-external-overlayContenido de capa de sobremanejo gestionado fuera del árbol de hojas

Opciones principales

Opciones principales
OpciónAtributoPredeterminadoDescripción
contentPlacementcontent-placementbottomtop, bottom, left, right, o center
detentsdetentsningunoLongitudes CSS separadas por espacio, como 18em 32em
safeAreasafe-areaautoÁreas de seguridad seguras protegidas
swipeswipetrueHabilitar gestos de puntero, toque, trackpad y rueda
swipeDismissalswipe-dismissaltruePermitir que los gestos desaparezcan hasta el detente 0
inertOutsideinert-outsidetruePrevenir la interacción detrás de hojas de estilo modal
focusTrapfocus-traptrueMantener el enfoque del teclado dentro de la hoja
closeOnOutsideClickclose-on-outside-clicktrueDesaparecer al hacer clic en el fondo o la vista
closeOnEscapeclose-on-escapetrueIgnorar al presionar Escape
nativeFocusScrollPreventionnative-focus-scroll-preventiontrueMantener los campos de entrada visibles por encima del teclado
themeColorDimmingtheme-color-dimmingautoAclarar el color del tema de WebView mientras se muestra un 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 estás utilizando Getting Started para planificar el trabajo de plugin nativo, conectarlo con Capgo Directorio de Plugin para el flujo de trabajo del producto en Capgo Directorio de Plugin, Capacitor Plugins by Capgo for the implementation detail in Capacitor Plugins by Capgo, Agregar o Actualizar Plugins para el detalle de implementación en Agregar o Actualizar Plugins, Alternativas de Plugins de Nivel de Negocio de Ionic para el flujo de trabajo del producto en Alternativas de Plugins de Nivel de Negocio de Ionic, y Capgo Compilaciones Nativas para el flujo de trabajo del producto en Capgo Compilaciones Nativas.