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:
() => FADE_MODAL_TRANSITION_CONFIG
Конфиг для анимации overlay
contentTransition
- type:
ModalCoreProps['contentTransition'] - default:
() => 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 name | Properties | Description |
|---|---|---|
| update:modelValue | modelValue boolean - обновленное состояние открытия | Обновление состояния открытия |
| opened | Окончание анимации открытия | |
| closed | Окончание анимации закрытия |
Slots
| Name | Description | Bindings |
|---|---|---|
| default |
Css
--modal-core-padding
- type:
padding - default:
null
padding рутового элемента
--modal-core-overlay-bg
- type:
background - default:
rgba(0, 0, 0, 0.5)
background для overlay