ComponentsUpdated Sep 9, 2026
Cell
The list-item surface used across the sidepanel and home: meetings, actions, history. Focusable, optionally clickable, with slots for an icon, title, content, metadata, footer, and status banner.
Source: packages/ui/src/components/cell
import { Cell, cellVariants, UnreadDot } from '@highlight/ui'Change the props; the preview and the snippet update together.
<Cell onClick={open}> <Cell.Header> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>Roadmap review</Cell.Title> </Cell.Header> <Cell.Content>Agreed to ship the design system before the Windows beta.</Cell.Content> <Cell.Metadata> <Badge>45 min</Badge> <Badge>6 people</Badge> <Badge>3 decisions</Badge> </Cell.Metadata></Cell>Header with Icon and Title. unread adds the red dot; titles clamp to three lines.
import { Calendar, FileText } from 'lucide-react'import { Cell } from '@highlight/ui' export default function CellBasic() { return ( <div className="flex w-80 flex-col gap-3"> <Cell onClick={() => {}}> <Cell.Header> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>Design sync</Cell.Title> </Cell.Header> </Cell> <Cell onClick={() => {}}> <Cell.Header> <Cell.Icon unread> <FileText /> </Cell.Icon> <Cell.Title>Recap: launch retro, with a title long enough to wrap onto a second line</Cell.Title> </Cell.Header> </Cell> </div> )}Content, Metadata (scrolls with fades when it overflows), and Footer.
import { Calendar, Clock, Users } from 'lucide-react'import { Badge, Cell } from '@highlight/ui' export default function CellComposed() { return ( <Cell className="w-96" onClick={() => {}}> <Cell.Header> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>Roadmap review</Cell.Title> </Cell.Header> <Cell.Content> Agreed to ship the design system before the Windows beta. Lin owns the Figma sync spike. </Cell.Content> <Cell.Metadata> <Badge left={<Clock />}>45 min</Badge> <Badge left={<Users />}>6 people</Badge> <Badge>3 decisions</Badge> <Badge>2 open questions</Badge> </Cell.Metadata> <Cell.Footer> <span>Today, 2:00 PM</span> <span>Notes ready</span> </Cell.Footer> </Cell> )}size="compact" tightens padding and icon. Progress paints a countdown bar. clickable={false} drops the button role.
import { Calendar } from 'lucide-react'import { Cell } from '@highlight/ui' export default function CellCompact() { return ( <div className="flex w-80 flex-col gap-2"> <Cell size="compact" onClick={() => {}}> <Cell.Header showChevron={false}> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>Standup</Cell.Title> </Cell.Header> </Cell> <Cell size="compact" isPending onClick={() => {}}> <Cell.Header showChevron={false}> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>1:1 with Lin</Cell.Title> </Cell.Header> <Cell.Progress duration={8000} startTime={new Date()} /> </Cell> <Cell size="compact" clickable={false}> <Cell.Header showChevron={false}> <Cell.Icon> <Calendar /> </Cell.Icon> <Cell.Title>Not clickable</Cell.Title> </Cell.Header> </Cell> </div> )}The root, then any compound sub-components. Every part accepts className and forwards the rest of its props to the element or Base UI part beneath it.
Cell- The row: a div (a motion div when animated) that hands its parts size and state through context.
Cell.Header- Row for Icon + Title; indicator slot; showChevron.
Cell.Icon- Tile for an icon; size, subIcon, unread, indicator.
Cell.Title- Clamped title text.
Cell.Content- Recessed body block.
Cell.Metadata- Horizontal row of Badges with overflow fades and scroll buttons.
Cell.Footer- Bottom row, space-between.
Cell.Banner- variant: 'success' | 'warning' | 'danger'; action.
Cell.Progress- duration, startTime, onComplete countdown bar along the bottom edge.
Props added on top of the underlying element or Base UI part.
| Prop | Type | Default | Description |
|---|---|---|---|
size | 'default' | 'compact' | 'default' | Padding and icon size for all parts. |
clickable | boolean | true | With onClick, adds role="button" and Enter/Space handling. |
focused | boolean | false | Force the keyboard focus ring. |
isPending | boolean | false | Pending styling for cells awaiting a result. |
layoutId / initial / animate / transition | MotionProps | — | Opt into framer-motion. Must be stable for the cell’s lifetime. |