Dialog
Einführung
Ein modal über der Seite eingeblendetes Fenster, das eine Benutzerinteraktion verlangt, bevor fortgefahren wird.
Hydration
Tier 1 — standardmäßig auto-interaktiv. Ein Dialog hat keinen sinnvollen statischen Fallback — Öffnen, Fokus-Einfangen und ESC-Behandlung erfordern alle clientseitiges JavaScript — sodass er standardmäßig als Insel hydriert. Übergeben Sie interactive={false}, um eine statische, inerte Dialog-Hülle zu rendern, die keinen Client-JS mitliefert.
interactive-Prop | Ergebnis |
|---|---|
| weggelassen | Hydriert als Insel (Standard) |
true | Hydriert als Insel |
false | Statisch — kein Client-JS |
Alle Interaktivitätsentscheidungen der Bibliothek laufen über den gemeinsamen shouldHydrate()-Helfer in app/components/ui/island-utils.ts.
Barrierefreiheit
Entspricht dem Dialog (Modal) WAI-ARIA-Entwurfsmuster. Wenn hydriert (interactive ist standardmäßig true), bietet der Dialog das folgende Verhalten:
- Fokus wandert beim Öffnen in den Dialog — zu
initialFocusEl(), sonst dem ersten fokussierbaren Element, sonst dem Inhalt selbst. - Fokus wird beim Öffnen eingefangen —
Tab/Shift+Tabzirkulieren nur innerhalb des Dialoginhalts. Verschachtelte Dialoge werden behandelt: nur der oberste Dialog fängt ein und besitztEscape. Escapeschließt den Dialog (sofern nichtcloseOnEscape={false}).- Hintergrund ist inert — alles außerhalb des Dialogs (einschließlich eines übergeordneten Dialogs hinter einem verschachtelten) erhält
inertund wird aus der Tab-Reihenfolge entfernt, während der Dialog-Unterbaum interaktiv bleibt. - Der Bildlauf des Bodys ist gesperrt, solange mindestens ein Dialog geöffnet ist, und wird wiederhergestellt, wenn der letzte schließt.
- Fokus kehrt beim Schließen zum Auslöser zurück (oder zu
finalFocusEl(), sofern angegeben). - Zugänglicher Name — abgeleitet aus
title(aria-labelledby) oder einem explizitenaria-label. Ein clientseitigesconsole.warnwird ausgegeben, wenn keines von beiden vorhanden ist. role="alertdialog"— übergeben Sierole="alertdialog"für destruktive Bestätigungen und richten SieinitialFocusElauf die Abbrechen-/Sicherheits-Aktion, sodass diese zuerst den Fokus erhält. MitcloseOnInteractOutside={false}kann der Dialog nur über eine Schaltfläche oderEscapegeschlossen werden.
Verwendung
Einfacher Dialog
Confirm action
Confirm action
import { Dialog, Button } from "../components/ui";
export default function MyPage() {
return (
<Dialog
trigger={<Button>Open Dialog</Button>}
title="Confirm action"
description="Are you sure you want to continue?"
body="This action cannot be undone."
cancel={<Button variant="outline">Cancel</Button>}
confirm={<Button>Confirm</Button>}
/>
);
}
CMS-Seitenbauer
Diese Komponente ist als dialog-Block im Seitenbauer (content/pages/*.json) verfügbar. trigger ist eine verschachtelte Blockliste (das CMS übermittelt immer ein Array):
{
"type": "dialog",
"title": "Confirm action",
"description": "Are you sure you want to continue?",
"confirmText": "Confirm",
"cancelText": "Cancel",
"trigger": [{ "type": "button", "text": "Open Dialog" }]
}
Eigenschaften
Dialog
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
trigger | JSX.Element | Element, das den Dialog bei Aktivierung öffnet. |
| title | `string \ | JSX.Element` | Der Dialogtitel. |
| description | `string \ | JSX.Element` | Die Dialogbeschreibung. |
| body | `string \ | JSX.Element` | Der Hauptinhalts-Text. |
| footer | `string \ | JSX.Element` | Benutzerdefinierter Fußzeilen-Inhalt. |
| cancel | JSX.Element | Element, das als Schließen-(Abbrechen-)Auslöser gerendert wird. |
| confirm | JSX.Element | Element, das als Aktions-Auslöser gerendert wird. |
| closable | boolean | Ob die Schließen-Schaltfläche angezeigt wird. Standard: true. |
| interactive | boolean | Aktiviert die clientseitige Hydration für interaktives Verhalten. |
| class | string | Benutzerdefinierte CSS-Klassen für das Wurzelelement. |
| role | `"dialog" \ | "alertdialog"` | Dialogvariante. Verwenden Sie "alertdialog" für destruktive Bestätigungen. Standard: "dialog". |
| aria-label | string | Zugänglicher Name, wenn kein title angegeben ist. |
| closeOnEscape | boolean | Schließt, wenn Escape gedrückt wird. Standard: true. |
| closeOnInteractOutside | boolean | Schließt, wenn auf den Hintergrund geklickt wird. Standard: true. |
| initialFocusEl | `() => HTMLElement \ | null` | Element, das beim Öffnen fokussiert wird. Standardmäßig das erste fokussierbare. |
| finalFocusEl | `() => HTMLElement \ | null` | Element, das beim Schließen fokussiert wird. Standardmäßig der Auslöser. |
Zusätzliche Eigenschaften (z. B. open, defaultOpen, onOpenChange, id) werden an das zugrunde liegende Dialog-Primitiv weitergeleitet.