Foundation
PackagesUIComponentsDialogs

Dialog

モーダルダイアログコンポーネント。Compound Componentパターンで柔軟なレイアウトを構成できる。

いつ使うか

  • ユーザーの注意を集中させ、明示的な操作を求めるときに使用する(フォーム入力、確認、詳細表示など)
  • メインコンテンツの文脈を維持しつつ、一時的なサブタスクを実行するときに使用する

いつ使わないか

  • 単純な確認(「本当に削除しますか?」)には使わない。ConfirmDialog を使用する
  • 軽量な補足情報の表示には使わない。Tooltip や Popover を使用する
  • ページ全体を置き換えるコンテンツには使わない。ページ遷移を使用する

Usage

import {
  Dialog,
  DialogBody,
  DialogClose,
  DialogFooter,
  DialogHeader,
} from '@bi-shop-it/ui/dialog';

<Dialog trigger={<ActionButton label="開く" />}>
  <DialogHeader title="タイトル" description="説明文" />
  <DialogBody>コンテンツ</DialogBody>
  <DialogFooter>
    <DialogClose>
      <ActionButton label="キャンセル" variant="secondary" />
    </DialogClose>
    <ActionButton label="保存" />
  </DialogFooter>
</Dialog>;

Props

Dialog

Propデフォルト説明
triggerReactNodeダイアログを開くトリガー要素
childrenReactNodeダイアログの中身(DialogHeader, DialogBody, DialogFooter を配置)
openboolean外部から開閉を制御する場合に使用する
onOpenChange(open: boolean) => void開閉状態が変化したときのコールバック
size'sm' | 'md' | 'lg''md'ダイアログの横幅

DialogHeader

Propデフォルト説明
titlestringダイアログのタイトル
descriptionstringタイトル下の説明テキスト
hasCloseButtonbooleantrue閉じるボタンの表示
childrenReactNode追加コンテンツ

DialogBody

Propデフォルト説明
childrenReactNodeスクロール可能なコンテンツ領域

DialogFooter

Propデフォルト説明
childrenReactNodeアクションボタンを配置する領域(右寄せ、gap-2)

DialogClose

Propデフォルト説明
childrenReactNodeクリックでダイアログを閉じる振る舞いを付与

状態

デフォルト

<Dialog trigger={<ActionButton label="ダイアログを開く" />}>
  <DialogHeader
    description="基本的なダイアログの例です。"
    title="ダイアログタイトル"
  />
  <DialogBody>
    <p>ダイアログのコンテンツ領域です。</p>
  </DialogBody>
  <DialogFooter>
    <DialogClose>
      <ActionButton label="キャンセル" variant="secondary" />
    </DialogClose>
    <ActionButton label="保存" />
  </DialogFooter>
</Dialog>

フォームコンテンツ

DialogBody に任意のフォーム要素を配置できる。

<Dialog trigger={<ActionButton label="フォームを開く" variant="outline" />}>
  <DialogHeader
    description="プロフィール情報を入力してください。"
    title="プロフィール編集"
  />
  <DialogBody>
    <div className="flex flex-col gap-4">
      <input type="text" placeholder="名前" />
      <input type="email" placeholder="メールアドレス" />
    </div>
  </DialogBody>
  <DialogFooter>
    <DialogClose>
      <ActionButton label="キャンセル" variant="secondary" />
    </DialogClose>
    <ActionButton label="更新" />
  </DialogFooter>
</Dialog>

サイズ

size で横幅を変更できる。sm(max-w-sm)、md(max-w-lg)、lg(max-w-2xl)。

<Dialog size="sm" trigger={<ActionButton label="Small" />}>...</Dialog>
<Dialog size="md" trigger={<ActionButton label="Medium" />}>...</Dialog>
<Dialog size="lg" trigger={<ActionButton label="Large" />}>...</Dialog>

アクセシビリティ

コンポーネントが内部で処理すること

  • Radix UI の Dialog プリミティブに基づき、role="dialog"aria-modal="true"aria-labelledbyaria-describedby を自動的に設定する
  • Escape キーでダイアログを閉じることができる
  • ダイアログ外のクリック(オーバーレイ)でダイアログを閉じることができる
  • ダイアログが開いている間、フォーカストラップが有効になる
  • ダイアログを閉じると、トリガー要素にフォーカスが戻る

利用者が対応すること

  • DialogHeadertitle にダイアログの目的が伝わるテキストを設定すること
  • フォーカス可能な要素が少なくとも1つダイアログ内に含まれるようにすること

関連コンポーネント

  • ConfirmDialog — 確認ダイアログに特化した Composite コンポーネント。Props 駆動で簡潔に使用できる

On this page