Popover

クリックで開く非モーダルの浮遊パネル。Dialog と違い背景は操作でき、Escape・外側クリックで閉じてトリガーにフォーカスを戻します。ホバーで出る補足は Tooltip、メニュー項目は Dropdown を使います。

プレビュー

使いどころ

使う場面

  • ボタンやリンク、入力欄など、操作できる中身を、クリックで開く小さなパネルに入れる(フィルター、簡単な設定、日付の選択)
  • PopoverTrigger と PopoverContent を Popover で包み、中の閉じるボタンには PopoverClose を使う
  • side(既定 "bottom")と align で出る位置を決める。画面の端では反対側に切り替わる。anchorRef で別の要素に寄せられる

使わない場面

  • 補足を読むだけのとき。操作できる中身がなければ Tooltip か HelpButton を使う
  • 背景の操作を止めたい確認や必須の入力。Dialog を使う
  • 大きなフォームや長いコンテンツ。Drawer か Dialog を使う
  • 操作を並べたメニュー。Dropdown を使う

使い方

import { Button, Popover, PopoverClose, PopoverContent, PopoverTrigger } from "kaze-design-system";

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">表示設定</Button>
  </PopoverTrigger>
  <PopoverContent aria-label="表示設定" side="bottom" align="start">
    <p>一覧の密度と並び順を変更できます。</p>
    <PopoverClose asChild>
      <Button size="sm">閉じる</Button>
    </PopoverClose>
  </PopoverContent>
</Popover>

プロパティ

名前型デフォルト説明
childrenReactNodeなしPopoverTrigger と PopoverContent
openbooleanなし開閉状態(制御)
defaultOpenbooleanfalse初期の開閉状態(非制御)
onOpenChange(open: boolean) => voidなし開閉が変わる時のコールバック
PopoverTrigger.asChildbooleanfalse子要素をそのままトリガーにする。aria-expanded / aria-controls / aria-haspopup="dialog" が注入される
PopoverContent.side"top" | "bottom" | "left" | "right""bottom"トリガーのどの側に出すか。画面からはみ出すときは反対側へ反転する
PopoverContent.align"start" | "center" | "end""center"トリガーとの揃え位置
PopoverContent.sideOffsetnumber8トリガーとの間隔(px)
PopoverContent.anchorRefRefObject<HTMLElement | null>なしトリガーの代わりに位置の基準にする要素
PopoverContent.onOpenAutoFocus(event: Event) => voidなし開いた直後に呼ばれる。preventDefault() で初期フォーカスを自前で制御できる
PopoverClose.asChildbooleanfalse子要素をそのまま閉じるボタンにする

型と必須かどうかはソースの型定義から自動で生成しています。表にない HTML 標準の属性(className や aria-* など)も、ルート要素にそのまま渡せます。

キーボード操作

キー動作
Enter / Spaceトリガーを押して開閉する
Tab / Shift + Tab開いたパネル内の操作にフォーカスを移す(フォーカスは閉じ込めない)
Escapeパネルを閉じる。フォーカスがトリガーかパネルの中にあればトリガーに戻る

アクセシビリティ

  • トリガーには aria-haspopup="dialog"、aria-expanded、aria-controls が付き、パネルは role="dialog"(モーダルではない)
  • 開くと最初のフォーカスできる要素にフォーカスが移る。なければパネル自体。onOpenAutoFocus で preventDefault すると初期フォーカスを自分で決められる
  • 背景は inert にならず、スクロールも止まらない。パネルの外をクリックすると閉じる
  • パネルに名前が必要なら aria-label か aria-labelledby を渡す

関連するコンポーネント