アラートダイアログ
<script setup lang="ts">
import {
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogOverlay,
AlertDialogPortal,
AlertDialogRoot,
AlertDialogTitle,
AlertDialogTrigger,
} from 'radix-vue'
function handleAction() {
// eslint-disable-next-line no-alert
alert('clicked action button!')
}
</script>
<template>
<AlertDialogRoot>
<AlertDialogTrigger
class="bg-white text-grass11 font-semibold hover:bg-white/90 shadow-sm inline-flex h-[35px] items-center justify-center rounded-[4px] px-[15px] leading-none outline-none focus:shadow-[0_0_0_2px] focus:shadow-black transition-all"
>
Delete account
</AlertDialogTrigger>
<AlertDialogPortal>
<AlertDialogOverlay class="bg-blackA9 data-[state=open]:animate-overlayShow fixed inset-0 z-30" />
<AlertDialogContent
class="z-[100] text-[15px] data-[state=open]:animate-contentShow fixed top-[50%] left-[50%] max-h-[85vh] w-[90vw] max-w-[500px] translate-x-[-50%] translate-y-[-50%] rounded-[6px] bg-white p-[25px] shadow-[hsl(206_22%_7%_/_35%)_0px_10px_38px_-10px,_hsl(206_22%_7%_/_20%)_0px_10px_20px_-15px] focus:outline-none"
>
<AlertDialogTitle class="text-mauve12 m-0 text-[17px] font-semibold">
Are you absolutely sure?
</AlertDialogTitle>
<AlertDialogDescription class="text-mauve11 mt-4 mb-5 text-[15px] leading-normal">
This action cannot be undone. This will permanently delete your account and remove your data from our servers.
</AlertDialogDescription>
<div class="flex justify-end gap-[25px]">
<AlertDialogCancel
class="text-mauve11 bg-mauve4 hover:bg-mauve5 focus:shadow-mauve7 inline-flex h-[35px] items-center justify-center rounded-[4px] px-[15px] font-semibold leading-none outline-none focus:shadow-[0_0_0_2px]"
>
Cancel
</AlertDialogCancel>
<AlertDialogAction
class="text-red11 bg-red4 hover:bg-red5 focus:shadow-red7 inline-flex h-[35px] items-center justify-center rounded-[4px] px-[15px] font-semibold leading-none outline-none focus:shadow-[0_0_0_2px]"
@click="handleAction"
>
Yes, delete account
</AlertDialogAction>
</div>
</AlertDialogContent>
</AlertDialogPortal>
</AlertDialogRoot>
</template>
特徴
- フォーカスが自動的にトラップされます。
- 制御することも、制御しないことも可能です。
Title
およびDescription
コンポーネントを使用して、スクリーンリーダーのアナウンスを管理します。- Escキーでコンポーネントが自動的に閉じます。
インストール
コマンドラインからコンポーネントをインストールします。
$ npm add radix-vue
構造
すべてのパーツをインポートして、それらを組み合わせます。
<script setup lang="ts">
import {
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogOverlay,
AlertDialogPortal,
AlertDialogRoot,
AlertDialogTitle,
AlertDialogTrigger,
} from 'radix-vue'
</script>
<template>
<AlertDialogRoot>
<AlertDialogTrigger />
<AlertDialogPortal>
<AlertDialogOverlay />
<AlertDialogContent>
<AlertDialogTitle />
<AlertDialogDescription />
<AlertDialogCancel />
<AlertDialogAction />
</AlertDialogContent>
</AlertDialogPortal>
</AlertDialogRoot>
</template>
APIリファレンス
ルート
アラートダイアログのすべてのパーツを含みます。
プロパティ | デフォルト | 型 |
---|---|---|
defaultOpen | boolean 最初にレンダリングされたときのダイアログのオープン状態。オープン状態を制御する必要がない場合に使用します。 | |
open | boolean ダイアログの制御されたオープン状態。 |
エミット | ペイロード |
---|---|
update:open | [value: boolean] ダイアログのオープン状態が変化したときに呼び出されるイベントハンドラー。 |
トリガー
ダイアログを開くボタン。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'button' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 |
データ属性 | 値 |
---|---|
[data-state] | "open" | "closed" |
ポータル
使用すると、オーバーレイとコンテンツパーツをbody
にポータルします。
プロパティ | デフォルト | 型 |
---|---|---|
disabled | boolean テレポートを無効にして、コンポーネントをインラインでレンダリングします | |
forceMount | boolean より多くの制御が必要な場合に、マウントを強制するために使用されます。Vueのアニメーションライブラリでアニメーションを制御する場合に役立ちます。 | |
to | string | HTMLElement Vueネイティブテレポートコンポーネントプロパティ |
オーバーレイ
ダイアログが開いているときに、ビューの非アクティブ部分を覆うレイヤー。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'div' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 | |
forceMount | boolean より多くの制御が必要な場合に、マウントを強制するために使用されます。Vueのアニメーションライブラリでアニメーションを制御する場合に役立ちます。 |
データ属性 | 値 |
---|---|
[data-state] | "open" | "closed" |
コンテンツ
ダイアログが開いているときにレンダリングされるコンテンツを含みます。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'div' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 | |
disableOutsidePointerEvents | boolean
| |
forceMount | boolean より多くの制御が必要な場合に、マウントを強制するために使用されます。Vueのアニメーションライブラリでアニメーションを制御する場合に役立ちます。 | |
trapFocus | boolean
|
エミット | ペイロード |
---|---|
closeAutoFocus | [event: Event] クローズ時に自動フォーカスされた場合に呼び出されるイベントハンドラー。防止できます。 |
escapeKeyDown | [event: KeyboardEvent] Escapeキーが押されたときに呼び出されるイベントハンドラー。防止できます。 |
focusOutside | [event: FocusOutsideEvent] フォーカスが |
interactOutside | [event: PointerDownOutsideEvent | FocusOutsideEvent]
|
openAutoFocus | [event: Event] オープン時に自動フォーカスされた場合に呼び出されるイベントハンドラー。防止できます。 |
pointerDownOutside | [event: PointerDownOutsideEvent]
|
データ属性 | 値 |
---|---|
[data-state] | "open" | "closed" |
キャンセル
ダイアログを閉じるボタン。このボタンは、AlertDialogAction
ボタンと視覚的に区別する必要があります。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'button' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 |
アクション
ダイアログを閉じるボタン。これらのボタンは、AlertDialogCancel
ボタンと視覚的に区別する必要があります。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'button' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 |
タイトル
ダイアログが開かれたときにアナウンスされるアクセス可能な名前。あるいは、AlertDialogContent
にaria-label
またはaria-labelledby
を指定して、このコンポーネントを除外することもできます。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'h2' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 |
説明
ダイアログが開かれたときにアナウンスされるアクセス可能な説明。あるいは、AlertDialogContent
にaria-describedby
を指定して、このコンポーネントを除外することもできます。
プロパティ | デフォルト | 型 |
---|---|---|
as | 'p' | AsTag | コンポーネント このコンポーネントがレンダリングされる要素またはコンポーネント。 |
asChild | boolean 子として渡された要素のデフォルトのレンダリング要素を変更し、それらのプロパティと動作をマージします。 詳細については、コンポジションガイドをお読みください。 |
例
非同期フォーム送信後に閉じる
制御されたプロパティを使用して、非同期操作が完了した後、アラートダイアログをプログラムで閉じます。
<script setup>
import {
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogOverlay,
AlertDialogPortal,
AlertDialogRoot,
AlertDialogTitle,
AlertDialogTrigger,
} from 'radix-vue'
const wait = () => new Promise(resolve => setTimeout(resolve, 1000))
const open = ref(false)
</script>
<template>
<AlertDialogRoot v-model:open="open">
<AlertDialogTrigger>Open</AlertDialogTrigger>
<AlertDialogPortal>
<AlertDialogOverlay />
<AlertDialogContent>
<form
@submit.prevent="
(event) => {
wait().then(() => open = false);
}
"
>
<!-- some inputs -->
<button type="submit">
Submit
</button>
</form>
</AlertDialogContent>
</AlertDialogPortal>
</AlertDialogRoot>
</template>
カスタムポータルコンテナ
アラートダイアログがポータルされる要素をカスタマイズします。
<script setup>
import { ref } from 'vue'
const container = ref(null)
</script>
<template>
<div>
<AlertDialogRoot>
<AlertDialogTrigger />
<AlertDialogPortal :to="container">
<AlertDialogOverlay />
<AlertDialogContent>...</AlertDialogContent>
</AlertDialogPortal>
</AlertDialogRoot>
<div ref="container" />
</div>
</template>
アクセシビリティ
アラートおよびメッセージダイアログWAI-ARIAデザインパターンに準拠します。
キーボード操作
キー | 説明 |
---|---|
Space | ダイアログを開閉します。 |
Enter | ダイアログを開閉します。 |
Tab | フォーカスを次のフォーカス可能な要素に移動します。 |
Shift + Tab | フォーカスを前のフォーカス可能な要素に移動します。 |
Esc | ダイアログを閉じ、フォーカスを AlertDialogTrigger に移動します。 |