FloatingPanel
FloatingPanel — плавающее окно: шапка с заголовком и кнопками, под ней область произвольного контента (children). Окно двигается за шапку (draggable), меняет размер за края и углы (resizable), сворачивается до шапки (minimizable), разворачивается на весь экран (maximizable) и закрывается крестиком (closable) — каждую способность можно отключить по отдельности. Открытость всегда контролируемая — пара open / onOpenChange: onOpenChange(false) приходит при закрытии крестиком, Esc или (при overlayClose) кликом мимо окна, а open меняет хост. Режим modal кладёт под окно невидимый слой-блокиратор, отсекающий страницу. Стартовые размер и позиция — defaultSize / defaultPosition, границы ресайза — minSize / maxSize. Несколько окон наводятся друг на друга через stackIndex (z-index) и onBringToFront (сигнал поднять окно при фокусе). Окно порталится в body, монтируется лениво при открытии и размонтируется при закрытии; первое поле контентной области получает автофокус. Собрано на Ark UI FloatingPanel в каркасе Panel из ДС. В IDE поверх него построена оболочка модалок ModalWindow (связывает окно со стором модалок, центрирует и каскадирует) — прямо FloatingPanel там обычно не используют.
Использует: ButtonIcon, Panel
Анатомия
Примеры
Модальное окно
modal кладёт под окно невидимый слой-блокиратор: страница не реагирует на клики, пока окно открыто. Само окно при этом по-прежнему двигается и меняет размер.
Отключённые способности
resizable, draggable, minimizable, maximizable, closable выключаются по отдельности. Здесь сняты ресайз и обе кнопки стадии — в шапке остаётся только крестик, окно можно лишь двигать.
Размер и его границы
defaultSize задаёт размер при открытии, minSize / maxSize — диапазон ресайза (дальше границ края не тянутся). defaultPosition ставит левый верхний угол окна.
API
| Prop | Type | Default |
|---|---|---|
open*Открыто ли окно. Компонент контролируемый — состоянием распоряжается хост | boolean | - |
onOpenChange*Запрос на смену состояния: | (open: boolean) => void | - |
title*Заголовок окна — одна строка, обрезается с многоточием | ReactNode | - |
children*Содержимое окна — произвольная вёрстка в области под шапкой | ReactNode | - |
modalБлокировать взаимодействие с сайтом, пока окно открыто (невидимый слой-блокиратор под окном) | boolean | false |
overlayCloseЗакрывать окно кликом вне его области. При нескольких открытых окнах закрывается только верхнее | boolean | true |
draggableПеретаскивание окна за шапку | boolean | true |
resizableИзменение размера за края и углы окна | boolean | true |
defaultSizeРазмер окна при открытии (px). Дальше размер держит само окно | FloatingPanelSize | - |
minSizeНижняя граница размера при ресайзе (px) | FloatingPanelSize | - |
maxSizeВерхняя граница размера при ресайзе (px) | FloatingPanelSize | - |
defaultPositionПозиция левого верхнего угла при открытии (px от края вьюпорта) | FloatingPanelPoint | - |
minimizableКнопка «свернуть» (схлопывает окно до шапки) | boolean | true |
maximizableКнопка «развернуть на весь экран» | boolean | true |
closableКнопка «закрыть» | boolean | true |
stackIndexПозиция окна в стеке: z-index = var(--z-modal) + stackIndex | number | 0 |
onBringToFrontВызывается при фокусе/клике внутри окна — сигнал поднять его наверх | () => void | - |