Компонент Modal для Angular | ng-hub-ui-modal

Доступный компонент modal для Angular с наложением, полноэкранным режимом, шаблонами, обработкой клавиатуры и CSS-переменными для standalone-приложений.

Справочник API

Вот полный контракт modal: всё, что можно привязать, прослушать, спроецировать и тематизировать, собрано в одном месте. Подключите то, что нужно, и оформите так, как хотите — это standalone и дружит с сигналами.

Входные свойства

Настройте modal с помощью 27 входных свойств. Привязывайте их, как любой @Input в Angular.

ИмяТипПо умолчаниюОписание
animationboolean—Если true, открытие и закрытие modal будут анимированы. По умолчанию: true
ariaLabelledBystring—ID элемента, который подписывает диалог. Применяется как `aria-labelledby` на окне модального окна.
ariaDescribedBystring—ID элемента, который описывает диалог. Применяется как `aria-describedby` на окне модального окна.
closeAriaLabelstring'Close'Доступное имя кнопки закрытия, которую библиотека рисует в собственной шапке. У этой кнопки нет текста — крестик рисует CSS, — поэтому эта строка и есть всё, что произнесёт скринридер: передайте сюда переведённый текст или задайте значение по умолчанию один раз в `HubModalConfig`. По умолчанию: "Close"
backdropboolean | "static"—Если true, будет создан элемент backdrop. В качестве альтернативы укажите "static" для backdrop, который не закрывает modal при клике. По умолчанию: true
beforeDismiss() => boolean | Promise<boolean>—Страж, вызываемый прямо перед закрытием модального окна. Верните `false`, промис, разрешённый с `false`, или отклонённый промис — и диалог останется открытым.
centeredboolean—Если true, modal будет центрирован по вертикали. По умолчанию: false
closeOnNavigationbooleantrueЗакрывает диалог при изменении URL приложения, с причиной `ModalDismissReasons.NAVIGATION`. Диалог принадлежит экрану, который его открыл: оставшись открытым, он накрывает следующий, а его подложка съедает там каждый клик. Считается изменение пути или строки запроса; изменение якоря — нет, оно перемещает читателя внутри того же экрана. Ставьте `false` для диалога, который сам выполняет переходы и должен оставаться открытым. По умолчанию `true`.
closeButtonbooleantrueРисует ли диалог кнопку закрытия в собственной шапке. При `false` она не отрисовывается, а не прячется: спрятанную через CSS кнопку экранный диктор всё равно объявляет, а порядок обхода по Tab всё равно до неё доходит — чего диалогу без свободного выхода не нужно. Действует только на эту кнопку; `backdrop: 'static'` и `keyboard: false` — два других выхода. По умолчанию `true`.
placementHubModalPlacement—Управляет тем, где размещается modal в области просмотра. По умолчанию: HubModalPlacement.Center
offcanvasbooleanfalseОткрывает диалог как выдвижную панель: вплотную к краю, названному в `placement`, без скругления с этой стороны, растянутым на всю высоту (или ширину, сверху и снизу), с прокруткой в теле, чтобы шапка и подвал оставались на месте. Ширина берётся из `--hub-modal-offcanvas-width`, а не из шкалы размеров: `size: 'lg'` — это 800px, которые на узком окне закрывают тот самый документ, рядом с которым панель и должна читаться. Без `placement` открывается от конечного края.
containerstring | HTMLElement—CSS-селектор или элемент, к которому добавляются окна модальных окон. По умолчанию: `body`
fullscreenboolean | "sm" | "md" | "lg" | "xl" | "xxl" | string—`true` держит диалог на весь экран при любой ширине; имя брейкпоинта вроде `"md"` — только ниже этой ширины. Любая другая строка применяет `modal-fullscreen-<значение>-down`. По умолчанию: false
injectorInjector—Injector, которым разрешаются зависимости компонента содержимого.
keyboardboolean—Если true, modal будет закрыт при нажатии клавиши Escape. По умолчанию: true
scrollableboolean—Закрепляет диалог и прокручивает его тело вместо того, чтобы он выходил за пределы вьюпорта. По умолчанию: false
size"sm" | "lg" | "xl" | string—Размер окна modal
variant"primary" | "success" | "danger" | "warning" | "info" | string—Семантический акцент диалога — для тех, что что-то значат: разрушительное подтверждение, уведомление об успехе. Он переопределяет единственный слот `--hub-modal-accent`, а роли emphasis / subtle / on / border выводятся из него на самом диалоге, так что одно значение перекрашивает подкрашенный фон, внешний край с линейками шапки и подвала, а также заголовок. В таблице стилей их девять: `primary`, `secondary`, `success`, `danger`, `warning`, `info`, `neutral`, `light` и `dark`. Принимается и любая другая строка — она добавляет окну класс `hub-modal--<имя>`: собственный акцент стоит одного правила в глобальной таблице стилей и не требует пересборки. Верхняя полоса акцента тоже входит в набор, но поставляется нулевой ширины: задайте `--hub-modal-accent-bar-width` на диалоге, чтобы включить её. Без variant диалог остаётся нейтральным.
windowClassstring—Пользовательский класс, добавляемый к окну modal
modalDialogClassstring—Пользовательский класс, добавляемый к элементу `hub-modal__dialog`
backdropClassstring—Пользовательский класс, добавляемый к backdrop modal
dismissSelectorstring—Пользовательский селектор для элементов, которые могут вызвать закрытие (dismiss) окна modal. По умолчанию: "[data-dismiss=\"modal\"]"
closeSelectorstring—Пользовательский селектор для элементов, которые могут вызвать закрытие (close) окна modal. По умолчанию: "[data-close=\"modal\"]"
headerSelectorstring—Пользовательский селектор для элемента заголовка окна modal
footerSelectorstring—Пользовательский селектор для элемента подвала окна modal
bodySelectorstring—CSS-селектор блока, дети которого становятся телом. Без него тело — это то, что осталось от шапки и подвала, а значит зависит от порядка написания содержимого; с ним тело размещается осознанно, и всё, что не забрал ни один слот, по-прежнему идёт следом.
dataD—Дополнительные данные, которые необходимо передать окну modal при его открытии

События

Реагируйте на то, что делает modal, — 1 событий, к которым можно подключить вашу логику.

ИмяТипОписание
dismissanyИспускается окном modal, когда пользователь отклоняет (dismiss) его — например, нажатием Escape, кликом по backdrop или встроенной кнопкой закрытия. Полезная нагрузка — причина отклонения (ModalDismissReasons.ESC, ModalDismissReasons.BACKDROP_CLICK или пользовательское значение).

Методы

Управляйте modal из кода — 17 методов его программного интерфейса.

ИмяСигнатураВозвращаетОписание
HubModal.openopen<C, R, D>(content: Type<C> | TemplateRef<any> | string, options?: HubModalOptions<D>): HubModalRef<C, R>HubModalRef<C, R>Открывает новое окно modal с указанным содержимым (тип компонента, TemplateRef или строка) и опциями и возвращает HubModalRef для управления им. Компоненты содержимого могут внедрить HubActiveModal и токен HUB_MODAL_DATA, чтобы взаимодействовать с modal и читать полезную нагрузку data.
HubModal.dismissAlldismissAll(reason?: any): void—Отклоняет все отображаемые в данный момент окна modal с указанной причиной.
HubModal.hasOpenModalshasOpenModals(): booleanbooleanПоказывает, есть ли в приложении открытые окна modal в данный момент.
HubModal.activeInstancesactiveInstances: EventEmitter<HubModalRef[]>EventEmitter<HubModalRef[]>Эмиттер событий, испускающий список открытых в данный момент экземпляров HubModalRef при каждом открытии или удалении modal.
HubModalRef.closeclose(result?: R): void—Закрывает modal с необязательным значением результата. Promise HubModalRef.result разрешается переданным значением.
HubModalRef.dismissdismiss(reason?: any): void—Отклоняет modal с необязательным значением причины. Promise HubModalRef.result отклоняется с переданным значением. Учитывает защиту beforeDismiss, если она настроена.
HubModalRef.updateupdate(options: HubModalUpdatableOptions): void—Обновляет опции открытого modal (aria-атрибуты, centered, placement, fullscreen, backdropClass, size, variant, windowClass, modalDialogClass).
HubModalRef.componentInstancecomponentInstance: C | voidC | voidЭкземпляр компонента, использованного как содержимое modal. Возвращает undefined, если содержимым был TemplateRef или modal закрыт.
HubModalRef.resultresult: Promise<R>Promise<R>Promise, который разрешается результатом закрытия, когда modal закрывается, и отклоняется причиной отклонения, когда modal отклоняется (dismiss).
HubModalRef.closedclosed: Observable<R>Observable<R>Observable, испускающий результат, переданный в close(), когда modal закрывается.
HubModalRef.dismisseddismissed: Observable<any>Observable<any>Observable, испускающий причину отклонения, когда modal отклоняется — значение, переданное в dismiss(), либо внутреннюю причину, такую как клик по backdrop или Escape.
HubModalRef.shownshown: Observable<void>Observable<void>Observable, который испускает значение и завершается, как только modal полностью видим и его анимация открытия закончилась.
HubModalRef.hiddenhidden: Observable<void>Observable<void>Observable, который испускает значение и завершается, когда и окно modal, и backdrop скрыты, анимации завершены, а их элементы удалены из DOM.
HubActiveModal.closeclose(result?: R): void—Закрывает modal, содержащий компонент содержимого, разрешая Promise HubModalRef.result необязательным значением результата.
HubActiveModal.dismissdismiss(reason?: any): void—Отклоняет modal, содержащий компонент содержимого, отклоняя Promise HubModalRef.result необязательным значением причины.
HubActiveModal.updateupdate(options: HubModalUpdatableOptions): void—Обновляет опции открытого modal изнутри компонента содержимого.
HubActiveModal.datadata: DDТипизированная полезная нагрузка, переданная через HubModalOptions.data. Эквивалентно внедрению токена HUB_MODAL_DATA; принимает значение null, если опция data не была передана.

Шаблоны

Сделайте его своим — 1 слотов шаблона позволяют проецировать собственную разметку.

ИмяОписаниеПример
Modal TemplateСсылка на шаблон, которую можно передать сервису модальных окон. Блоки шапки, тела и подвала становятся слотами только тогда, когда при открытии заданы `headerSelector`, `bodySelector` и `footerSelector`; без них весь шаблон попадает в тело.<ng-template #modalTemplate let-close="close" let-dismiss="dismiss"> <div hubModalHeader> <h4 class="hub-modal__title">Modal Title</h4> </div> <div hubModalBody> Modal content goes here </div> <div hubModalFooter> <button hubButton color="secondary" (click)="dismiss()">Cancel</button> <button hubButton color="primary" (click)="close('result')">OK</button> </div> </ng-template> <!-- The three blocks become slots only when the selectors are given: this.modal.open(this.modalTemplate, { headerSelector: '[hubModalHeader]', bodySelector: '[hubModalBody]', footerSelector: '[hubModalFooter]' }); Without them the whole template lands in hub-modal__body. -->