Gyoza UI

Dialog

HTML Dialog APIを使用したネイティブなダイアログコンポーネント

概要

DialogコンポーネントはHTML <dialog>要素を使用し、ネイティブなモーダルダイアログ機能を提供します。showModal()メソッドを活用し、バックドロップ、フォーカストラップ、ESCキーでの閉じる動作などを自動的に処理します。

デモ

基本的な使い方

import { Button } from "@/registry/ui/button"
import {
  Dialog,
  DialogClose,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/registry/ui/dialog"
import { Input } from "@/registry/ui/input"
import { Label } from "@/registry/ui/label"

export function DialogDemo() {
  return (
    <Dialog>
      <DialogTrigger asChild>
        <Button variant="outline">ダイアログを開く</Button>
      </DialogTrigger>
      <DialogContent className="sm:max-w-[425px]">
        <DialogHeader>
          <DialogTitle>プロフィールの編集</DialogTitle>
          <DialogDescription>
            プロフィールの変更を行います。完了したら保存をクリックしてください。
          </DialogDescription>
        </DialogHeader>
        <div className="grid gap-4 py-4">
          <div className="grid grid-cols-4 items-center gap-4">
            <Label htmlFor="name" className="text-right">
              名前
            </Label>
            <Input id="name" defaultValue="山田 太郎" className="col-span-3" />
          </div>
          <div className="grid grid-cols-4 items-center gap-4">
            <Label htmlFor="username" className="text-right">
              ユーザー名
            </Label>
            <Input id="username" defaultValue="@yamada" className="col-span-3" />
          </div>
        </div>
        <DialogFooter>
          <DialogClose asChild>
            <Button type="submit">変更を保存</Button>
          </DialogClose>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  )
}

インストール

npx shadcn@latest add https://your-registry-url.com/r/dialog.json

Props

Dialog

Prop

Type

DialogTrigger

Prop

Type

DialogContent

Prop

Type

ネイティブ機能

HTML <dialog>要素により、以下の機能が自動的に提供されます:

  • トップレイヤー: ダイアログは常に他のすべての要素の上に表示されます(z-index管理不要)
  • バックドロップ: ::backdrop疑似要素で背景を暗くし、クリックをブロックします
  • フォーカストラップ: ダイアログが開いている間、フォーカスはダイアログ内に制限されます
  • ESCキーで閉じる: ESCキーを押すとダイアログが閉じます
  • アクセシビリティ: スクリーンリーダーなどの支援技術に対して適切な役割と状態を提供します

ブラウザ互換性

HTML <dialog>要素は主要なモダンブラウザで広くサポートされています:

  • ✅ Chrome 37+
  • ✅ Edge 79+
  • ✅ Firefox 98+
  • ✅ Safari 15.4+

技術的詳細

  • useRefを使用して<dialog>要素への参照を管理し、showModal()close()メソッドを呼び出します。
  • React.createContextを使用して、トリガーとコンテンツ間で開閉状態を共有します。
  • DialogCloseコンポーネント内のボタンクリックイベントの伝播を停止(e.stopPropagation())することで、ダイアログのバックドロップクリックハンドラーとの干渉を防いでいます。