ConversationRow

One conversation in the Inbox: who wrote, from where, when, and what was said last — a link to its thread.

An inbox

The list is the latest first. A row the client wrote in since the studio last looked is unread: its last words in ink and medium weight, beside an iOS-red dot. The open one wears the sidebar's soft ink wash.

States

Read, unread and open. Hover washes the row faintly; focus draws the ring.

API reference

PropTypeDefaultDescription
namestring—The client's name, or what stands in for it (“Visitor”). Cut to a line.
channels{ channel: Channel; label: string }[]—Every channel of the client's thread, the latest first: each a ChannelIcon (the booking page is “link”), with its name in words for assistive tech.
timestring—When it last moved: the time today, the day before.
previewReactNode—What was said last, cut to a line; prefix who said it when it wasn't the client. Empty, the line goes: a client's rating sits in the status instead, as RatingStars icons after its badge, never the font's ★ glyphs.
unreadbooleanfalseThe client wrote since the studio last opened it: ink, medium weight and an iOS-red dot.
unreadLabelstring—What the dot says to assistive tech: “Unread”.
selectedbooleanfalseThe open conversation: the sidebar's soft ink wash and aria-current.
statusReactNode—What's happening in it, beneath: a LiveIndicator, a short line.
…propsComponentProps<"a">—href, onClick and the rest, on the link.

Guidelines

  • A row is a link to its thread, so it opens in a new tab like any other. Selecting it in place is the page's job.
  • Unread is never colour alone: weight and the words for assistive tech carry it too.
  • The status line only for what is true now — Okami replying, the studio answering. Leave it out otherwise.