The key, rendered as the muted <dt> in the aligned label column.
children
ReactNode
n/a
The value (<dd>): text, a StatusValue pill, a link, an avatar+name. Omit / empty → a muted -.
mono
boolean
false
Render the value in the font.family.mono token (ids, token counts, hashes, commits).
multiline
boolean
false
Let the value wrap across lines (paths, descriptions) instead of staying on one baseline.
copyText
string
n/a
Reveals a copy button (a separate focusable target) that writes this string and confirms Copied for 2s.
KeyValueList wraps the rows in the lifted card + semantic <dl>. Props: title?, labelWidth? (aligned column, px), variant?: ‘aligned’ | ‘stacked’ (stacked puts the label above the value for narrow panes).
Parameter
Type
Default
Description
label *
String
n/a
The key. Rendered with labelMedium in colors.onCardMuted.
value *
String
n/a
The value. Rendered in colors.onCard; blank falls back to "-" via ifBlank.
modifier
Modifier
Modifier
External modifier. The row fills width and pads 16.dp × 12.dp.
mono
Boolean
false
Render the value with FontFamily.Monospace (ids, counts, container names, loads).
The shipped rows live inside ClusterSheet / ToolCallCard on a card; Spacer(Modifier.weight(1f)) pushes the value to the trailing edge. Status values reuse colors.statusSuccess / statusWarning / statusError / statusInfo, never the brand cyan.
Parameter
Type
Default
Description
label *
String
n/a
The key. .foregroundStyle(NockerlTheme.onSurfaceMuted).
value *
String
n/a
The value. .foregroundStyle(NockerlTheme.onSurface); empty falls back to "-".
mono
Bool
false
Apply .monospacedDigit() for numeric ids / counts.
The value is pushed right by Spacer() inside an HStack. A status value uses a ProviderBadge-style capsule; a copyable value pairs a NockerlIconButton that flips doc.on.doc → checkmark and accent → success on copy.
Cross-platform drift (tracked for reconciliation)
No shipped component yet. All three platforms render this pattern inline (Compose in ClusterSheet / ToolCallCard; Swift in HomeSection / HistoryView); none has a reusable KeyValue API. The signatures above are the intended extraction.
SwiftUI ignores LabeledContent. The native LabeledContent (which exists and does exactly this) is not used. Voice hand-builds HStack { label · Spacer · value }. It should adopt LabeledContent for free platform alignment.
Copy affordance is web + Android + Swift, but not uniform: Compose’s CopyableCodeSurface and Voice’s copy icon both flip to a check on success; the web reveals the button on row hover/focus. Reconcile the reveal + confirm timing.