Vue.js component for a11y-dialog
This is a Vue.js wrapper component for [email protected]
(Demo on CodeSandbox).
This library supports both Vue 3 and Vue 2. However, active maintenance is focused on Vue 3. If you still need to support Vue 2, you can stay on version 0.5.2
.
Vue 3
npm install vue-a11y-dialog
Vue 2
npm install [email protected]
In your main.js
application file, install the component:
import { createApp } from 'vue'
import A11yDialog from 'vue-a11y-dialog'
import App from './App.vue'
createApp(App).use(A11yDialog).mount('#app')
Then use it as follows:
<template>
<div id="app">
<!-- ... -->
<button type="button" @click="openDialog">
Open dialog
</button>
<a11y-dialog
id="app-dialog"
@dialog-ref="assignDialogRef"
>
<template v-slot:title>
<span>Your dialog title</span>
</template>
<div>
<p>Your content</p>
</div>
</a11y-dialog>
</div>
</template>
export default {
name: 'YourComponent',
data: () => ({
dialog: null
}),
methods: {
openDialog() {
if (this.dialog) {
this.dialog.show()
}
},
assignDialogRef(dialog) {
this.dialog = dialog
}
}
}
It’s important to assign the direct reference to the dialog instance via @dialog-ref
, otherwise there is no way to call its methods.
Alternatively, you can also import the component directly into your file without installing it first:
import { A11yDialog } from 'vue-a11y-dialog'
export default {
name: 'YourComponent',
components: {
'a11y-dialog': A11yDialog
},
methods: {
// ...
}
}
It’s possible to use multiple dialogs in the same component, just make sure to assign the different dialog
instances separately.
In your <template>
:
<template>
<div id="app">
<!-- First dialog -->
<a11y-dialog
id="first-dialog"
@dialog-ref="dialog => assignDialogRef('first', dialog)"
>
<template v-slot:title>
<span>First dialog title</span>
</template>
<div>
<p>Your content</p>
</div>
</a11y-dialog>
<!-- Second dialog -->
<a11y-dialog
id="second-dialog"
@dialog-ref="dialog => assignDialogRef('second', dialog)"
>
<template v-slot:title>
<span>Second dialog title</span>
</template>
<div>
<p>Your content</p>
</div>
</a11y-dialog>
</div>
</template>
In your <script>
:
import { A11yDialog } from 'vue-a11y-dialog';
export default {
name: 'YourComponent',
data: () => ({
dialogs: {}
}),
methods: {
assignDialogRef(type, dialog) {
this.dialogs[type] = dialog
}
}
}
All
a11y-dialog
instance methods are available, for further documentation see here.
id
id
String
true
id
attribute added to the dialog element, internally used by a11y-dialog to manipulate the dialog.<a11y-dialog id="main-dialog">
<!-- ... -->
</a11y-dialog>
dialog-root
dialog-root
String
— CSS Selector string.false
'body'
<a11y-dialog dialog-root="#dialog-root">
<!-- ... -->
</a11y-dialog>
class-names
class-names
Object
false
{}
container
, overlay
, document
, title
, closeButton
. See a11y-dialog docs for reference.<a11y-dialog :class-names="{ container: 'container-class', overlay: 'overlay-class' }">
<!-- ... -->
</a11y-dialog>
title-id
title-id
String
false
id + '-title'
.id
attribute of the dialog’s title element, used by assistive technologies to provide context and meaning to the dialog window.<a11y-dialog title-id="main-title">
<!-- ... -->
</a11y-dialog>
close-button-label
close-button-label
String
false
'Close this dialog window'
aria-label
attribute of the close button, used by assistive technologies to provide extra meaning to the usual cross-mark.<a11y-dialog close-button-label="Close dialog">
<!-- ... -->
</a11y-dialog>
role
role
String
false
dialog
role
attribute of the dialog element, either dialog
(default) or alertdialog
to make it a modal (preventing closing on click outside of ESC key).<a11y-dialog role="alertdialog">
<!-- ... -->
</a11y-dialog>
dialog-ref
a11y-dialog
instance or undefined
.a11y-dialog
instance once the component has been initialised. When it gets destroyed
, the event returns undefined
. This is needed to call instance methods of the dialog, e.g. this.dialog.show()
.<a11y-dialog @dialog-ref="assignDialogRef">
<!-- ... -->
</a11y-dialog>
export default {
// ...
methods: {
assignDialogRef(dialog) {
this.dialog = dialog
}
}
}
title
title
<a11y-dialog>
<template v-slot:title>
<span>Your dialog title</span>
</template>
<!-- ... -->
</a11y-dialog>
closeButtonContent
closeButtonContent
\u00D7
(×)<a11y-dialog>
<template v-slot:closeButtonContent>
<span>Close dialog</span>
</template>
<!-- ... -->
</a11y-dialog>
closeButtonPosition
closeButtonPosition
first
first
, last
, or none
<a11y-dialog close-button-position="last">
<template v-slot:closeButtonContent>
<span>Close dialog</span>
</template>
<!-- ... -->
</a11y-dialog>
This is a client-only component; a11y-dialog
won’t render anything on the server and wait for your bundle to be executed on the client.