Documentation Index Fetch the complete documentation index at: https://mintlify.com/a2ui-project/a2ui/llms.txt
Use this file to discover all available pages before exploring further.
A2UI components are declared as flat objects in an adjacency list rather than a nested JSON tree. Each component carries a unique id, a component type string (v0.9) or wrapper object (v0.8), and its properties at the top level. Parent components reference their children by ID, so any component can be updated independently without touching the rest of the tree.
The components documented here are part of the Basic Catalog — a general-purpose catalog maintained by the A2UI team at:
https://a2ui.org/specification/v0_9_1/catalogs/basic/catalog.json
All components share three universal properties: id (required, unique within the surface), accessibility (optional, for label and role hints), and weight (optional, flex-grow value when inside a Row or Column).
Version Differences at a Glance
The component catalogue is largely the same across v0.8 and v0.9. The structural differences are:
Aspect v0.8 v0.9 Component type declaration "component": { "Text": { ... } }"component": "Text", ...propsString literals { "literalString": "Hello" }"Hello"Static children { "explicitList": ["a", "b"] }["a", "b"]Dynamic children { "template": { "dataBinding": "/items", "componentId": "tpl" } }{ "path": "/items", "componentId": "tpl" }Data binding { "path": "/data" }{ "path": "/data" } (same)Text/image styling usageHintvariantButton styling primary: truevariant: "primary"Action format { "name": "..." }{ "event": { "name": "..." } }Choice component MultipleChoice (selections binding)ChoicePicker (value binding)Layout alignment distribution, alignmentjustify, alignTextField value prop textvalue
Layout Components
Layout components arrange their children visually. Children are always referenced by ID — never nested inline.
Row — horizontal layout container
Arranges child components left-to-right in a horizontal line. Properties Static: array of child IDs. Dynamic: { "path": "/items", "componentId": "template-id" }.
Main-axis alignment. Values: start, center, end, spaceBetween, spaceAround.
Cross-axis alignment. Values: start, center, end, stretch.
{
"id" : "toolbar" ,
"component" : "Row" ,
"children" : [ "btn-cancel" , "btn-ok" ],
"justify" : "spaceBetween" ,
"align" : "center"
}
Properties: children (explicitList or template), distribution, alignment{
"id" : "toolbar" ,
"component" : {
"Row" : {
"children" : { "explicitList" : [ "btn-cancel" , "btn-ok" ] },
"distribution" : "spaceBetween" ,
"alignment" : "center"
}
}
}
Column — vertical layout container
Arranges child components top-to-bottom in a vertical stack. Properties Static: array of child IDs. Dynamic: { "path": "/items", "componentId": "template-id" }.
Main-axis alignment. Values: start, center, end, spaceBetween, spaceAround.
Cross-axis alignment. Values: start, center, end, stretch.
{
"id" : "content" ,
"component" : "Column" ,
"children" : [ "header" , "body" , "footer" ],
"justify" : "start" ,
"align" : "stretch"
}
{
"id" : "content" ,
"component" : {
"Column" : {
"children" : { "explicitList" : [ "header" , "body" , "footer" ] },
"distribution" : "start" ,
"alignment" : "stretch"
}
}
}
Display Components
Display components render content but do not accept user input.
Text — text display with variant styling
Renders a string with optional typographic styling. text
string | DataBinding
required
The text content. Use a plain string for a literal value, or { "path": "/pointer" } to bind to the data model.
Typographic hint. Values: h1, h2, h3, h4, h5, caption, body.
{
"id" : "page-title" ,
"component" : "Text" ,
"text" : "Flight Status" ,
"variant" : "h1"
}
Data-bound example: {
"id" : "status-label" ,
"component" : "Text" ,
"text" : { "path" : "/order/status" },
"variant" : "body"
}
Uses usageHint instead of variant. String literals must be wrapped in { "literalString": "..." }. {
"id" : "page-title" ,
"component" : {
"Text" : {
"text" : { "literalString" : "Flight Status" },
"usageHint" : "h1"
}
}
}
Image — URL-based image display
Renders an image from a URL with optional fit and display variant. url
string | DataBinding
required
Image URL, or a data binding to a path that holds the URL string.
Sizing behavior. Values: contain, cover, fill, none.
Display hint (e.g., hero, thumbnail, avatar).
{
"id" : "hero-image" ,
"component" : "Image" ,
"url" : "https://example.com/hero.png" ,
"fit" : "cover" ,
"variant" : "hero"
}
Uses usageHint instead of variant. {
"id" : "hero-image" ,
"component" : {
"Image" : {
"url" : { "literalString" : "https://example.com/hero.png" },
"fit" : "cover" ,
"usageHint" : "hero"
}
}
}
Divider — visual separator
Renders a horizontal or vertical separator line between sections. Orientation of the divider. Values: horizontal (default), vertical.
{
"id" : "section-divider" ,
"component" : "Divider" ,
"axis" : "horizontal"
}
{
"id" : "section-divider" ,
"component" : {
"Divider" : {
"axis" : "horizontal"
}
}
}
Card — elevated container
A container with surface elevation, a border, and built-in padding. Holds exactly one child component. ID of the single child component to render inside the card.
{
"id" : "info-card" ,
"component" : "Card" ,
"child" : "card-content"
}
{
"id" : "info-card" ,
"component" : {
"Card" : {
"child" : "card-content"
}
}
}
Input components are bidirectionally bound to the data model. When the user changes a value, the client automatically writes the new value to the bound path.
A single- or multi-line text input. Bidirectionally bound: user edits propagate to the data model automatically. Input label shown above or inside the field.
Current value. Bind to a data model path to make it reactive.
Input type hint. Values: shortText (default), longText, number, obscured, date.
Optional regular expression for client-side validation.
{
"id" : "email-input" ,
"component" : "TextField" ,
"label" : "Email Address" ,
"value" : { "path" : "/user/email" },
"textFieldType" : "shortText"
}
Uses text (not value) for the bound property. {
"id" : "email-input" ,
"component" : {
"TextField" : {
"label" : { "literalString" : "Email Address" },
"text" : { "path" : "/user/email" },
"textFieldType" : "shortText"
}
}
}
Checkbox — boolean toggle
A labeled checkbox for boolean values. The bound path is automatically set to true or false as the user toggles. Text label displayed next to the checkbox.
JSON Pointer path to the boolean value in the data model.
{
"id" : "terms-check" ,
"component" : "CheckBox" ,
"label" : "I agree to the terms and conditions" ,
"value" : { "path" : "/form/agreedToTerms" }
}
{
"id" : "terms-check" ,
"component" : {
"CheckBox" : {
"label" : { "literalString" : "I agree to the terms and conditions" },
"value" : { "path" : "/form/agreedToTerms" }
}
}
}
Slider — numeric range input
DateTimeInput — date and time picker
ChoicePicker / MultipleChoice — select from options
Renders a list of labeled options. The user can select one or more; the selection is written to the bound data model path. v0.9 — ChoicePicker
v0.8 — MultipleChoice
Array of { "label": string, "value": string } objects.
Path to the string array of currently selected values in the data model.
Selection behavior. Values: mutuallyExclusive (default, single-select), multipleSelection (multi-select).
{
"id" : "country-picker" ,
"component" : "ChoicePicker" ,
"options" : [
{ "label" : "United States" , "value" : "us" },
{ "label" : "Canada" , "value" : "ca" },
{ "label" : "Mexico" , "value" : "mx" }
],
"value" : { "path" : "/form/country" },
"variant" : "mutuallyExclusive"
}
In v0.8, option labels use the literalString wrapper and the binding property is selections. {
"id" : "country-picker" ,
"component" : {
"MultipleChoice" : {
"options" : [
{ "label" : { "literalString" : "United States" }, "value" : "us" },
{ "label" : { "literalString" : "Canada" }, "value" : "ca" }
],
"selections" : { "path" : "/form/country" },
"maxAllowedSelections" : 1
}
}
}
List Component
List — scrollable list with template support
Container Components
An overlay dialog consisting of an entry-point trigger component (e.g., a button) and a content component rendered inside the modal layer. ID of the component that opens the modal (rendered in the normal flow).
ID of the component rendered inside the modal overlay.
{
"id" : "confirm-modal" ,
"component" : "Modal" ,
"entryPointChild" : "open-modal-btn" ,
"contentChild" : "modal-body"
}
{
"id" : "confirm-modal" ,
"component" : {
"Modal" : {
"entryPointChild" : "open-modal-btn" ,
"contentChild" : "modal-body"
}
}
}
Tabs — tabbed panel interface
Organizes content into labeled tabs. Each tab item has a title and points to a child component panel. Array of { "title": string, "child": string } objects. child is the ID of the panel component to render for that tab.
{
"id" : "settings-tabs" ,
"component" : "Tabs" ,
"tabItems" : [
{ "title" : "General" , "child" : "general-panel" },
{ "title" : "Privacy" , "child" : "privacy-panel" }
]
}
{
"id" : "settings-tabs" ,
"component" : {
"Tabs" : {
"tabItems" : [
{ "title" : { "literalString" : "General" }, "child" : "general-panel" },
{ "title" : { "literalString" : "Privacy" }, "child" : "privacy-panel" }
]
}
}
}
Message Reference updateComponents, updateDataModel, and all other message types.
Data Binding How JSON Pointer paths connect component props to live data.
Catalogs Define your own component catalog or extend the basic catalog.
Transports Deliver A2UI messages over A2A, AG-UI, WebSockets, and more.