This page showcases all A2UI components with examples and usage patterns.
NOTE: Schema Files
=== "v0.8"
[:material-code-json: Standard Catalog Definition (JSON Schema)](../../specification/v0_8/json/standard_catalog_definition.json)=== "v0.9"
[:material-code-json: Basic Catalog Definition (JSON Schema)](../../specification/v0_9/catalogs/basic/catalog.json)
Horizontal layout container. Children are arranged left-to-right.
=== "v0.8"
**Properties:** `children` (`explicitList` or `template`), `distribution`, `alignment`
```json
{
"id": "toolbar",
"component": {
"Row": {
"children": { "explicitList": ["btn1", "btn2", "btn3"] },
"distribution": "spaceBetween",
"alignment": "center"
}
}
}
```
=== "v0.9"
**Properties:** `children` (array or template), `justify`, `align`
```json
{
"id": "toolbar",
"component": "Row",
"children": ["btn1", "btn2", "btn3"],
"justify": "spaceBetween",
"align": "center"
}
```
Vertical layout container. Children are arranged top-to-bottom.
=== "v0.8"
**Properties:** `children` (`explicitList` or `template`), `distribution`, `alignment`
```json
{
"id": "content",
"component": {
"Column": {
"children": { "explicitList": ["header", "body", "footer"] },
"distribution": "start",
"alignment": "stretch"
}
}
}
```
=== "v0.9"
**Properties:** `children` (array or template), `justify`, `align`
```json
{
"id": "content",
"component": "Column",
"children": ["header", "body", "footer"],
"justify": "start",
"align": "stretch"
}
```
Scrollable list of items. Supports static children and dynamic templates.
=== "v0.8"
**Properties:** `children` (`explicitList` or `template`), `direction`, `alignment`
```json
{
"id": "message-list",
"component": {
"List": {
"children": {
"template": {
"dataBinding": "/messages",
"componentId": "message-item"
}
},
"direction": "vertical"
}
}
}
```
=== "v0.9"
**Properties:** `children` (array or template), `direction`, `align`
```json
{
"id": "message-list",
"component": "List",
"children": {
"componentId": "message-item",
"path": "/messages"
},
"direction": "vertical"
}
```
Display text content with styling hints.
=== "v0.8"
**Properties:** `text` (BoundValue), `usageHint`
`usageHint` values: `h1`, `h2`, `h3`, `h4`, `h5`, `caption`, `body`
```json
{
"id": "title",
"component": {
"Text": {
"text": { "literalString": "Welcome to A2UI" },
"usageHint": "h1"
}
}
}
```
=== "v0.9"
**Properties:** `text` (string or DataBinding), `variant`
`variant` values: `h1`, `h2`, `h3`, `h4`, `h5`, `caption`, `body`
```json
{
"id": "title",
"component": "Text",
"text": "Welcome to A2UI",
"variant": "h1"
}
```
Display images from URLs.
=== "v0.8"
**Properties:** `url` (BoundValue), `fit`, `usageHint`
```json
{
"id": "hero",
"component": {
"Image": {
"url": { "literalString": "https://example.com/hero.png" },
"fit": "cover",
"usageHint": "hero"
}
}
}
```
=== "v0.9"
**Properties:** `url` (string or DataBinding), `fit`, `variant`
```json
{
"id": "hero",
"component": "Image",
"url": "https://example.com/hero.png",
"fit": "cover",
"variant": "hero"
}
```
Display icons from the basic set defined in the catalog.
=== "v0.8"
**Properties:** `name` (BoundValue)
```json
{
"id": "check-icon",
"component": {
"Icon": {
"name": { "literalString": "check" }
}
}
}
```
=== "v0.9"
**Properties:** `name` (string or DataBinding)
```json
{
"id": "check-icon",
"component": "Icon",
"name": "check"
}
```
Visual separator line.
=== "v0.8"
**Properties:** `axis`
```json
{
"id": "separator",
"component": {
"Divider": {
"axis": "horizontal"
}
}
}
```
=== "v0.9"
**Properties:** `axis`
```json
{
"id": "separator",
"component": "Divider",
"axis": "horizontal"
}
```
Clickable button that triggers an action.
=== "v0.8"
**Properties:** `child` (component ID), `primary` (boolean), `action`
```json
{
"id": "submit-btn",
"component": {
"Button": {
"child": "submit-text",
"primary": true,
"action": {
"name": "submit_form"
}
}
}
}
```
=== "v0.9"
**Properties:** `child` (component ID), `variant`, `action`
```json
{
"id": "submit-btn",
"component": "Button",
"child": "submit-text",
"variant": "primary",
"action": {
"event": {
"name": "submit_form"
}
}
}
```
Text input field with optional validation.
=== "v0.8"
**Properties:** `label` (BoundValue), `text` (BoundValue), `textFieldType`, `validationRegexp`
`textFieldType` values: `shortText`, `longText`, `number`, `obscured`, `date`
```json
{
"id": "email-input",
"component": {
"TextField": {
"label": { "literalString": "Email Address" },
"text": { "path": "/user/email" },
"textFieldType": "shortText"
}
}
}
```
=== "v0.9"
**Properties:** `label` (string), `value` (string or DataBinding), `textFieldType`, `validationRegexp`
`textFieldType` values: `shortText`, `longText`, `number`, `obscured`, `date`
```json
{
"id": "email-input",
"component": "TextField",
"label": "Email Address",
"value": { "path": "/user/email" },
"textFieldType": "shortText"
}
```
Boolean toggle.
=== "v0.8"
**Properties:** `label` (BoundValue), `value` (BoundValue, boolean)
```json
{
"id": "terms-checkbox",
"component": {
"CheckBox": {
"label": { "literalString": "I agree to the terms" },
"value": { "path": "/form/agreedToTerms" }
}
}
}
```
=== "v0.9"
**Properties:** `label` (string), `value` (DataBinding, boolean)
```json
{
"id": "terms-checkbox",
"component": "CheckBox",
"label": "I agree to the terms",
"value": { "path": "/form/agreedToTerms" }
}
```
Numeric range input.
=== "v0.8"
**Properties:** `value` (BoundValue), `minValue`, `maxValue`
```json
{
"id": "volume",
"component": {
"Slider": {
"value": { "path": "/settings/volume" },
"minValue": 0,
"maxValue": 100
}
}
}
```
=== "v0.9"
**Properties:** `value` (DataBinding), `minValue`, `maxValue`
```json
{
"id": "volume",
"component": "Slider",
"value": { "path": "/settings/volume" },
"minValue": 0,
"maxValue": 100
}
```
Date and/or time picker.
=== "v0.8"
**Properties:** `value` (BoundValue), `enableDate`, `enableTime`
```json
{
"id": "date-picker",
"component": {
"DateTimeInput": {
"value": { "path": "/booking/date" },
"enableDate": true,
"enableTime": false
}
}
}
```
=== "v0.9"
**Properties:** `value` (DataBinding), `enableDate`, `enableTime`
```json
{
"id": "date-picker",
"component": "DateTimeInput",
"value": { "path": "/booking/date" },
"enableDate": true,
"enableTime": false
}
```
Select one or more options from a list.
=== "v0.8"
**Properties:** `options` (array), `selections` (BoundValue), `maxAllowedSelections`
```json
{
"id": "country-select",
"component": {
"MultipleChoice": {
"options": [
{ "label": { "literalString": "USA" }, "value": "us" },
{ "label": { "literalString": "Canada" }, "value": "ca" }
],
"selections": { "path": "/form/country" },
"maxAllowedSelections": 1
}
}
}
```
=== "v0.9"
**Properties:** `options` (array), `selections` (DataBinding), `maxAllowedSelections`
```json
{
"id": "country-select",
"component": "ChoicePicker",
"options": [
{ "label": "USA", "value": "us" },
{ "label": "Canada", "value": "ca" }
],
"selections": { "path": "/form/country" },
"maxAllowedSelections": 1
}
```
Container with elevation/border and padding.
=== "v0.8"
**Properties:** `child` (component ID)
```json
{
"id": "info-card",
"component": {
"Card": {
"child": "card-content"
}
}
}
```
=== "v0.9"
**Properties:** `child` (component ID)
```json
{
"id": "info-card",
"component": "Card",
"child": "card-content"
}
```
Overlay dialog triggered by an entry point component.
=== "v0.8"
**Properties:** `entryPointChild` (component ID), `contentChild` (component ID)
```json
{
"id": "confirmation-modal",
"component": {
"Modal": {
"entryPointChild": "open-modal-btn",
"contentChild": "modal-content"
}
}
}
```
=== "v0.9"
**Properties:** `entryPointChild` (component ID), `contentChild` (component ID)
```json
{
"id": "confirmation-modal",
"component": "Modal",
"entryPointChild": "open-modal-btn",
"contentChild": "modal-content"
}
```
Tabbed interface for organizing content into switchable panels.
=== "v0.8"
**Properties:** `tabItems` (array of `{ title, child }`)
```json
{
"id": "settings-tabs",
"component": {
"Tabs": {
"tabItems": [
{ "title": { "literalString": "General" }, "child": "general-tab" },
{ "title": { "literalString": "Privacy" }, "child": "privacy-tab" }
]
}
}
}
```
=== "v0.9"
**Properties:** `tabItems` (array of `{ title, child }`)
```json
{
"id": "settings-tabs",
"component": "Tabs",
"tabItems": [
{ "title": "General", "child": "general-tab" },
{ "title": "Privacy", "child": "privacy-tab" }
]
}
```
All components share:
id(required): Unique identifier within the surface.accessibility: Accessibility attributes (label, role).weight: Flex-grow value when inside a Row or Column.
The component names and properties are largely the same across versions. The structural differences are:
| Aspect | v0.8 | v0.9 |
|---|---|---|
| Component wrapper | "component": { "Text": { ... } } |
"component": "Text", ...props |
| String values | { "literalString": "Hello" } |
"Hello" |
| Children | { "explicitList": ["a", "b"] } |
["a", "b"] |
| Data binding | { "path": "/data" } |
{ "path": "/data" } (same) |
| Text/Image styling | usageHint |
variant |
| Button styling | primary: true |
variant: "primary" |
| Action format | { "name": "..." } |
{ "event": { "name": "..." } } |
| Choice component | MultipleChoice |
ChoicePicker |
| Layout alignment | distribution, alignment |
justify, align |
| TextField value | text |
value |
To see all components in action:
cd samples/client/angular
yarn start galleryNote
Package Manager Usage: Running the built-in sample applications within the A2UI repository requires Yarn (yarn start gallery) as configured by Corepack workspaces. For your own regular usage and standalone projects outside this repository, use the package manager of your choice (e.g. npm, pnpm).
NOTE: Schema Files
=== "v0.8"
[:material-code-json: Standard Catalog Definition (JSON Schema)](../../specification/v0_8/json/standard_catalog_definition.json)=== "v0.9"
[:material-code-json: Basic Catalog Definition (JSON Schema)](../../specification/v0_9/catalogs/basic/catalog.json)
- Defining Your Own Catalog: Build your own components
- Theming Guide: Style components to match your brand