Page

Page — каркас страницы: шапка, контент и подвал.

Проп layout выбирает раскладку. application (по умолчанию) — каркас приложения на весь вьюпорт (100dvw × 100dvh, overflow: hidden): страница не скроллится, скролл живёт внутри зон. site — каркас сайта: высота окна берётся за минимум, дальше страница растёт по контенту и скроллится окном. Раскладка идёт в паре с импортом стилей — @tulls/ui/application.css или @tulls/ui/site.css (см. Установку): скролл самой страницы разрешает именно он.

Page.Root — CSS-грид из трёх строк: Page.Header, Page.Content (растягивается на всё свободное место) и Page.Footer. Части находят свою строку по data-атрибутам, поэтому порядок детей не важен; шапка и подвал опциональны. Это корень всего приложения (один на приложение, рендерится в корневом layout), а не блок внутри страницы.

Своего фона у Page.Root нет — его рисует Page.Bg: слой на всю страницу под остальными частями. Без него страница остаётся прозрачной. Сам по себе слой — заливка токеном фона приложения, с пропом glow к ней добавляется фирменное свечение Tulls: широкое, еле заметное фиолетовое пятно из левого верхнего угла. Приложения Tulls ставят <Page.Bg glow />.

Свой фон — например у сайта — передаётся детьми: они кладутся в одну ячейку поверх базовой заливки, накладываются друг на друга и растягиваются на весь слой, так что градиент, картинка и анимация собираются стопкой. Слой обрезает вылезающее (overflow: hidden), а точечная правка самой заливки делается через className — как и у остальных частей, атрибуты div'а прокидываются насквозь.

Page.Header и Page.Footer построены на Triplet: три равные колонки left / center / right, в каждый слот можно передать строку или произвольный ReactNode, несколько элементов внутри слота выстраиваются в ряд с отступом. Колонки всегда одной ширины, поэтому center стоит строго по центру страницы независимо от наполнения соседей.

Page.Content задаёт горизонтальные паддинги и min-height: 0, поэтому в раскладке application вложенные скролл-области (ScrollArea) сжимаются до высоты зоны и скроллятся внутри неё, а не растягивают страницу.

В примерах ниже страница ужата в рамку превью демо-обёрткой — в реальном коде она не нужна.

Мой проект
Трекер
Разработка

Анатомия

Page.Root
Page.Bg
Page.Header
Left (left)
Center (center)
Right (right)
Page.Content
Children
Page.Footer
Left (left)
Center (center)
Right (right)

Примеры

Шапка

Page.Header отдельно от страницы: слева — кнопка меню и название проекта в одном слоте, по центру поиск, справа действие.

Мой проект

Подвал

Page.Footer — те же слоты и та же раскладка, что у шапки: отличается только строкой грида, в которую попадает.

Контент со скроллом

Список длиннее зоны контента: ScrollArea, растянутая на высоту зоны, скроллит его внутри страницы — шапка и подвал остаются на месте.

Задачи

layout

application
site

API

PropTypeDefault
children*

Части страницы: Page.Header, Page.Content, Page.Footer

ReactNode-
layout

Раскладка страницы: application — каркас на всё окно, страница не скроллится (скроллятся области внутри неё); site — страница растёт по контенту и скроллится окном

"application" | "site""application"

Page.Bg

Фон страницы — слой на всю её площадь под шапкой, контентом и подвалом; свои слои фона передаются детьми.

PropTypeDefault
glow

Фирменное свечение Tulls — широкое фиолетовое пятно из левого верхнего угла

booleanfalse
children

Свой фон: слои рисуются поверх базовой заливки, накладываются друг на друга и растягиваются на всю страницу

ReactNode-

Наследуется от HTMLAttributes<HTMLDivElement>

Шапка страницы — первая строка грида; слоты раскладываются Triplet'ом.

PropTypeDefault
children

Произвольное содержимое шапки вместо трёх слотов Triplet (например, ряд табов); если передано — left/center/right игнорируются

ReactNode-
left

Контент, отображаемый слева

TripletItem-
center

Контент, отображаемый по центру

TripletItem-
right

Контент, отображаемый справа

TripletItem-

Наследуется от HTMLAttributes<HTMLDivElement>

Page.Content

Основная зона страницы — занимает всё место между шапкой и подвалом.

PropTypeDefault
children*

Содержимое основной зоны страницы

ReactNode-

Наследуется от Omit<HTMLAttributes<HTMLDivElement>, "children">

Подвал страницы — последняя строка грида, тот же Triplet.

PropTypeDefault

Наследуется от HTMLAttributes<HTMLDivElement>