Обычный экран списка: заголовок, панель инструментов и строки, работающие и на десктопе, и на телефоне.
Каждый пример работает, но его ссылки никуда не ведут. HTML показывает разметку для копирования.
page-header
Заголовочная полоса экрана: h1, необязательный подзаголовок и основное действие.
Заголовок, подзаголовок и одно главное действие
<headerrst-page-header>
<divrst-page-header-titles>
<h1>Записи</h1>
<prst-page-header-sub>Всё, что вы написали, сначала новое.</p>
</div>
<arst-btn="primary"href="/posts/new">
<svgclass="icon"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"aria-hidden="true"><pathd="M5 12h14"/><pathd="M12 5v14"/></svg>
Написать запись
</a>
</header>
{{template"page-header"dict"Title""Записи""Sub""Всё, что вы написали, сначала новое.""ActionHref""/posts/new""ActionLabel""Написать запись""ActionIcon""plus"}}
В Hidden ничто не говорит, какая пара — страница, поэтому по умолчанию page=4 попадёт в набор результатов, где четырёх страниц уже нет. Приложение сбрасывает это через ClearHref.
Здесь ничего не видно, пока вы не перейдёте сюда клавишей Tab.
list-row-action
Одна строка списка: имя записи как основная ссылка, строка сведений и второстепенное действие.
Начальная метка, статус и одно действие
Поместите это внутрь <div rst-list>.
<divrst-row>
<spanrst-row-leaddata-lead="accent"aria-hidden="true">RN</span>
<spanrst-row-main><ahref="/posts/1">Примечания к выпуску, август</a>
<smallrst-row-sub>Опубликовано 2 августа · 4 мин чтения</small>
</span>
<spanrst-statusrst-tone="positive">Опубликовано</span>
<arst-row-actionhref="/posts/1/edit"aria-label="Изменить «Примечания к выпуску, август»">Изменить</a>
</div>
Поместите это внутрь <div rst-list>.
{{template"list-row-action"dict"Href""/posts/1""Main""Примечания к выпуску, август""Sub""Опубликовано 2 августа · 4 мин чтения""ActionHref""/posts/1/edit""ActionLabel""Изменить""ActionAria""Изменить «Примечания к выпуску, август»""StatusTone""positive""StatusLabel""Опубликовано""Lead""accent""LeadInitial""RN"}}
Только имя и строка сведений
Поместите это внутрь <div rst-list>.
<divrst-row>
<spanrst-row-main><ahref="/posts/2">Почему мы отказались от старого раннера</a>
<smallrst-row-sub>Черновик · сохранено 20 минут назад</small>
</span>
</div>
Поместите это внутрь <div rst-list>.
{{template"list-row-action"dict"Href""/posts/2""Main""Почему мы отказались от старого раннера""Sub""Черновик · сохранено 20 минут назад"}}
row-menu
Прочие действия строки скрыты за кнопкой ⋮. Разрушительное действие ведёт на свою страницу подтверждения.
{{template"media-grid"dict"Items" (list
(dict"Desc""Шаг оплаты с открытой формой карты.""Height" 3200 "Href""/images/1""Menu" (list (dict"Href""/images/1/edit""Label""Изменить") (dict"Danger"true"Href""/images/1/delete""Label""Удалить…")) "Meta""1280 × 3200 · 412 KB""Name""Оформление заказа, шаг 2""Src""/images/checkout.png""Width" 1280)
(dict"Desc""""Height" 2400 "Href""/images/2""Menu" (list (dict"Href""/images/2/edit""Label""Изменить") (dict"Danger"true"Href""/images/2/delete""Label""Удалить…")) "Meta""1280 × 2400 · 318 KB""Name""Страница цен""Src""/images/pricing.png""Width" 1280)
(dict"Alt""Harbour""Desc""Знак сам по себе, для тёмного и светлого фона.""Fit""contain""Height" 240 "Href""/images/3""Menu" (list (dict"Href""/images/3/edit""Label""Изменить") (dict"Danger"true"Href""/images/3/delete""Label""Удалить…")) "Meta""240 × 240 · 3 KB""Name""Логотип Harbour""Src""/images/logo.svg""Width" 240)
(dict"Desc""Полоса в верхней части магазина в марте.""Fit""contain""Height" 200 "Href""/images/4""Menu" (list (dict"Href""/images/4/edit""Label""Изменить") (dict"Danger"true"Href""/images/4/delete""Label""Удалить…")) "Meta""1200 × 200 · 64 KB""Name""Весенний баннер""Src""/images/banner.png""Width" 1200))}}
Для логотипа или баннера задайте Fit равным "contain". Для снимка экрана оставьте значение по умолчанию, чтобы показывать его верхнюю часть. На плитке без Desc отображается "Без описания".
Поместите сетку и bulk-bar в одну форму. Каждый флажок отправляет значение Select своей плитки под именем "id"; задайте SelectName, чтобы его изменить. Внутри формы пункты меню должны быть ссылками.
pagination
Полоса обычных пронумерованных ссылок, чтобы разбивка на страницы работала и с выключенным JavaScript.
Label не задан, поэтому доступное имя nav берётся из каталога.
empty-state
Карточка пустого состояния. Пустое состояние с подсказками, с чего начать.
С призывом к действию через POST
<divrst-empty>
<h2rst-empty-title>Здесь пока пусто</h2>
<prst-empty-body>Записей пока нет. Первая — хорошее начало.</p>
<formrst-empty-ctamethod="post"action="/posts/seed">
<inputtype="hidden"name="csrf"value="tok-123">
<buttonrst-btn="primary"type="submit">Добавить примеры записей</button>
</form>
</div>
{{template"empty-state"dict"Body""Записей пока нет. Первая — хорошее начало.""Title""Здесь пока пусто""ActionLabel""Добавить примеры записей""PostAction""/posts/seed""Hidden" (list (list"csrf""tok-123"))}}
Только фраза
<divrst-empty>
<prst-empty-body>К этой записи пока нет комментариев.</p>
</div>
{{template"empty-state"dict"Body""К этой записи пока нет комментариев."}}