Dialog

今の画面を離れずに、操作の影響や内容を確認します。

内容を確認する

データは変更しません。

見出しと本文を確認してから、閉じるボタン・Escape・背景のクリックで戻れます。

確認・キャンセル・主要操作

下書きを公開しますか?

この例では実際の公開は行いません。

公開すると、記事が一覧に表示されます。

危険操作・長い操作ラベル

記事を削除しますか?

この操作を取り消すことはできません。

この例では確認画面を閉じるだけで、データは削除しません。

フォーム・必須入力・入力欄への初期フォーカス

担当者を登録する

保存は行わず、入力が有効なら画面を閉じます。

必須項目です。

エラー・処理中・無効な操作

保存できませんでした

通信を確認してから、もう一度お試しください。入力内容は保持されています。

この例は表示の確認用です。通信処理は行いません。

処理中の表示

主要操作の処理中表示を確認できます。この例の状態は自動では変わりません。

利用できない操作

この画面は開けません。

長文・本文スクロール・広いダイアログ

公開前の確認事項

確認事項 1

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 2

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 3

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 4

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 5

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 6

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 7

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 8

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 9

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 10

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 11

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

確認事項 12

本文が長い場合は、この領域をスクロールして確認します。見出しの閉じる操作から戻れます。

タイトルと説明のみ・長い見出し

公開前に記事の文章と添付ファイルと公開設定をまとめて確認してください

本文がない場合でも、説明と閉じる操作を表示します。

ダイアログ内のDropdownMenu

添付ファイルの操作

メニューを閉じても、このダイアログは開いたままです。

使いどころ

  • 削除や公開の前の確認、短いフォームの入力のように、答えるまで背後の画面を操作させない時に使います。
  • 背後の操作を妨げない補足や小さな操作は Popover、リンクや対象の概要を近くに見せる時は HoverCard を使います。
  • 影響のある操作を設定画面に並べる時は DangerZone に置き、確認にこの Dialog を渡します。
  • 長い手順や、ほかの画面と行き来する作業は、ダイアログに詰めず作業面のページにします。

使い方

DialogController を dialog として登録します。id は画面内で一意にします。閉じたネイティブの dialog と開く操作を出力し、開く操作を押すとモーダルで開きます。

パネルは白いパネル(1px #bbb の枠、角丸5px、外への柔らかい影)で、見出し・本文・操作欄に分け、長い本文は本文だけをスクロールします。見出しは問いの形の赤茶(#a52a2a)の太字で、本文の大きさ(13px)です。見出しと本文の間に罫線は引きません。description は見出しの下に12pxの灰色の文字で置きます。操作欄は末尾側に揃えます。見出しの行の末尾の角に、枠も塗りも持たない灰色の×の閉じる操作を置き、closeLabel はその名前です。actions を渡すと、操作欄の先頭に closeLabel の文言の閉じる操作を置き、その後ろに actions を並べます。

操作欄の操作で閉じるには data-dialog-target="close" を付けます。確認の後の保存・削除・通信は利用側が行い、dialog:close などのイベントや、操作の onclick で受け取ります。

フォームを載せる時は、form に method="dialog" を付けると、入力が有効な時だけ送信で閉じます。送信で閉じる時も dialog:beforeclose・dialog:close を発火し、dialog:beforeclose を取り消すと開いたままにします。initialFocus を content にし、最初に入力する欄に autofocus を付けます。本文の外の操作欄から送る時は、送信の Button に form でフォームのidを渡します。

size はパネルの幅の上限で、compact は26rem、default は32rem、wide は52remです。画面が狭い時は、画面の幅から余白を引いた幅に収めます。

幅40rem以下のタッチ画面では、画面の下端に付くシートとして出し、上端に灰色の短いハンドルを置きます。上端のハンドルと見出しを下へ引くと閉じます(少し動かしただけでは閉じません)。

開閉はその場で切り替え、アニメーションはしません。開いている間は背後を濃い灰色(#323136)の80%で覆って暗くし、Escape・閉じる操作・背景を押すと閉じ、フォーカスを開いた操作へ戻します。JavaScriptなしでは開きません。

キーボード

Dialogのキーボード操作
キー動作
Enter / Space(開く操作)ダイアログを開き、見出し(initialFocus が content なら本文の autofocus の欄)へ移ります。
Tab / Shift+Tabダイアログの中の操作だけを巡ります。
Escapeダイアログを閉じ、開いた操作へフォーカスを戻します。

アクセシビリティ

  • パネルはネイティブのモーダル dialog で、見出しを名前(aria-labelledby)、description を説明(aria-describedby)にします。背後の画面は操作できず、読み上げからも外れます。
  • 開く操作は aria-haspopup="dialog"・aria-controls・aria-expanded を持ちます。
  • 既定では見出しへフォーカスを移し、読み上げが題名から始まるようにします。見出しは tabindex="-1" で、Tabの巡回には入りません。
  • 見出しの横の閉じる操作はアイコンだけなので、closeLabel を aria-label にします。

イベント

Dialogが発火するイベント
イベント内容
dialog:beforeopen開く操作を押した直後、開く前。取り消せます。detail.reason は pointer または keyboard です。
dialog:open開いた後。detail.reason は dialog:beforeopen と同じです。
dialog:beforeclose閉じる前。取り消せます(preventDefault() で開いたままにします)。detail.reason は pointer(閉じる操作や背景を押した時)・keyboard(Escapeや、キーで閉じる操作を押した時)・swipe(シートを下へ引いた時)・submit(method="dialog" のフォームを送信した時)、detail.returnValue は閉じた時の値(送信で閉じた時は送信した操作の value)です。背景を押した時は、ブラウザが closedby に対応しているかによらず pointer です。
dialog:close閉じた後。detail は reason と returnValue です。

API

Dialog

閉じたnative dialogを出力する。保存や削除の処理は利用側で実装する。

Dialogのprops
名前型既定値説明
id必須stringdialog要素のid。画面内で一意にする。見出しは<id>-title、説明は<id>-descriptionになる。
title必須string見出し。ダイアログの名前として読み上げる。
trigger必須string開く操作の文言。
descriptionstring見出しの下に置く短い説明。ダイアログの説明(aria-describedby)になる。
triggerVariantButtonVariant"secondary"開く操作の見た目。削除の確認ならdangerにする。
triggerDisabledboolean開く操作を押せなくする。
size"compact" | "default" | "wide""default"パネルの幅。compactは26rem、defaultは32rem、wideは52remを上限にする。
closeLabelstring"閉じる"見出しの横の閉じる操作の名前。actionsがある時は、操作欄の先頭に置くキャンセル操作の文言にもなる。
actionsChild操作欄に並べる操作。渡すと、閉じる操作(closeLabel)の後ろに置く。押して閉じる操作にはdata-dialog-target="close"を付ける。
initialFocus"title" | "content""title"contentでは本文内のautofocus、または最初の操作へ移る。
childrenChild本文。長い時は本文だけをスクロールする。

登録するcontroller:dialog(DialogController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/overlay.css、components/dialog.css、components/icon.css

ButtonVariant

操作の見た目の役割。primaryは平らな緑の塗りに白い太字(角丸4px)、secondaryは平らな白い面と1pxの灰色の枠(角丸5px)、 dangerは平らな赤の塗りに白い文字(角丸4px)、linkは面も枠も持たない青緑の文字に下線。

値:"primary" | "secondary" | "danger" | "link"

コード

HTML
Hono JSX