UI Primitive: List
iLive Variants
These examples show the three baseline list versions before mapping them across existing list-like Studio pages.
Simple List
Minimal row treatment without column headers.
Sortable List
Column headers are command buttons when the list owns sorting.
- 01007 Soft geometry study three related details published
- 01008 Line weight test needs source prose draft
- 01009 Surface registration ready for catalogue review review
Thumbnail List
The first column is media. Sorting, when needed, can live in controls outside the list.
image
work
status
-
Soft geometry study
01007
published
-
Line weight test
01008
draft
-
Surface registration
01009
review
Canonical Markup
Copy the shared primitive classes first, then add page-specific classes for columns, links, row actions, and responsive labels.
Simple List
<div class="tagStudioList exampleList__list" style="--studio-list-width: 28rem;">
<ul class="tagStudioList__rows">
<li class="tagStudioList__row tagStudioList__row--center exampleList__row">
<a class="tagStudioList__cellLink" href="#">source.md</a>
<a class="tagStudioList__cellLink" href="#">ready</a>
</li>
</ul>
</div>
Sortable List
<div class="tagStudioList exampleList__list" style="--studio-list-width: 72%;">
<div class="tagStudioList__head exampleList__head">
<button class="tagStudioList__sortBtn" type="button" data-sort-key="id" data-state="active" aria-pressed="true">
id <span class="tagStudioList__sortIndicator" aria-hidden="true">↑</span>
</button>
<button class="tagStudioList__sortBtn" type="button" data-sort-key="title" aria-pressed="false">title</button>
<span class="tagStudioList__headLabel">next</span>
</div>
<ol class="tagStudioList__rows">
<li class="tagStudioList__row tagStudioList__row--start exampleList__row">
<a class="tagStudioList__cellLink" href="#">01007</a>
<span class="tagStudioList__cell">
<a class="tagStudioList__cellLink" href="#">Soft geometry study</a>
<span class="tagStudioList__cellMeta">three related details</span>
</span>
<button class="tagStudioList__cellLink" type="button">Open modal</button>
</li>
</ol>
</div>
Thumbnail List With External Sort Controls
<div class="tagStudioList exampleList__list" style="--studio-list-width: 38rem;">
<div class="exampleList__sortControls" aria-label="Thumbnail list sort controls">
<button class="tagStudio__button tagStudio__button--defaultWidth" type="button">Newest</button>
<button class="tagStudio__button tagStudio__button--defaultWidth" type="button">Title</button>
</div>
<div class="tagStudioList__head exampleList__head">
<span class="tagStudioList__headLabel">image</span>
<span class="tagStudioList__headLabel">work</span>
<span class="tagStudioList__headLabel">status</span>
</div>
<ul class="tagStudioList__rows">
<li class="tagStudioList__row tagStudioList__row--center exampleList__row">
<span class="tagStudioList__thumb">
<img class="tagStudioList__thumbImage" src="/assets/studio/img/panel-backgrounds/01007-primary-800.webp" alt="" loading="lazy" decoding="async">
</span>
<span class="tagStudioList__cell">
<a class="tagStudioList__cellLink" href="#">Soft geometry study</a>
<span class="tagStudioList__cellMeta">01007</span>
</span>
<a class="tagStudioList__cellLink" href="#">published</a>
</li>
</ul>
</div>
Notes
Implementation points only.
Primitive Scope
- The list primitive covers repeated row collections where the user scans, compares, opens, or reviews records.
- The shared layer owns the optional width wrapper, outer header, row reset, spacing, dividers, row alignment modifiers, sortable header-button treatment, common text cells, link treatment, and thumbnail geometry.
- Page-specific classes still own grid columns, cell semantics, row actions, chips, links, and data-specific responsive behavior.
- Do not use this primitive for free-form cards, dashboards, or grouped prose sections. Those belong to panels, panel links, or page-specific composition.
Current Baseline
- Use
tagStudioListas the optional width wrapper. Without--studio-list-width, the list fills the available width. - Use
tagStudioList__rowsplustagStudioList__rowfor every list version. - Use
tagStudioList__row--centerwhen every row cell is expected to stay one line. - Use
tagStudioList__row--startwhen any cell may contain multiple lines, so secondary lines align consistently beneath the first line. - Use
tagStudioList__headonly when column labels improve scanning or when the list owns sortable columns. - Use
tagStudioList__headLabelfor static column labels. - Use
tagStudioList__sortBtnfor sortable header cells, and place the visible sort direction insidetagStudioList__sortIndicator. - Use
tagStudioList__cell,tagStudioList__cellTitle, andtagStudioList__cellMetafor common stacked cell content before adding page-local text wrappers. - Use
tagStudioList__cellLinkwhen a cell value links to another page or opens a modal. - Use
tagStudioList__thumbandtagStudioList__thumbImagefor the first media column in thumbnail rows.
Versions
- Simple lists omit column headers. Use them for short collections where the surrounding page already explains the row meaning, such as small file lists.
- Sortable lists use clickable column headers for sortable columns. The active header should show direction and expose active state through button state attributes.
- Thumbnail lists reserve the first column for a fixed-size thumbnail. They may still be sorted, but sorting can be driven by nearby buttons or segmented controls outside the list rather than by the headers.
Width And Columns
- Lists fill the available width by default.
- Constrain a list by setting
--studio-list-widthon thetagStudioListwrapper. The value can be an absolute measure such as34remor a percentage such as72%. - The wrapper always keeps
max-width: 100%, so constrained lists cannot overflow their parent. - Column widths belong to the paired page/demo header and row classes through
grid-template-columns. - Size columns for the actual data. Short two- and three-column lists should not stretch wide just because the parent has room.
- Keep header and row column templates paired so labels and row cells stay aligned.
Type And Links
- Studio UI primitives use the small type scale by default. In CSS this is
--font-small, which maps to--text-sm. - Normal page prose outside primitives should continue to use
--font-body, which maps to--text-md. - Any row item may be a link to another page or a button that opens a modal.
- Do not make the whole row clickable by default. Use explicit links or buttons in the relevant cells unless a separate row-link variation has been defined.
Sorting Guidance
- If clicking a header changes order, render that header as a real button, not a static label with a click handler.
- Static labels and sortable buttons can appear in the same header row when only some columns are sortable.
- The sort arrow is a state indicator, not decorative page copy. Keep it adjacent to the active sort label.
- If sorting is controlled outside the list, keep headers static and put the controls before the list so the interaction order is clear.
Thumbnail Guidance
- Thumbnails should use stable dimensions so image loading cannot shift the row.
- Use empty
alttext when the adjacent row title already identifies the item and the thumbnail is supporting context. - Missing media should preserve the same frame size with a neutral placeholder or page-specific fallback state.
- Keep thumbnail rows aligned to the center of the media column when text stays one-line or compact. Use top alignment when the row is metadata-heavy.
Current Mapping Notes
catalogue-status,series-tags, docs broken links, and activity reports already use the shared list shell with page-specific columns.- Work-detail and related-record rows currently use their own list-like composition; thumbnail behavior from this primitive can guide a later convergence pass.
- Existing live routes still contain local row classes for their data model. This primitive does not require moving those classes into the shared layer unless the visual behavior repeats.