RecordPicker
The record-search picker behind a task's "Add record" chip — a flat, mixed-type result list.
Measured live on app.attio.com's Tasks page ("Edit task" → "Add record"): a "Search..." row,
then a FLAT list mixed across every object type (a person result sat first, ahead of several
companies, with no section headers — unlike the mention picker's own grouped Users/Records
shape, crisp#646). Attio's own live search took a moment to resolve, showing a centred spinner
- "Loading..." row meanwhile (
loading).TaskEditPopovercomposes this behind its own "Add record" chip.
Installation
npm install @crisp-ui-kit/crispProps
Prop
Type
Notes
-
Person rows. Pass
avatar: { name, src? }on a record for a round initials or photo tile in place oficon, the wayAssigneePickerdraws a person. Addsecondaryfor the muted line after the name (an email or a position), andselectedto show a check on a record that is already linked. -
Long names (0.69.0). The name keeps its width, capped at 60% of the row so a very long name still ends in an ellipsis, and the muted
secondarytext takes the remaining width and truncates first (crisp#1325), as Attio and Linear do. -
Create footer. Pass
createLabel(for example"Create employee") andonCreateto add Attio's trailing create row under a 1px separator. The footer is one more keyboard step after the last record. crisp does not generate the noun, so write the whole phrase yourself. -
RecordPickerRecord.iconis consumer-supplied, per-record — crisp has no built-in object-type-to-icon mapping (the same reasoningTaskList's ownrecord/metaslots use). -
emptyLabel's default ("No records") is inferred by symmetry withAssigneePicker's own measured "No users" — Attio's own empty-results case for this specific picker wasn't independently re-measured, so treat the exact copy as a placeholder to override if it matters.