DWG · 04.03 · COMPONENT SPEC

Table

A ruled data grid styled like a drawing schedule or bill of materials. Define columns with cell renderers; rows are your own typed data. Optionally number rows and frame it with a title block.

Drawing schedule

04.03·A
PREVIEWPX · 1:1
Drawing registerDWG · 04.03
NoSheetScaleRevsStatus
01A-101 · Ground Floor Plan1:503ISSUED
02A-102 · First Floor Plan1:501DRAFT
03A-201 · Section A–A1:502ISSUED
04A-301 · Sill Detail1:50VOID
<Table
  caption="Drawing register"
  drawingNo="04.03"
  numbered
  columns={[
    { header: "Sheet",  cell: (s) => s.name },
    { header: "Scale",  cell: (s) => s.scale, width: "6rem" },
    { header: "Revs",   cell: (s) => s.revs, align: "right" },
    { header: "Status", align: "right",
      cell: (s) => <Badge tone={tone[s.status]}>{s.status.toUpperCase()}</Badge> },
  ]}
  rows={sheets}
/>

Plain (no title block)

04.03·B
PREVIEWPX · 1:1
SheetScaleRevsStatus
A-101 · Ground Floor Plan1:503ISSUED
A-102 · First Floor Plan1:501DRAFT
A-201 · Section A–A1:502ISSUED
A-301 · Sill Detail1:50VOID
<Table columns={columns} rows={sheets} />

Row actions

04.03·D

Put a DropdownMenu in the last column for a per-row kebab (⋮) menu. Keep the menu (and its handlers) in a small client component so the table itself can stay server-rendered.

PREVIEWPX · 1:1
Drawing register
SheetScaleRevsStatus
A-101 · Ground Floor Plan1:503ISSUED
A-102 · First Floor Plan1:501DRAFT
A-201 · Section A–A1:502ISSUED
A-301 · Sill Detail1:50VOID
// RowActions.tsx — "use client"
export function RowActions({ name }) {
  return (
    <DropdownMenu
      align="end"
      trigger={<button aria-label={`Actions for ${name}`}>⋮</button>}
      items={[
        { label: "Duplicate", shortcut: "⌘D", onSelect: () => {} },
        { label: "Rename", onSelect: () => {} },
        "separator",
        { label: "Delete sheet", danger: true, onSelect: () => {} },
      ]}
    />
  );
}

// column
{ header: "", align: "right", width: "3rem",
  cell: (s) => <RowActions name={s.name} /> }

Empty state

04.03·C
PREVIEWPX · 1:1
Drawing register
SheetScaleRevsStatus
NO DATA · AWAITING SURVEY
<Table
  caption="Drawing register"
  columns={columns}
  rows={[]}
  empty="NO DATA · AWAITING SURVEY"
/>