Компоненты
Dialog
Модальное окно с ловушкой фокуса и блокировкой прокрутки.
Модальное окно: портал в body, затемнение, ловушка фокуса, Escape и блокировка прокрутки страницы под ним.
Пример
import { Dialog, Button, Field, Input } from "@toimetdev/pathlogs-core";
const [open, setOpen] = useState(false);
<Dialog
open={open}
onClose={() => setOpen(false)}
title="Новый проект"
footer={
<>
<Button variant="ghost" onClick={() => setOpen(false)}>Отмена</Button>
<Button variant="primary" onClick={submit}>Создать</Button>
</>
}
>
<Field label="Название" required>
{(props) => <Input {...props} />}
</Field>
</Dialog>Состояние живёт снаружи. Так одно и то же окно обслуживает и создание, и редактирование, не заводя себе внутреннего режима.
Пропсы
| Проп | Тип | По умолчанию | Описание |
|---|---|---|---|
open* | boolean | — | Показано ли окно. |
onClose* | () => void | — | Вызывается по Escape, клику по затемнению и крестику. |
title | string | — | Видимый заголовок окна. |
header | ReactNode | — | Свой заголовок вместо строки title — например, с иконкой и счётчиком. |
label | string | — | Доступное имя, когда видимого заголовка нет: окно рисует его само, но скринридеру имя всё равно нужно. |
footer | ReactNode | — | Полоса действий внизу окна. |
size | "sm" | "md" | "lg" | "xl" | "md" | Предельная ширина: 24 / 32 / 42 / 56 rem. |
align | "center" | "top" | "center" | Прижать окно к верху — так стоит командная палитра. |
busy | boolean | false | Идёт сохранение: закрытие заблокировано, чтобы не потерять результат. |
dismissOnBackdrop | boolean | true | Закрывать по клику на затемнение. |
dismissOnEscape | boolean | true | Закрывать по Escape. |
open*booleanПоказано ли окно.
onClose*() => voidВызывается по Escape, клику по затемнению и крестику.
titlestringВидимый заголовок окна.
headerReactNodeСвой заголовок вместо строки title — например, с иконкой и счётчиком.
labelstringДоступное имя, когда видимого заголовка нет: окно рисует его само, но скринридеру имя всё равно нужно.
footerReactNodeПолоса действий внизу окна.
size"sm" | "md" | "lg" | "xl"по умолчанию: "md"
Предельная ширина: 24 / 32 / 42 / 56 rem.
align"center" | "top"по умолчанию: "center"
Прижать окно к верху — так стоит командная палитра.
busybooleanпо умолчанию: false
Идёт сохранение: закрытие заблокировано, чтобы не потерять результат.
dismissOnBackdropbooleanпо умолчанию: true
Закрывать по клику на затемнение.
dismissOnEscapebooleanпо умолчанию: true
Закрывать по Escape.
Фокус и клавиатура
- При открытии фокус уходит на первый интерактивный элемент, а если его нет — на саму панель. Без этого клавиатура осталась бы на странице под затемнением.
- Tab с последнего элемента возвращается на первый: за пределы окна фокус не уходит.
- При закрытии фокус возвращается туда, откуда окно открыли, — иначе после Escape клавиатура оказывалась бы в начале страницы.
- Прокрутка страницы под окном блокируется: колесо над затемнением иначе уезжает по контенту, и, закрыв окно, пользователь оказывается не там, где был.
Окно без заголовка
Если окно рисует заголовок само (подтверждение, палитра), передайте label вместо title: шапка не появится, а доступное имя останется.
<Dialog open={open} onClose={close} label="Удалить проект?" size="sm">
{/* собственная разметка с иконкой и заголовком */}
</Dialog>