Record Aside
The cards of a record page's right rail — titled sections of inline properties, people, linked records and full-width action rows.
- Status
- Since
0.23.19- Accessibility pattern
- labelled regions, lists, tooltip-named icon actions
Last updated
Install
Add Record Aside from the VegaStack registry. The CLI verifies the item's integrity hash before writing it.
pnpm dlx shadcn@latest add @vegastack/record-asideThe same command installs the registry items it composes: @vegastack/button, @vegastack/card, @vegastack/item, @vegastack/person-hover-card, @vegastack/searchable-select, @vegastack/skeleton, @vegastack/tooltip.
Usage
import { PropertyList, PropertySection } from "@/components/ui/property-list";
import {
ActionList,
ActionListItem,
RecordAsideAction,
RecordAsideCard,
RecordAsideSection,
} from "@/components/ui/record-aside";
<RecordAsideCard>
<RecordAsideSection title="Details">
<PropertyList variant="inline">…</PropertyList>
<PropertySection title="Participants">…</PropertySection>
</RecordAsideSection>
</RecordAsideCard>;Record Aside is the block a record page puts in its RecordLayoutRail
— and in the Details sheet that replaces the rail on small screens. A RecordAsideCard holds
RecordAsideSections; each has a small header — the title, a muted count, and an icon action with a
tooltip (RecordAsideAction) or a small Button — above its content:
- an inline
PropertyList(a fixed label column, values left-aligned at one x; quiet pickers;PropertyEmptyfor "—"), withPropertyPersonfor an avatar value; PropertySections for values too big for a row: anAvatarStackof people (each with its hover card, the rest behind "+N"), linked-record chips stacked,PropertyClampfor long text (three lines, then "Show more");- an
ActionListof full-width rows that run to the card's edges like the Inbox's: a hover tint, no underline;ActionListChipsholds a row's small picker chips, andActionListEmptyis the compact one-line empty state.
Anatomy
Examples
Actions
The record's work under their own headers: the tasks, with a ↗ icon action (tooltip "View in all tasks"), then the AI's suggestions with "Create N tasks". Rows run to the card's edges.
Loading
PropertyListSkeleton (icon, label and value bars on the same tracks), PropertySectionSkeleton
(a title bar and chip bars), ActionListSkeleton (status circle, title and meta bars) and
RecordAsideSectionSkeleton (the header bar) draw the rail's layout while the record loads.
Empty sections
A section with nothing in it keeps its header and says so in one muted line — no icon, no box.
API Reference
RecordAsideSection
| Prop | Type | Default | Description |
|---|---|---|---|
title* | React.ReactNode | — | The section's title, e.g. "Details" or "Tasks from this meeting". |
action | React.ReactNode | — | The header's trailing control: a RecordAsideAction, or a small Button. |
count | number | — | A count shown muted after the title. |
Data attributes and CSS variables on RecordAsideSection
| Attribute | Values |
|---|---|
data-slot | "record-aside-section" | "record-aside-section-header" |
RecordAsideAction
| Prop | Type | Default | Description |
|---|---|---|---|
icon* | React.ReactNode | — | The icon shown. |
label* | string | — | The tooltip, and the button's accessible name. |
loading | boolean | — | Shows a spinner over the label, blocks activation and sets aria-busy. The label keeps its
box at opacity: 0, so the button's width does not move and its accessible name survives
(API-5, A11Y-12). |
size | "default" | "icon" | "icon-lg" | "icon-sm" | "icon-xs" | "lg" | "sm" | "xs" | — | |
variant | "default" | "destructive" | "ghost" | "link" | "outline" | "secondary" | — |
PropertyClamp
| Prop | Type | Default | Description |
|---|---|---|---|
children* | React.ReactNode | — | The long value. |
className | string | — | Classes for the text. |
Data attributes and CSS variables on PropertyClamp
| Attribute | Values |
|---|---|
data-slot | "property-clamp" |
RecordAsideCard, ActionList, ActionListItem (Item's props, less size and variant),
ActionListChips, ActionListEmpty and PropertyPerson take their element's native props; the
skeletons take a row or chip count.
Accessibility
- Each section is a region named by its title; an
ActionListis a list of rows. RecordAsideActionis an icon button named by itslabel, which is also its tooltip.- A row that opens something is a link or a button (
render); controls inside it (a status menu, a checkbox) stay separate tab stops beside it, not inside it. - "Show more" is a button that reports
aria-expanded; skeletons arearia-hidden.
| Key | Action |
|---|---|
| Tab | Move between rows and their controls |
| Enter / Space | Open a row, show more, show everyone |
| Contract | States tested |
|---|---|
| Behaviour | clamp, skeleton |
| Accessibility | labeled, browser-accessibility-test |
| Visual | default, hover, empty |