Design System

Interactive Molecules

Composed components from @stackmates/ui-interactive/molecules

Dialog

Modal dialogs built on Radix UI Dialog primitive.

import {
  Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger,
} from '@stackmates/ui-interactive/molecules';

<Dialog>
  <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
  <DialogContent>
    <DialogHeader><DialogTitle>Title</DialogTitle></DialogHeader>
  </DialogContent>
</Dialog>

MessageRow

One message with avatar. User right-aligned, assistant left-aligned.

OR
Orchestrator

I'll analyze your pipeline using the optimal-stopping algorithm.

Run the sales-rfp workflow for the Acme deal.

OR
Orchestrator

Starting the sales-rfp-workflow...

MessageRowData

PropTypeDefaultDescription
id*stringUnique message identifier
role*'user' | 'assistant'Message sender role
content*stringMessage text content
createdAtstringISO timestamp
agentNamestringDisplay name for assistant
isStreamingbooleanShow streaming indicator

MessageRowProps

PropTypeDefaultDescription
message*MessageRowDataMessage data object
classNamestringAdditional CSS classes
import { MessageRow } from '@stackmates/ui-interactive/molecules';

<MessageRow message={{ id: '1', role: 'assistant', content: 'Hello!', agentName: 'Bot' }} />
<MessageRow message={{ id: '2', role: 'user', content: 'Hi there' }} />

MessageComposer

Textarea + send button. Enter sends, Shift+Enter for newline.

MessageComposerProps

PropTypeDefaultDescription
value*stringCurrent textarea value
onChange*(value: string) => voidValue change handler
onSubmit*() => voidSend handler
isLoadingbooleanfalseDisable input while sending
placeholderstring'Type a message...'Placeholder text
import { MessageComposer } from '@stackmates/ui-interactive/molecules';

<MessageComposer
  value={value}
  onChange={setValue}
  onSubmit={handleSend}
  isLoading={false}
  placeholder="Type a message..."
/>

EntitySelector

Pick entity from list with avatar initials and badges.

EntityItem

PropTypeDefaultDescription
id*stringUnique entity identifier
name*stringDisplay name
descriptionstringShort description text
badgesstring[]Tag labels (max 2 shown)

EntitySelectorProps

PropTypeDefaultDescription
entities*EntityItem[]List of selectable entities
selectedIdstringCurrently selected entity ID
onSelect*(id: string) => voidSelection handler
classNamestringAdditional CSS classes
import { EntitySelector } from '@stackmates/ui-interactive/molecules';

<EntitySelector
  entities={[{ id: '1', name: 'Agent', description: 'Desc', badges: ['tag'] }]}
  selectedId={selected}
  onSelect={setSelected}
/>

StageCard

Workflow stage with status badge, duration, and confidence.

Research & Discovery
Knowledge Architect
8.5s92%completed
Strategy Analysis
Navigator
running
Content Generation
Orchestrator
pending
Data Validation
Navigator
3.2sfailed

StageCardData

PropTypeDefaultDescription
id*stringUnique stage identifier
name*stringStage name
status*'pending' | 'running' | 'completed' | 'failed' | 'skipped'Current stage status
agentstringAgent handling this stage
durationMsnumberDuration in milliseconds
confidencenumberConfidence score 0-1

StageCardProps

PropTypeDefaultDescription
stage*StageCardDataStage data object
classNamestringAdditional CSS classes
import { StageCard } from '@stackmates/ui-interactive/molecules';

<StageCard stage={{
  id: '1', name: 'Research', status: 'completed',
  agent: 'Architect', durationMs: 8500, confidence: 0.92
}} />

More molecules: Toast, Popover, DropdownMenu, Tabs, etc.

See COMPONENT-INVENTORY.json for full list