ActionDialog

ユーザーに確認や単純な操作を求めるためのダイアログコンポーネントです。フォーム要素を含まない確認・実行のダイアログを表示するときに使います。

モーダルなダイアログです。ダイアログの表示中、ダイアログの裏側の領域はスクリム(幕)で隠され、操作を受け付けません。

使用上の注意

モーダルなUIの使いどころもあわせて参照してください。

ダイアログを乱用しない

ActionDialogの表示中、ユーザーの操作範囲は強制的に制限されます。

ダイアログが表示されることによってユーザーの操作を妨げてしまわないか、ダイアログとして表示する・操作させるべき内容なのか、慎重にユースケースを定義し、使用を検討してください。

複数のモーダルダイアログを同時に表示しない

モーダルダイアログ(ActionDialogやMessageDialog)を1つの操作で複数個表示したり、モーダルダイアログ上の操作によって2つ目のモーダルダイアログを表示したりすることは、原則として推奨されません。3つの画面が重なり、画面どうしの関係性や、どんな操作をすれば何が起こるのかが予測しづらくなるためです。

なお、モーダルダイアログ上の操作によってModelessDialogを表示したり、ModelessDialogが開いている状態でモーダルダイアログを開いたりすることは問題ありません。

ダイアログコンテンツにフォームが含まれている場合は、FormDialogの使用を検討する

ダイアログコンテンツにフォーム要素を含む場合にはFormDialogの使用を検討します。
詳しくはFormDialogを参照してください。

レイアウト

基準サイズ

SmartHR UIでは、ダイアログの横幅をサイズ(sizeprops)で指定できます。各サイズの基準値は幅のセマンティックトークンを参照しています。

大きさ幅トークン値(px)
XScol3424px
Scol4576px
Mcol5728px
Lcol6880px
XLcol71032px
XXLcol81184px
FULL-width: 100%

XS

入力要素を1つだけ持つダイアログなど、内容が極めて少ないダイアログに使います。

S

要素が少なく、要素が垂直方向に並ぶ、広い横幅を必要としないダイアログに使います。

M

数行に渡るテキストを表示したり、水平方向に要素を並べて表示したりする標準的なダイアログに使います。

L

テーブルを表示したり、ダイアログを複数カラムに分割するなど、広い横幅が必要なダイアログに使います。

XL

テーブルを表示したり、ダイアログを複数カラムに分割するなど、広い横幅が必要なダイアログに使います。Lではどうしてもコンテンツが収まりきらない場合に使います。

XXL

テーブルを表示したり、ダイアログを複数カラムに分割するなど、広い横幅が必要なダイアログに使います。XLではどうしてもコンテンツが収まりきらない場合に使います。

FULL

テーブルを表示したり、ダイアログを複数カラムに分割するなど、広い横幅が必要なダイアログに使います。XXLではどうしてもコンテンツが収まりきらない場合に使います。

表示位置

表示位置は、画面の上下左右中央に表示されます。

アクセシビリティ

基本的なアクセシビリティ機能

キーボード操作

ESCキーを押すことでダイアログを閉じることができます。

デザインパターン

削除操作をする際の確認のダイアログについては、削除ダイアログを参照してください。

それ以外のパターンについては、モーダルなUIを参照してください。

モバイル

モバイルでは、通常のダイアログに加えて、拡大したダイアログを使用できます。

表示する情報量に応じて拡大したダイアログの採用を検討する

デスクトップに比べて、モバイルでは表示できる情報量に限りがあります。
拡大したダイアログを利用することで、モバイルの表示領域を最大限使って情報を表示できます。

例えば、次のような場合に拡大したダイアログが有効です。

  • ダイアログ内で多くのスクロールを伴う場合
  • 入力や編集など、キーボードでの入力操作が多い場合
Do
Do
通常のダイアログで表示する
Do
Do
拡大したダイアログで表示する

レイアウト

余白

モバイルで通常のダイアログを使用する場合、余白は以下の通りです。

アクションダイアログの余白の説明図

拡大したダイアログの画面や、コンポーネント内の余白は以下のとおりです。
基本的には、代表的なダイアログ内レイアウトのパディングに従って配置しますが、ダイアログの左右と裏側の領域(スクリムで隠されている領域)のパディングは0(0px)とします。

拡大したアクションダイアログの余白の説明図

フッターエリアのレイアウト

[キャンセル]ボタンとPrimaryボタンをClusterで横いっぱいに並べます。

SubActionArea(任意)は、上記のButton群の下部に配置します。

SubActionAreaを表示した拡大したアクションダイアログの例

使い方チェックリスト

ActionDialog
参照元:使用上の注意 > ダイアログを乱用しない 「使用上の注意 > ダイアログを乱用しない」の本文へ移動
  • Should
    ダイアログとして表示する・操作させるべき内容なのか慎重にユースケースを定義し、使用を検討する
参照元:使用上の注意 > 複数のモーダルダイアログを同時に表示しない 「使用上の注意 > 複数のモーダルダイアログを同時に表示しない」の本文へ移動
  • Avoid
    モーダルダイアログを 1 つの操作で複数個表示したり、モーダルダイアログ上の操作によって 2 つ目のモーダルダイアログを表示したりしない
参照元:使用上の注意 > ダイアログコンテンツにフォームが含まれている場合は、FormDialogの使用を検討する 「使用上の注意 > ダイアログコンテンツにフォームが含まれている場合は、FormDialogの使用を検討する」の本文へ移動
  • Should
    ダイアログコンテンツにフォーム要素を含む場合は FormDialog の使用を検討する
参照元:レイアウト > 基準サイズ > `XS` 「レイアウト > 基準サイズ > `XS`」の本文へ移動
  • Should
    入力要素を 1 つだけ持つなど、内容が極めて少ないダイアログには `XS` を使う
参照元:レイアウト > 基準サイズ > `S` 「レイアウト > 基準サイズ > `S`」の本文へ移動
  • Should
    要素が少なく、要素が垂直方向に並ぶ、広い横幅を必要としないダイアログには `S` を使う
参照元:レイアウト > 基準サイズ > `M` 「レイアウト > 基準サイズ > `M`」の本文へ移動
  • Should
    数行に渡るテキストの表示や、水平方向に要素を並べて表示する標準的なダイアログには `M` を使う
参照元:レイアウト > 基準サイズ > `L` 「レイアウト > 基準サイズ > `L`」の本文へ移動
  • Should
    テーブルの表示やダイアログを複数カラムに分割するなど、広い横幅が必要なダイアログには `L` を使う
参照元:レイアウト > 基準サイズ > `XL` 「レイアウト > 基準サイズ > `XL`」の本文へ移動
  • Should
    広い横幅が必要で、`L` ではコンテンツが収まりきらないダイアログには `XL` を使う
参照元:レイアウト > 基準サイズ > `XXL` 「レイアウト > 基準サイズ > `XXL`」の本文へ移動
  • Should
    広い横幅が必要で、`XL` ではコンテンツが収まりきらないダイアログには `XXL` を使う
参照元:レイアウト > 基準サイズ > `FULL` 「レイアウト > 基準サイズ > `FULL`」の本文へ移動
  • Should
    広い横幅が必要で、`XXL` ではコンテンツが収まりきらないダイアログには `FULL` を使う

Props

ActionDialog props

onToggle
(isOpen: boolean) => void
onClose
() => void
onOpen
() => void
onPressEscape
(close: () => void) => void
onClickClose
(close: () => void) => void
ref
(instance: HTMLDivElement) => voidRefObject<HTMLDivElement>
width非推奨
stringnumber

@deprecated ダイアログの幅を指定する場合は、width ではなく size を使用してください。 ダイアログの幅

size
"XS""S""M""L""XL""XXL""FULL"

ダイアログの大きさ

heading必須
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortal{ [x: string]: any; [x: number]: any; [x: symbol]: any; }
subActionArea
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortal

ダイアログフッターの左端操作領域

responseStatus
ResponseStatusWithoutProcessing{ status: "processing"; }
firstFocusTarget
RefObject<HTMLElement>

ダイアログを開いた時にフォーカスする対象

onClickOverlay
() => void

オーバーレイをクリックした時に発火するコールバック関数 @todo イベントハンドラー命名規則に従い handleClickOverlay に変更すべき(影響範囲大のため別PR)

ariaLabel
string

ダイアログの aria-label

ariaLabelledby
string

ダイアログの aria-labelledby

contentBgColor
"BACKGROUND""COLUMN""BASE_GREY""OVER_BACKGROUND""HEAD""BORDER""ACTION_BACKGROUND""WHITE""GREY_5""GREY_6""GREY_7""GREY_9""GREY_20"

コンテンツ部分の背景色

contentPadding
012"XS""S""M""XXS""L""XL""XXL"340.250.50.751.251.52.53.58-0.25-0.5-0.75-1-1.25-1.5-2-2.5-3-3.5-4-8"X3S""X3L"{ block?: Gap; inline?: Gap; }
portalParent
HTMLElement

DOM 上でダイアログの要素を追加する親要素。 ダイアログのマウントと同時に確定していない要素(例: ダイアログの祖先要素の ref)を 渡すと、その要素がまだ DOM に存在しない可能性があるため意図通りに動作しない。 呼び出し側で要素が確定してから渡すこと。

closeButton
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortalany
actionButton必須
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortalany
onClickAction必須
(e: MouseEvent<Element, MouseEvent>, helpers: { close: () => void; }) => void

アクションボタンをクリックした時に発火するコールバック関数

ControlledActionDialog props

ref
(instance: HTMLDivElement) => voidRefObject<HTMLDivElement>
width非推奨
stringnumber

@deprecated ダイアログの幅を指定する場合は、width ではなく size を使用してください。 ダイアログの幅

size
"XS""S""M""L""XL""XXL""FULL"

ダイアログの大きさ

heading必須
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortal{ [x: string]: any; [x: number]: any; [x: symbol]: any; }
subActionArea
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortal

ダイアログフッターの左端操作領域

responseStatus
ResponseStatusWithoutProcessing{ status: "processing"; }
firstFocusTarget
RefObject<HTMLElement>

ダイアログを開いた時にフォーカスする対象

isOpen必須
falsetrue

ダイアログを開いているかどうか

onClickOverlay
() => void

オーバーレイをクリックした時に発火するコールバック関数 @todo イベントハンドラー命名規則に従い handleClickOverlay に変更すべき(影響範囲大のため別PR)

onPressEscape
(e: KeyboardEvent) => void

エスケープキーを押下した時に発火するコールバック関数 @todo イベントハンドラー命名規則に従い handlePressEscape に変更すべき(影響範囲大のため別PR)

ariaLabel
string

ダイアログの aria-label

ariaLabelledby
string

ダイアログの aria-labelledby

contentBgColor
"BACKGROUND""COLUMN""BASE_GREY""OVER_BACKGROUND""HEAD""BORDER""ACTION_BACKGROUND""WHITE""GREY_5""GREY_6""GREY_7""GREY_9""GREY_20"

コンテンツ部分の背景色

contentPadding
012"XS""S""M""XXS""L""XL""XXL"340.250.50.751.251.52.53.58-0.25-0.5-0.75-1-1.25-1.5-2-2.5-3-3.5-4-8"X3S""X3L"{ block?: Gap; inline?: Gap; }
portalParent
HTMLElement

DOM 上でダイアログの要素を追加する親要素。 ダイアログのマウントと同時に確定していない要素(例: ダイアログの祖先要素の ref)を 渡すと、その要素がまだ DOM に存在しない可能性があるため意図通りに動作しない。 呼び出し側で要素が確定してから渡すこと。

closeButton
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortalany
onClickClose必須
(e?: MouseEvent<HTMLButtonElement, MouseEvent> | KeyboardEvent) => void

閉じるボタンをクリックした時に発火するコールバック関数

actionButton必須
stringnumberfalsetrueReactElement<any, string | JSXElementConstructor<any>>Iterable<ReactNode>ReactPortalany
onClickAction必須
(e: MouseEvent<Element, MouseEvent>, helpers: { close: () => void; }) => void

アクションボタンをクリックした時に発火するコールバック関数