FairGarden Design

Spec Sheet

An item's measurable attributes: a species' size and range, a product's dimensions, a menu item's allergens. It wraps the spec grid and the leader list with the sheet's heading, lead, provenance line, optional figure and "More Details" disclosure. The densest module: rules only, no ornament.

import { SpecGridItem, SpecListItem, SpecSheet } from '@fairgarden-private/design/components/SpecSheet'

kind picks the build: glance (default) is the rule-topped At a Glance grid of SpecGridItems; leader a single column of "Label ···· Value" SpecListItems; form-box the grid inside a ruled box; manual a double-line frame for a full-page item. heading is the chapter-stack H2 in the section-head color; at headingLevel 3 or 4 it becomes a module head.

At a Glance and the split

At a Glance and the split

On reference pages identity heads the reading column: the portrait, the common name and the italic secondary name. With split, from 1024 px of viewport the lead and provenance line take the first half of the reading span and the grid the second; the grid's own container keeps it 2-up. Below 1024 px the lead stacks above the grid. Nothing is sticky: Audubon's sticky rail and aside cards are not adopted. more adds a "More Details" Collapsible that prints expanded; a linked book title in the provenance line is a Link around a cite.

WT

Wood Thrush

Hylocichla mustelina

At a Glance

A plump, cinnamon-backed thrush of eastern hardwood forests, best known for its flute-like, two-voiced song at dawn and dusk.

Text adapted from Lives of North American Birds(example.org/lives).

Category
Thrushes
Conservation status
Near threatened
Habitat
Deciduous forest
Length
18–21 cm (7–8 in)
Population
≈ 11 million
Region
Eastern North America
SpecSheetGlance.tsx
import { Avatar, AvatarFallback } from '@fairgarden-private/design/components/Avatar'
import { Link } from '@fairgarden-private/design/components/Link'
import { SpecGridItem, SpecSheet } from '@fairgarden-private/design/components/SpecSheet'

/** A reference page's At a Glance: the identity block, then the lead beside the grid from 1024 px. */
export function SpecSheetGlance() {
  return (
    <SpecSheet
      split
      heading="At a Glance"
      identity={{
        portrait: (
          <Avatar size="lg">
            <AvatarFallback>WT</AvatarFallback>
          </Avatar>
        ),
        commonName: 'Wood Thrush',
        secondaryName: 'Hylocichla mustelina',
      }}
      lead={
        <p>
          A plump, cinnamon-backed thrush of eastern hardwood forests, best known for its
          flute-like, two-voiced song at dawn and dusk.
        </p>
      }
      provenance={
        <>
          Text adapted from{' '}
          <Link href="https://example.org/lives">
            <cite>Lives of North American Birds</cite>
          </Link>
          .
        </>
      }
      more={{
        label: 'More Details',
        openLabel: 'Fewer Details',
        children: (
          <>
            <SpecGridItem label="Nest">Cup of dead leaves and mud</SpecGridItem>
            <SpecGridItem label="Eggs">3–4, pale blue</SpecGridItem>
          </>
        ),
      }}
    >
      <SpecGridItem label="Category">Thrushes</SpecGridItem>
      <SpecGridItem label="Conservation status">Near threatened</SpecGridItem>
      <SpecGridItem label="Habitat">Deciduous forest</SpecGridItem>
      <SpecGridItem label="Length">18–21 cm (7–8 in)</SpecGridItem>
      <SpecGridItem label="Population" estimated>
        11 million
      </SpecGridItem>
      <SpecGridItem label="Region">Eastern North America</SpecGridItem>
    </SpecSheet>
  )
}

Leader, form box and manual

Leader, form box and manual

The leader list holds its value column to the reading measure; a value that would wrap drops under its label and loses the leader. The form box draws a ruled box around the grid. The manual page frames its content in a double line. A figure sits beside the sheet from 1024 px of the sheet's own width (sheet 5, figure 7).

Bench, Oak

Width
180 cm (71 in)
Depth
45 cm (18 in)
Seat height
46 cm (18 in)
Finish
Oiled, food-safe

Survey Record

Plot
B-14
Observer
A. Díaz
Date
22 Sept 2026
Cover
≈ 60%

Garden Plate

  1. Roasted roots, warm
  2. Leaves from the east beds
  3. Seed crumble
SpecSheetKinds.tsx
import {
  SpecGridItem,
  SpecListItem,
  SpecSheet,
} from '@fairgarden-private/design/components/SpecSheet'
import styles from './kinds.module.css'

/** The leader list, the form box and the manual page. */
export function SpecSheetKinds() {
  return (
    <div className={styles.stack}>
      <SpecSheet kind="leader" heading="Bench, Oak" headingLevel={3}>
        <SpecListItem label="Width">180 cm (71 in)</SpecListItem>
        <SpecListItem label="Depth">45 cm (18 in)</SpecListItem>
        <SpecListItem label="Seat height">46 cm (18 in)</SpecListItem>
        <SpecListItem label="Finish">Oiled, food-safe</SpecListItem>
      </SpecSheet>
      <SpecSheet kind="form-box" heading="Survey Record" headingLevel={3}>
        <SpecGridItem label="Plot">B-14</SpecGridItem>
        <SpecGridItem label="Observer">A. Díaz</SpecGridItem>
        <SpecGridItem label="Date">22 Sept 2026</SpecGridItem>
        <SpecGridItem label="Cover" estimated>
          60%
        </SpecGridItem>
      </SpecSheet>
      <SpecSheet kind="manual" label="Menu item: Garden Plate">
        <p className={styles.title}>Garden Plate</p>
        <ol className={styles.steps}>
          <li>Roasted roots, warm</li>
          <li>Leaves from the east beds</li>
          <li>Seed crumble</li>
        </ol>
      </SpecSheet>
    </div>
  )
}

Grounds and print

Page grounds are the home; on forest or the night band the rules and labels take that scope's roles, and on a saturated field only a quick-facts block of up to 4 cells belongs. The sheet prints as on screen, stacked, with black 0.75 pt rules and leaders; cells never split across pages.

API Reference

SpecSheet

A spec sheet. It prints as on screen, stacked, with black 0.75 pt rules and leaders; cells never split across pages.

PropTypeDescription
label
string | undefined

Accessible name for the grid when no heading labels it.

figure
React.ReactNode | undefined

An optional figure (a §8.5 Figure). From 1024 px of the sheet it sits beside the grid (5 / 7).

heading
React.ReactNode | undefined

The section head: the chapter-stack H2 (“At a Glance”) in type-h2 and --role-heading; headingLevel 3 or 4 sets it as a module head in type-itemhead and --primary12.

headingLevel
HeadingLevel | undefined

The heading level. Default 2.

identity
SpecSheetIdentity | undefined

Reference pages: the identity block above the sheet, heading the reading column [D188].

kind
'glance' | 'leader' | 'manual' | 'form-box' | undefined

glance (default): the rule-topped At a Glance grid (SpecGrid; pass SpecGridItems). leader: one column of “Label ···· Value” rows (SpecList; pass SpecListItems). manual: a line-double frame for a full-page item (title, figure, numbered list, price, allergen matrix). form-box: a ruled box around the grid.

lead
React.ReactNode | undefined

The lead, type-lead (§3.5 Recipe C). Beside the grid with split.

more
SpecSheetMore | undefined

The “More Details” disclosure for long sheets; it prints expanded.

primary
| 'ruby'
| 'olive'
| 'sage'
| 'slate'
| 'sand'
| 'gray'
| 'mauve'
| 'brown'
| 'bronze'
| 'gold'
| 'red'
| 'crimson'
| 'tomato'
| 'pink'
| 'plum'
| 'indigo'
| 'iris'
| 'violet'
| 'purple'
| null
| undefined

Primary Radix scale: rules, labels, values, frames and focus rings. Never defaulted; omitted, it inherits the scope [D133].

provenance
React.ReactNode | undefined

The provenance line, type-small: “Text adapted from Lives of North American Birds“. Set book titles in <cite>; a linked title takes the body link’s underline.

secondary
| 'ruby'
| 'olive'
| 'sage'
| 'slate'
| 'sand'
| 'gray'
| 'mauve'
| 'brown'
| 'bronze'
| 'gold'
| 'red'
| 'crimson'
| 'tomato'
| 'pink'
| 'plum'
| 'indigo'
| 'iris'
| 'violet'
| 'purple'
| 'amber'
| 'blue'
| 'cyan'
| 'grass'
| 'green'
| 'jade'
| 'lime'
| 'mint'
| 'orange'
| 'sky'
| 'teal'
| 'yellow'
| null
| undefined

Secondary Radix scale: only a linked provenance title’s underline. Never defaulted.

split
boolean | undefined

The At a Glance split, on reference pages [D188]: from --lg-n-above the lead and provenance take the first half of the reading span and the grid the second, staying 2-up; below, the lead stacks above the grid. Default false.

children
React.ReactNode

The spec cells: SpecGridItems.

SpecGridItem and SpecListItem

One spec cell: icon and caps label on line 1, the value (type-body-ui) below, flush under the icon. Units sit outside the figure after a no-break space, metric in parentheses: “28–34 cm (11–13 in)".

PropTypeDescription
label
React.ReactNode

The caps label (type-label); author it in sentence case.

estimated
boolean | undefined

An estimated value: dotted top rule and a leading “≈". Don’t write the “≈” yourself.

icon
| 'menu'
| 'search'
| 'circle'
| 'arrow_forward'
| 'arrow_upward'
| 'expand_more'
| 'close'
| 'remove'
| 'add'
| 'check'
| 'chevron_right'
| 'chevron_left'
| 'more_horiz'
| 'play_arrow'
| 'pause'
| 'download'
| 'zoom_in'
| 'zoom_out'
| 'recenter'
| 'help'
| 'mail'
| undefined

A decorative data icon before the label (Material Symbols Rounded, inline tier, FILL 0). The label carries the meaning.

One pair: “Label ········ Value”. The leader stops --size-px-2 short of each text and sits on the label’s last baseline; a long value wraps and stays right-aligned. A label never splits from its value in print.

PropTypeDescription
label
React.ReactNode

The caps label (type-label); author it in sentence case.

Additional types

SpecGridItemProps

Props for SpecGridItem: div props, the label, an optional icon and the estimate flag.

type SpecGridItemProps = React.ClassAttributes<HTMLDivElement> &
  React.HTMLAttributes<HTMLDivElement> & {
    label: React.ReactNode;
    icon?:
      | 'menu'
      | 'search'
      | 'circle'
      | 'arrow_forward'
      | 'arrow_upward'
      | 'expand_more'
      | 'close'
      | 'remove'
      | 'add'
      | 'check'
      | 'chevron_right'
      | 'chevron_left'
      | 'more_horiz'
      | 'play_arrow'
      | 'pause'
      | 'download'
      | 'zoom_in'
      | 'zoom_out'
      | 'recenter'
      | 'help'
      | 'mail';
    estimated?: boolean;
  }
SpecListItemProps

Props for SpecListItem: div props and the label.

type SpecListItemProps = React.ClassAttributes<HTMLDivElement> &
  React.HTMLAttributes<HTMLDivElement> & { label: React.ReactNode }
specSheet
SpecSheetIdentity

The reference-page identity block [D188]: portrait, common name and secondary name.

type SpecSheetIdentity = {
  /** A §10.12 Avatar at one of its fixed steps (e.g. `size="xl"`, 128 px). */
  portrait?: React.ReactNode;
  /** The common name, `type-itemhead` in `--primary12`. */
  commonName: React.ReactNode;
  /** The secondary (scientific) name, `type-secondary-name` in italic. */
  secondaryName?: React.ReactNode;
}
SpecSheetMore

The optional “More Details” disclosure (§10.13).

type SpecSheetMore = {
  /** The trigger label, title case: "More Details" [D160]. */
  label: React.ReactNode;
  /** The label while open, e.g. "Fewer Details". Omitted, `label` stays. */
  openLabel?: React.ReactNode;
  /** The further spec rows (SpecGridItems, or SpecListItems in a leader sheet). */
  children: React.ReactNode;
}
SpecSheetProps

Props for SpecSheet: section props, the kind and split, the sheet’s parts and the color axes. split is accepted only with kind="glance".

type SpecSheetProps =
  SpecSheetGlanceProps | SpecSheetLeaderProps | SpecSheetManualProps | SpecSheetFormBoxProps

Specification: DESIGN-SYSTEM.md §12.7 (spec sheet, D188), §8.3 (spec grid) and §5.10.2 (module reflow).