ModalCore

Ключевой компонент для работы с модальными окнами. Используется для создания кастомных модальных окон.

import type { WritableComputedRef } from 'vue';

import type ExposedPromise from '#sf/utils/exposed-promise';
import type { MaybeArray } from '#sf/types';

export type VNodeClassObject = Record<string, boolean>;

type Vue2DataObjectClass = MaybeArray<
  VNodeClassObject | string | undefined | null | undefined
>;

export type StaticModalCoreTransitionConfig = {
  keyframes: Array<Keyframe>;

  options?: KeyframeAnimationOptions;
};

export type DynamicModalCoreTransitionConfig = (
  el: HTMLElement,
  isLeave: boolean,
) => StaticModalCoreTransitionConfig;

export type ModalCoreTransitionConfig =
  | StaticModalCoreTransitionConfig
  | DynamicModalCoreTransitionConfig;

export type ModalVisibilityPromiseType = 'close' | 'open';

export interface ModalInstanceExposedApi {
  open: () => InstanceType<typeof ExposedPromise<ModalVisibilityPromiseType>>;
  close: (
    enforce?: boolean,
  ) =>
    | InstanceType<typeof ExposedPromise<ModalVisibilityPromiseType>>
    | Promise<void>;
}

export interface ModalCoreProps {
  attach: boolean | string;
  modelValue: boolean;
  name: string;
  overlayTransition: ModalCoreTransitionConfig;
  contentTransition: ModalCoreTransitionConfig;
  closable: boolean;
  closeOnEscape: boolean;
  closeOnOutClick: boolean;
  renderOnOpenOnly: boolean;
  rootClass: Vue2DataObjectClass;
  rootStyle: Record<string, any> | null;
}

export interface ModalCoreInternalState extends ModalInstanceExposedApi {
  compModelValue: WritableComputedRef<boolean>;
}

Props

name

  • type: ModalCoreProps['name']
  • default: null

Название модального окна.
Используется для регистрации в $modal

@warning Должно быть уникальным

modelValue

  • type: boolean

Состояние открытия

overlayTransition

  • type: ModalCoreProps['overlayTransition']
  • default: () =&gt; FADE_MODAL_TRANSITION_CONFIG

Конфиг для анимации overlay

contentTransition

  • type: ModalCoreProps['contentTransition']
  • default: () =&gt; FADE_MODAL_TRANSITION_CONFIG

Конфиг для анимации content

closable

  • type: ModalCoreProps['closable']
  • default: true

Флаг возможности закрытия окна.
Скрывает крестик и блокирует закрытие.

closeOnEscape

  • type: ModalCoreProps['closeOnEscape']
  • default: true

Закрытие при нажатии Esc

closeOnOutClick

  • type: ModalCoreProps['closeOnOutClick']
  • default: true

Закрытие при нажатии на overlay

renderOnOpenOnly

  • type: ModalCoreProps['renderOnOpenOnly']
  • default: true

Рендер контента модального окна
через v-if. Если false, то
используется v-show

rootClass

  • type: ModalCoreProps['rootClass']
  • default: null

Класс для рутового элемента модального окна.
Следует использовать либо глобальный класс,
либо CSS Modules.
Связано с тем, что модальное окно может быть перемещено
в другой элемент через attach

rootStyle

  • type: ModalCoreProps['rootStyle']
  • default: null

Аналогичен rootClass

attach

  • type: ModalCoreProps['attach']
  • default: true

Альтернатива Teleport, реализованная
через appendChild.
Можно передать как CSS Selector, так и boolean.
true равносильно передаче body в качестве
CSS-селектора

Events

Event namePropertiesDescription
update:modelValuemodelValue boolean - обновленное состояние открытияОбновление состояния открытия
openedОкончание анимации открытия
closedОкончание анимации закрытия

Slots

NameDescriptionBindings
default

Css

  • type: padding
  • default: null

padding рутового элемента

  • type: background
  • default: rgba(0, 0, 0, 0.5)

background для overlay