- ✅ Universal: works in
vue@2
andvue@3
🚧 - ✅ Renderless/headless: no assumptions about styles or markup. You have full control.
- ✅ Accessibility first — Focus trap[1] + keyboard navigation + aria-attributes
- ✅ Fully controlled component
- ✅ Pure vue, no wrapping.
- ✅ Simplicity + size
- 🕸 Nested dialogs (questionable pattern, not recommended, but possible because it happens) and it's actually in WAI-ARIA examples so...
Detailed documentation and additional info is available at documentation site
npm i a11y-vue-dialog # or yarn add a11y-dialog
A renderless/headless component provides all the functionality required to build a proper Dialog
, but gives zero f*cks about your styles. As such you have full control over it and have to DYI. Here's a basic example on how to do it:
<!-- AppBaseDialog.vue --> <template> <a11y-dialog v-bind="$attrs" v-on="$listeners" v-slot:default="{ rootRef, dialogRef, titleRef, closeRef }" > <div v-bind="rootRef.prop"> <!-- Bindings do the accessibility attributes for you --> <div v-bind="dialogRef.props" v-on="dialogRef.listeners"> <h1 v-bind="titleRef.props">{{ title }}</h1> <button v-bind="closeRef.props" v-on="closeRef.listeners"> </div> </div> ... <slot /> </a11y-dialog> </template> <script> import { A11yDialog } from 'a11y-dialog' export default { name: 'AppBaseDialog', components: { A11yDialog }, props: { title: { type: String, required: true } } } </script>
<!-- At any View.vue, after import AppBaseDialog --> <template> <div id="page"> <button @click="isDialogOpen = true"> <app-base-dialog title="Hello world" :open="isDialogOpen" @close="openMyModal = false" @confirm="handSubmit" > My markup, my rules. </app-base-dialog> </div> </template>
Voilá, checkout a working example on CodeSandbox.
Detailed documentation and additional info is available at documentation site
A playground is used to test the component locally. It uses vue/cli
instant prototyping feature, so the downside is that you have to install it globally.
- Clone this repo
yarn install
- Then, just run
yarn play
Thanks to all this packages for inspiration and guidance.
portal-vue|vue-simple-portal
from @LinusBorg which makes escaping overflow traps easy peasya11y-dialog
(vanilla) from@KittyGiraudel
to lead the path that ended herevue-a11y-dialog
(wrapper around ^) from@morkro
for the motivation to build a pure vue alternative to it.- All build tools used to make this a reality!
MIT © Renato de Leão