Skip to content
Component installs need the registry setup
VegaStack Design

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
stable
Since
0.23.19
Accessibility pattern
labelled regions, lists, tooltip-named icon actions

Last updated

Details

Type
Client call
Duration
42 min
Created by
ARAsha Rao
Created at
25 Sep, 10:30

Participants

Linked to

Notes

The customer wants the retrofit quote split into two phases, with the first phase covering the compressors only. Finance needs the revised numbers before the Thursday review, and the site team asked for a walkthrough the week after.

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-aside

The 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; PropertyEmpty for "—"), with PropertyPerson for an avatar value;
  • PropertySections for values too big for a row: an AvatarStack of people (each with its hover card, the rest behind "+N"), linked-record chips stacked, PropertyClamp for long text (three lines, then "Show more");
  • an ActionList of full-width rows that run to the card's edges like the Inbox's: a hover tint, no underline; ActionListChips holds a row's small picker chips, and ActionListEmpty is the compact one-line empty state.

Details

Type
Client call
Duration
42 min
Created by
ARAsha Rao
Created at
25 Sep, 10:30

Participants

Linked to

Notes

The customer wants the retrofit quote split into two phases, with the first phase covering the compressors only. Finance needs the revised numbers before the Thursday review, and the site team asked for a walkthrough the week after.

Anatomy

RecordAsideCard — data-slot="record-aside-card"
RecordAsideSection — data-slot="record-aside-section" | "record-aside-section-header"
RecordAsideAction
ActionList — data-slot="action-list"
ActionListItem — data-slot="action-list-item"
ActionListEmpty — data-slot="action-list-empty"
PropertyPerson — data-slot="property-person"
PropertyClamp — data-slot="property-clamp"
ActionListChips — data-slot="action-list-chips"
PropertyListSkeleton — data-slot="property-list-skeleton"
PropertySectionSkeleton — data-slot="property-section-skeleton"
ActionListSkeleton — data-slot="action-list-skeleton"
RecordAsideSectionSkeleton — data-slot="record-aside-section-skeleton"

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.

Tasks from this meeting2

Action items1

Share the revised numbers with finance

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.

Tasks from this meeting0

No tasks yet

Action items0

No suggestions

API Reference

RecordAsideSection

PropTypeDefaultDescription
title*React.ReactNode—The section's title, e.g. "Details" or "Tasks from this meeting".
actionReact.ReactNode—The header's trailing control: a RecordAsideAction, or a small Button.
countnumber—A count shown muted after the title.

Data attributes and CSS variables on RecordAsideSection

AttributeValues
data-slot"record-aside-section" | "record-aside-section-header"

RecordAsideAction

PropTypeDefaultDescription
icon*React.ReactNode—The icon shown.
label*string—The tooltip, and the button's accessible name.
loadingboolean—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

PropTypeDefaultDescription
children*React.ReactNode—The long value.
classNamestring—Classes for the text.

Data attributes and CSS variables on PropertyClamp

AttributeValues
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 ActionList is a list of rows.
  • RecordAsideAction is an icon button named by its label, 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 are aria-hidden.
KeyAction
TabMove between rows and their controls
Enter / SpaceOpen a row, show more, show everyone
ContractStates tested
Behaviourclamp, skeleton
Accessibilitylabeled, browser-accessibility-test
Visualdefault, hover, empty

Do / Don't

Do
Keep the facts first (Details), then the record's work (tasks, suggestions), each under its own section header.
Don't
Underline rows on hover or give them their own borders — the tint is the hover, the card is the frame.

On this page