Coast
What ten years of tide records say about the bay
Volunteers have read the gauge in the port twice a day since 2016.
Catalog · Content
Lays out a list of posts as a grid, with the latest one larger, or as a compact list of rows. Each post is a card.
Fits best: blog — a page that lists posts: the home, a category, an archive, search results
The same posts in the three layouts. Each one is a card.
Coast
What ten years of tide records say about the bay
Volunteers have read the gauge in the port twice a day since 2016.
Culture
The last tuna nets of the strait
Three families still set the almadraba each spring.
Food
Where the best tortillitas are fried
A short route through four kitchens.
The base: as many columns as fit, none under 16rem.
Coast
What ten years of tide records say about the bay
Volunteers have read the gauge in the port twice a day since 2016.
Culture
Food
luz-post-list--lead: the first post spans two columns with its picture beside it, when the list is 40rem wide or more. Narrower, it is a card like the rest.
luz-post-list--compact: one row for each post, the title and the facts, with no picture.
3 results for "tide"
Search results: the search box, then a heading that says how many, then the compact list. The posts, the word searched and the counts are placeholders: your search fills them in.
None known.
import "@luz-ds/catalog/components/post-list.css";
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/post-list.min.css" integrity="sha384-kK6zd16AVte8C1ge85pYFbh52scr+Tf3HNyUDxai1uQkIAT9+/5HJOWZZ/zzFn8H" crossorigin="anonymous">
A list, one card in each item. The first item of the lead list has its text in a <div> beside the picture:
<ul class="luz-post-list luz-post-list--lead" role="list">
<li>
<article class="luz-card">
<div class="luz-image luz-image--3x2"><img src="/media/tide.jpg" width="600" height="400" alt="" loading="lazy"></div>
<div>
<p class="luz-tag luz-tag--gray u-mb-sm">Coast</p>
<h2 class="luz-card__title"><a href="/2026/10/tide-records/">What ten years of tide records say about the bay</a></h2>
<p class="luz-card__body">Volunteers have read the gauge in the port twice a day since 2016.</p>
<p class="luz-meta"><time datetime="2026-10-12">12 October 2026</time> <span>6 min read</span></p>
</div>
</article>
</li>
<!-- one li for each post; the others have no div around their text -->
</ul>
A template for the results page of a search: a <search> with its form, a heading that says how many results there are, and the compact list. Your site's search fills in the results; the text here is a placeholder.
<search>
<form action="/search/">
<label for="q">Search the blog</label>
<input type="search" id="q" name="q" value="tide">
<button type="submit">Search</button>
</form>
</search>
<h2 id="results-title">3 results for "tide"</h2>
<ul class="luz-post-list luz-post-list--compact" role="list" aria-labelledby="results-title">
<li>
<article class="luz-card">
<h3 class="luz-card__title"><a href="/2026/10/tide-records/">What ten years of tide records say about the bay</a></h3>
<p class="luz-meta"><time datetime="2026-10-12">12 October 2026</time> <span>Coast</span></p>
</article>
</li>
<!-- one li for each result -->
</ul>
| Class | Effect |
|---|---|
.luz-post-list | On a <ul>: as many equal columns as fit, none under --luz-post-list-min (16rem), no bullets. Each card is as tall as the tallest in its row |
.luz-post-list | From 40rem of list width, the first item spans two columns and its card puts the picture beside the text, with a larger title |
.luz-post-list | One column, a row for each post: the title, and the facts at its end when there is room. Leave out the picture and the summary |
--luz-post-list-min | The narrowest a column may be. Set it on the list or an ancestor |
CSS from components/post-list.css of @luz-ds/catalog. It sets the layout; the post is core's card, with the picture, tag, title, summary and meta line you choose.
Nothing changes. It is a list of cards, and the package has no script.
<ul> is announced with its count ("list, 12 items"). Keep role="list": some browsers drop the list from a <ul> without bullets.alt="". Give the list a heading, or an aria-label, when the page has more than one.<search> is the search landmark, so the form inside it needs no role="search": adding one would nest a second landmark. Put the results outside <search>, in the <main>. If the page has more than one <search>, name each with aria-label. Name the list with the heading that counts the results, with aria-labelledby.<title> and in the <h1>. If your site filters the list in place, put the count in a separate element with role="status": a heading is not live, so a screen reader does not say it changed.Contrast and focus are in the Design tab.
Use it whenever a page shows several posts, so every list on the site is laid out alike.
Do not use it for a single card, or for items that are not posts.
.o-grid--auto.<time>, then the reading time or the section. Same order in every card.3 results for "tide"), in the heading, the <title> and the <h1> of a page that loads whole. With none, say so and how to go on: check the spelling, or try a shorter word.The cards sit on the page surface, with the same colours as any card.
| Part | Colour on background | Light | Dark | High contrast | Needs |
|---|---|---|---|---|---|
Title | --luz-brand-primary on --luz-surface | 5.9:1 | 7.2:1 | 14.1:1 | 4.5:1 |
Facts | --luz-text-secondary on --luz-surface | 6.4:1 | 6.9:1 | 19.3:1 | 4.5:1 |
Border under the pointer | --luz-input-border on --luz-surface-page | 3.7:1 | 4.2:1 | 21.0:1 | 3:1 |
Focus ring | --luz-focus-ring on --luz-surface | 5.9:1 | 7.2:1 | 21.0:1 | 3:1 |
Measured from the token values of each mode, rounded down. Needs is the WCAG 2.2 AA minimum: 4.5:1 for text, 3:1 for focus rings, borders and icons.
--luz-focus-ring around the whole card, from the link on the title.--luz-divider) is decorative and has no minimum.The 5 tokens that the .luz-post-list rules of catalog’s components/post-list.css read, by family. Each family links to its page, with the values in every mode. In Figma they are variables with the same names: see Tokens in Figma.
--luz-space-3xs, --luz-space-md, --luz-space-sm, --luz-space-xs--luz-text-xlKeyboard and ARIA are in the Code tab.