The built-in A2UI catalog provides 18 Angular components covering display, layout, interactive controls, media, and advanced inputs. Pass a2uiBasicCatalog() to the ChatComponentviews input to enable A2UI rendering, or instantiate it directly for custom setups.
Import:
import { a2uiBasicCatalog } from '@threadplane/chat';
Returns a ViewRegistry mapping 18 A2UI type names to their Angular component implementations. Pass the result to A2uiSurfaceComponent or use it as a starting point for a custom registry.
Layout components receive childKeys โ an array of component IDs โ and render each child via json-render's RenderElementComponent. They also receive the full spec so that child elements can be looked up by key.
iSix layout components total
Row, Column, Card, and List are below. Two more layout components โ Tabs and Modal โ live further down (after the Interactive section) because they also expose interactive state. All six share the same childKeys + spec rendering model.
Renders children in a scrollable vertical list (max height 24rem).
A2UI type
Angular component
Selector
List
A2uiListComponent
a2ui-list
Prop
Type
Description
childKeys
string[]
Ordered list of child component IDs
spec
Spec
Injected automatically by the render engine
iTemplate children
For data-driven lists, use the A2uiChildTemplate form instead of static childKeys. Set children to {"path": "/items", "componentId": "item-template"} and the surface component will expand the template once per array item. See the Surface Component page for details.
Interactive components support two-way data binding and button actions. They receive two special injected props:
_bindings โ a Record<string, string> auto-populated by surfaceToSpec() from path references in the component definition. Maps prop names to JSON Pointer paths. When the user changes a bound value, the component emits an a2ui:datamodel: event. Agents do not write _bindings directly โ they use path references (e.g., {"path": "/name"}) and the render pipeline extracts bindings automatically.
emit โ injected by the render engine; components call it to dispatch events back to the chat.
Renders a button that dispatches an action when clicked.
A2UI type
Angular component
Selector
Button
A2uiButtonComponent
a2ui-button
Prop
Type
Description
childKeys
string[]
Child component IDs whose rendered output is the button's content (e.g., a Text label)
primary
boolean
Renders the primary visual style. Defaults to true
disabled
boolean
Disables the button when true
action
A2uiAction
Action to execute on click (event or function call)
validationResult
A2uiValidationResult
Pre-computed validation result โ button is disabled if valid is false
emit
injected
Event emitter provided by the render engine
ichild vs childKeys
The Angular A2uiButtonComponent input is childKeys (an array) โ that's the resolved shape your component code sees. On the A2UI wire, a Button definition may use the singular child field (e.g. "child": "submit_label", as shown in the overview); the surface pipeline normalizes that singular child into the childKeys array before the component renders. Author surfaces with whichever the agent emits; both resolve to childKeys here.
Action types:
// Emit a named event with resolved context (sent back to the agent as v1 action){"action": {"event": {"name": "submit", "context": {"email": {"path": "/email"}, "formId": "contact"}}}}// Execute a local function (e.g., open a URL) โ agent never sees this{"action": {"functionCall": {"call": "openUrl", "args": {"url": "https://example.com"}}}}
Validation checks reference built-in validators by name. If any check fails, the button is automatically disabled: