2 min read
   
 BaseModal
BaseModal
 Base component with no XPlugin dependencies that serves as a utility for constructing more complex modals.
Props
 | Name | Description | Type | Default | 
|---|---|---|---|
| open | Determines if the modal is open or not. | boolean |  | 
| focusOnOpen | Determines if the focused element changes to one inside the modal when it opens. Either the first element with a positive tabindex or just the first focusable element. | boolean | true | 
| referenceSelector | The reference selector of a DOM element to use as reference to position the modal. This selector can be an ID or a class, if it is a class, it will use the first element that matches. | string |  | 
| animation | Animation to use for opening/closing the modal.This animation only affects the content. | AnimationProp | () => NoAnimation | 
| overlayAnimation | Animation to use for the overlay (backdrop) part of the modal. By default, it uses a fade transition. | AnimationProp | () => Fade | 
| contentClass | Class inherited by content element. | string |  | 
| overlayClass | Class inherited by overlay element. | string |  | 
Events
 | Event name | Properties | Description | 
|---|---|---|
| click:overlay | ||
| focusin:body | 
Slots
 | Name | Description | Bindings (name - type - description) | 
|---|---|---|
| default | (Required) Modal container content | None | 
Examples
 The BaseModal is a simple component that serves to create complex modals. Its open state has to be
passed via prop. There is a prop, referenceSelector, used to place the modal under some element
instead of set the top of the element directly. It also accepts an animation to use for opening &
closing.
It emits a click:overlay event when any part out of the content is clicked, but only if the modal
is open.
<template>
  <div>
    <button @click="open = true">Open modal</button>
    <BaseModal
      :animation="fadeAndSlide"
      :open="open"
      @click:overlay="open = false"
      referenceSelector=".header"
    >
      <h1>Hello</h1>
      <p>The modal is working</p>
      <button @click="open = false">Close modal</button>
    </BaseModal>
  </div>
</template>
<script>
import { BaseModal, FadeAndSlide } from '@empathyco/x-components'
import Vue from 'vue'
Vue.component('fadeAndSlide', FadeAndSlide)
export default {
  components: {
    BaseModal,
  },
  data() {
    return {
      open: false,
    }
  },
}
</script>
Customized usage
 Customizing the content with classes
 The contentClass prop can be used to add classes to the modal content.
<template>
  <div>
    <button @click="open = true">Open modal</button>
    <BaseModal
      :animation="fadeAndSlide"
      :open="open"
      @click:overlay="open = false"
      referenceSelector=".header"
      contentClass="x-bg-neutral-75"
    >
      <h1>Hello</h1>
      <p>The modal is working</p>
      <button @click="open = false">Close modal</button>
    </BaseModal>
  </div>
</template>
<script>
import { BaseModal, FadeAndSlide } from '@empathyco/x-components'
import Vue from 'vue'
Vue.component('fadeAndSlide', FadeAndSlide)
export default {
  components: {
    BaseModal,
  },
  data() {
    return {
      open: false,
    }
  },
}
</script>
Customizing the overlay with classes
 The overlayClass prop can be used to add classes to the modal overlay.
<template>
  <div>
    <button @click="open = true">Open modal</button>
    <BaseModal
      :animation="fadeAndSlide"
      :open="open"
      @click:overlay="open = false"
      referenceSelector=".header"
      overlayClass="x-bg-neutral-75"
    >
      <h1>Hello</h1>
      <p>The modal is working</p>
      <button @click="open = false">Close modal</button>
    </BaseModal>
  </div>
</template>
<script>
import { BaseModal, FadeAndSlide } from '@empathyco/x-components'
import Vue from 'vue'
Vue.component('fadeAndSlide', FadeAndSlide)
export default {
  components: {
    BaseModal,
  },
  data() {
    return {
      open: false,
    }
  },
}
</script>
Vue Events
 A list of events that the component will emit:
- click:overlay: the event is emitted after the user clicks any part out of the content but only if the modal is open. The event payload is the mouse event that triggers it.
- focusin:body: the event is emitted after the user focus in any part out of the content but only if the modal is open. The event payload is the focus event that triggers it.