Skip to content

Modal ​

Универсальная панель-оверлей для форм, деталей и сложного контента. Поддерживает перетаскивание, полноэкранный режим, режим выдвижной панели, пользовательские переходы, вложенные модальные окна, ловушку фокуса, автозакрытие, программный API и многое другое.

vue
<script setup>
const show = ref(false)
</script>

<template>
  <button @click="show = true">Open Modal</button>
  <VxModal v-model="show" title="Basic Modal">
    <p>This is a basic modal.</p>
  </VxModal>
</template>

With Description ​

vue
<template>
  <VxModal v-model="show" title="Edit Profile" description="Make changes here." />
</template>

Sizes ​

vue
<template>
  <VxModal size="sm" />
  <VxModal size="md" />
  <VxModal size="lg" />
  <VxModal size="xl" />
  <VxModal size="full" />
</template>

Custom Width ​

Установите произвольную ширину с помощью свойства width.

vue
<template>
  <VxModal v-model="show" :width="666" title="Custom Width" />
  <VxModal v-model="show" width="80%" title="Percentage Width" />
</template>

Draggable ​

Перетаскивайте модальное окно за заголовок, чтобы изменить его положение.

vue
<template>
  <VxModal v-model="show" title="Drag Me" draggable />
</template>

Fullscreen Toggle ​

Кнопка в заголовке позволяет пользователям разворачивать модальное окно на весь экран и обратно.

vue
<template>
  <VxModal v-model="show" title="Expand Me" fullscreenable />
</template>

Before Close ​

Асинхронный обработчик, запускающийся перед закрытием. Верните false, чтобы предотвратить закрытие.

vue
<script setup>
// Sync — native browser confirm
function beforeClose() {
  return window.confirm('Discard changes?')
}

// Async — with useConfirm dialog
import { useConfirm } from 'veloxui'
const dialog = useConfirm()

async function beforeCloseAsync() {
  // resolves = allow close, rejects = block close
  await dialog.warning({
    title: 'Discard Changes?',
    confirmText: 'Discard',
    cancelText: 'Keep Editing',
  })
}
</script>

<template>
  <VxModal v-model="show" :before-close="beforeClose" title="Guard" />
</template>

Drawer Mode ​

Выезжает с любого края. Используйте свойство drawer со значениями left, right, top или bottom.

vue
<template>
  <VxModal v-model="show" drawer="left" title="Left" />
  <VxModal v-model="show" drawer="right" title="Right" />
  <VxModal v-model="show" drawer="top" title="Top" />
  <VxModal v-model="show" drawer="bottom" title="Bottom" />
  <VxModal v-model="show" drawer="right" size="lg" title="Wide Drawer" />
</template>

Custom Transitions ​

Выберите анимацию: zoom (по умолчанию), fade, slide-up, slide-down, flip.

vue
<template>
  <VxModal transition="fade" />
  <VxModal transition="slide-up" />
  <VxModal transition="slide-down" />
  <VxModal transition="flip" />
</template>

Stacked Modals ​

Открывайте модальные окна поверх других. Каждое автоматически получает более высокий z-index.

vue
<template>
  <VxModal v-model="first" title="First">
    <template #footer>
      <button @click="second = true">Open Second</button>
    </template>
  </VxModal>
  <VxModal v-model="second" title="Second" />
</template>

Focus Trap ​

Включено по умолчанию. Клавиша Tab циклически перемещается внутри модального окна для обеспечения доступности.

vue
<template>
  <!-- Focus trap is enabled by default -->
  <VxModal v-model="show" title="Focus Trap">
    <input placeholder="Tab cycles here" />
  </VxModal>

  <!-- Disable it -->
  <VxModal v-model="show" :focus-trap="false" />
</template>

Auto Close ​

Автоматически закрывается через заданное время (мс).

vue
<template>
  <VxModal v-model="show" :auto-close="3000" title="Closes in 3s" />
</template>

Destroy on Close ​

По умолчанию содержимое уничтожается при закрытии модального окна (destroy-on-close). Установите false, чтобы сохранить содержимое (сохраняет состояние формы, позицию прокрутки и т. д.).

vue
<template>
  <VxModal v-model="show" :destroy-on-close="false" title="Keep Alive" />
</template>

Persistent ​

Нельзя закрыть кликом по оверлею или клавишей Escape. Показывает анимацию встряхивания.

vue
<template>
  <VxModal v-model="show" persistent title="Persistent" />
</template>

Position ​

Размещайте модальное окно в любом углу или у любого края области просмотра.

vue
<template>
  <VxModal v-model="show" position="top-left" title="Top Left" />
  <VxModal v-model="show" position="top-center" title="Top Center" />
  <VxModal v-model="show" position="top-right" title="Top Right" />
  <VxModal v-model="show" position="center" title="Center (default)" />
  <VxModal v-model="show" position="bottom-left" title="Bottom Left" />
  <VxModal v-model="show" position="bottom-center" title="Bottom Center" />
  <VxModal v-model="show" position="bottom-right" title="Bottom Right" />
</template>

Centered vs Top ​

vue
<template>
  <VxModal v-model="show" :centered="false" title="Top" />
</template>

Hide Overlay ​

vue
<template>
  <VxModal v-model="show" hide-overlay />
</template>

Loading ​

vue
<template>
  <VxModal v-model="show" loading title="Processing..." />
</template>

Scrollable Content ​

vue
<template>
  <VxModal v-model="show" title="Terms" size="sm">
    <div v-for="i in 20" :key="i"><p>Long content...</p></div>
  </VxModal>
</template>
vue
<template>
  <VxModal v-model="show">
    <template #header>Custom header</template>
    <template #footer>
      <button @click="show = false">Cancel</button>
      <button @click="show = false">Confirm</button>
    </template>
  </VxModal>
</template>

Programmatic API ​

Используйте composable useModal(), чтобы открывать модальные окна из JavaScript без написания шаблонной разметки.

vue
<script setup>
import { useModal } from 'veloxui'

const { open } = useModal()

function showModal() {
  const instance = open({
    title: 'Hello',
    content: 'Created from JavaScript!',
    size: 'sm',
  })

  // Close programmatically
  // instance.close()
}

function showDrawer() {
  open({
    title: 'Drawer',
    drawer: 'right',
    content: 'A programmatic drawer.',
    autoClose: 3000,
  })
}
</script>

Teleport Target ​

Монтирует модальное окно в пользовательский контейнер вместо body.

vue
<template>
  <VxModal v-model="show" teleport-to="#my-container" />
</template>

Props ​

PropTypeDefaultDescription
modelValuebooleanfalseПоказать/скрыть (v-model)
titlestring''Заголовок
descriptionstring''Подзаголовок под заголовком
size'sm' | 'md' | 'lg' | 'xl' | 'full''md'Ширина модального окна
widthstring | number—Пользовательская ширина (переопределяет size)
closablebooleantrueПоказывать кнопку закрытия
closeOnOverlaybooleantrueЗакрывать при клике по оверлею
closeOnEscbooleantrueЗакрывать по нажатию Escape
centeredbooleantrueЦентрировать по вертикали
persistentbooleanfalseВстряхивать вместо закрытия
hideOverlaybooleanfalseПрозрачная подложка
loadingbooleanfalseПоказывать оверлей загрузки
draggablebooleanfalseПеретаскивание за заголовок
fullscreenablebooleanfalseПоказывать переключатель полноэкранного режима
beforeClose() => boolean | Promise<boolean>—Обработчик перед закрытием
drawer'left' | 'right' | 'top' | 'bottom'—Режим выдвижной панели
transition'zoom' | 'fade' | 'slide-up' | 'slide-down' | 'flip'—Анимация
focusTrapbooleantrueУдерживать Tab в пределах окна
autoClosenumber0Автозакрытие через мс
destroyOnClosebooleantrueУничтожать содержимое при закрытии
teleportTostring'body'Селектор цели для Teleport
position'center' | 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right''center'Положение модального окна

Events ​

EventDescription
update:modelValueЗначение изменилось
closeЗакрытие вызвано
openedПереход открытия завершён
closedПереход закрытия завершён

Slots ​

SlotDescription
defaultСодержимое тела
headerПользовательский заголовок
footerДействия подвала (по умолчанию: кнопка закрытия)

Exposed Methods ​

MethodDescription
close()Закрыть модальное окно программно
toggleFullscreen()Переключить полноэкранный режим