The built-in A2UI catalog provides 18 Angular components implementing the A2UI v0.9 basic catalog — 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';
Signature
function a2uiBasicCatalog(): ViewRegistry
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.
const catalog = a2uiBasicCatalog();
On the wire, components are flat objects: id, a component string naming the catalog type, and props at the same level. Dynamic props are bare literals or { "path": "/pointer" } data-model bindings.
Renders a Material Symbols glyph by name — A2UI's canonical icon set. The v0.9 catalog names are camelCase (accountCircle, shoppingCart); the component maps them to the matching ligature. An inline { "svgPath": "..." } object renders a raw SVG path instead.
A2UI type
Angular component
Selector
Icon
A2uiIconComponent
a2ui-icon
Prop
Type
Description
name
string | { svgPath: string }
Material Symbols name (e.g. "check", "locationOn") or an inline SVG path
Host apps must load the Material Symbols Outlined stylesheet for glyphs to render — see the @threadplane/chat README.
Divider
Renders a horizontal or vertical rule.
A2UI type
Angular component
Selector
Divider
A2uiDividerComponent
a2ui-divider
Prop
Type
Description
axis
'horizontal' | 'vertical'
Orientation. Defaults to horizontal
Layout Components
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. On the wire, the children prop is a plain array of ids (or a { path, componentId } template).
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.
Row
Arranges children horizontally with a flex row layout.
A2UI type
Angular component
Selector
Row
A2uiRowComponent
a2ui-row
Prop
Type
Description
childKeys
string[]
Ordered list of child component IDs (from the wire children array)
Renders content inside a rounded bordered card container. On the wire, Card takes a single child id; wrap multiple elements in a Column or Row first.
A2UI type
Angular component
Selector
Card
A2uiCardComponent
a2ui-card
Prop
Type
Description
childKeys
string[]
Child component IDs (the wire child id, normalized to an array)
spec
Spec
Injected automatically by the render engine
List
Renders children in a scrollable list.
A2UI type
Angular component
Selector
List
A2uiListComponent
a2ui-list
Prop
Type
Description
childKeys
string[]
Ordered list of child component IDs
direction
'vertical' | 'horizontal'
Layout direction. Defaults to vertical
align
'start' | 'center' | 'end' | 'stretch'
Cross-axis alignment. Defaults to stretch
spec
Spec
Injected automatically by the render engine
iTemplate children
For data-driven lists, use the template form instead of a static id array. Set children to {"path": "/items", "componentId": "item-template"} and the surface component will expand the template once per array item, resolving relative paths per item. See the Surface Component page for details.
Interactive Components
Interactive components support two-way data binding and button actions. They receive two special injected props:
_bindings — a Record<string, string> auto-populated by the surface-to-spec conversion from { "path": ... } references in the component definition. Maps prop names to JSON Pointer paths. When the user changes a bound value, the component writes it back through the render state store. 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.
Button
Renders a button that dispatches an action when clicked. On the wire, a Button has no text prop — its label is a child Text component referenced by id.
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 (the wire child id, normalized to an array)
variant
'default' | 'primary' | 'borderless'
Visual style hint. Defaults to default
disabled
boolean
Disables the button when true
spec
Spec
Injected automatically by the render engine
emit
injected
Event emitter provided by the render engine
Action wiring: the wire action prop is protocol structure, not a component input. The surface pipeline converts an event action into a render click binding on the element:
Context values can be path references (resolved at click time) or bare literals. The resulting A2uiActionMessage is emitted on <a2ui-surface>'s (action) output.
TextField
A text input with optional label, supporting single-line, multi-line, numeric, and obscured variants.
A2UI type
Angular component
Selector
TextField
A2uiTextFieldComponent
a2ui-text-field
Prop
Type
Description
label
string
Input label
value
string
Current value (resolved from a path reference)
variant
'shortText' | 'longText' | 'number' | 'obscured'
Input type — longText renders a textarea, number a numeric input, obscured a password input. Defaults to shortText
A tabbed container that shows one child panel at a time. On the wire, tabs is an array of { title, child } pairs; the surface pipeline resolves the titles into a tabTitles string array and the child ids into childKeys.
A dialog overlay. On the wire, Modal names a trigger component (rendered inline; clicking it opens the modal) and a content component (rendered inside the overlay). Clicking the backdrop dismisses it.
The v0.9 basic catalog defines typed client-side functions that can appear in { "call": ... } dynamic values and checks rules: validation (required, regex, length, numeric, email), formatting (formatString, formatNumber, formatCurrency, formatDate, pluralize), logic (and, or, not), and openUrl. The formatting and logic functions (formatString with ${...} interpolation, formatNumber, formatCurrency, formatDate, pluralize, and, or, not) execute client-side via createA2uiFunctionRegistry(), which surfaceToSpec applies to every dynamic value. openUrl runs as a local action through the surface component's built-in a2ui:localAction fallback (new tab, noopener). The validation functions (required, regex, length, numeric, email) power checks rules ({ condition, message }) on input components: the surface evaluates every rule against the live data model (user edits included) when an event action fires — failing checks block the action, render message under the offending input, and emit a VALIDATION_FAILED error message through the surface component's validationError output. A TextField.validationRegexp with a bound value contributes an implicit regex rule.