Skip to content

Widgets

Widgets are reusable, self-contained UI components built with A2UI. Unlike pages (which are app-specific), widgets can be:

  • Used across multiple pages in your project
  • Shared with other projects
  • Configured with different data sources per usage
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Widget: KPI Card β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ πŸ“ˆ β”‚ Revenue β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ $124,500 β”‚
β”‚ β–² 12.5% from last month β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Used in:
β”œβ”€β”€ Dashboard Page (binds to /revenue)
β”œβ”€β”€ Reports Page (binds to /monthly-summary)
└── Other Project β†’ Widget Library
AspectWidgetPage
ScopeReusable anywhereApp-specific
PurposeSelf-contained componentFull-screen layout
DataConfigured per usageBound to app state
SharingExportable/importableNot shareable

A widget defines:

  1. Inputs - Configurable properties
  2. Components - A2UI structure
  3. Bindings - Data connections
  4. Styling - Visual customization
  5. Actions - User interaction handlers
{
"id": "kpi-card",
"name": "KPI Card",
"description": "Displays a key metric with trend indicator",
"inputs": {
"title": { "type": "string", "required": true },
"value": { "type": "binding", "required": true },
"trend": { "type": "binding" },
"icon": { "type": "string", "default": "chart" }
},
"components": [
{
"id": "root",
"component": {
"Card": {
"children": { "explicitList": ["header", "content"] }
}
}
},
{
"id": "header",
"component": {
"Row": {
"children": { "explicitList": ["icon", "title"] }
}
}
},
{
"id": "icon",
"component": {
"Icon": { "name": { "path": "/inputs/icon" } }
}
},
{
"id": "title",
"component": {
"Text": {
"text": { "path": "/inputs/title" },
"usageHint": "caption"
}
}
},
{
"id": "content",
"component": {
"Column": {
"children": { "explicitList": ["value", "trend"] }
}
}
},
{
"id": "value",
"component": {
"Text": {
"text": { "path": "/inputs/value" },
"usageHint": "h2"
}
}
},
{
"id": "trend",
"component": {
"Text": {
"text": { "path": "/inputs/trend" },
"usageHint": "caption"
}
}
}
]
}

Flow-Like lets you create widgets with AI, manually, or both:

Design widgets interactively with drag-and-drop:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Widget Builder: KPI Card [Test Data β–Ύ] β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚ β”‚ β”‚
β”‚ COMPONENTS β”‚ CANVAS β”‚ WIDGET INPUTS β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Define what can β”‚
β”‚ β”‚ Text β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β” β”‚ β”‚ be configured: β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ πŸ“ˆ β”‚ Revenue β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β””β”€β”€β”€β”€β”˜ $124,500 β”‚ β”‚ title: string β”‚
β”‚ β”‚ Icon β”‚ β”‚ β”‚ β–² 12.5% β”‚ β”‚ value: binding β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ trend: binding β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ icon: string β”‚
β”‚ β”‚ Card β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ [+ Add Input] β”‚
β”‚ β”‚ β”‚ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ [Cancel] [Save Widget] [Export .widget]β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Describe the widget to an AI agent:

Create a KPI card widget that displays:
- An icon on the left
- A title and large value
- A trend indicator showing percentage change
- Make the trend green if positive, red if negative

The agent creates the A2UI structureβ€”open it in the visual builder to refine.

The power is in combining both:

WorkflowDescription
AI β†’ RefineAgent creates widget, you polish in builder
Build β†’ EnhanceStart manually, ask AI to add features
Template β†’ CustomizePick a starter widget, make it yours

Everything produces standard A2UI formatβ€”fully interchangeable.

Build with A2UI’s standard catalog:

CategoryComponents
LayoutRow, Column, List
DisplayText, Image, Icon, Video, Divider
InteractiveButton, TextField, CheckBox, DateTimeInput, Slider
ContainerCard, Tabs, Modal

Inputs make widgets configurable:

{
"inputs": {
"title": {
"type": "string",
"required": true,
"description": "Card title"
},
"data": {
"type": "binding",
"required": true,
"description": "Data source path"
},
"showTrend": {
"type": "boolean",
"default": true
},
"variant": {
"type": "enum",
"options": ["default", "compact", "large"],
"default": "default"
}
}
}
TypeDescriptionExample
stringText value"Revenue"
numberNumeric value42
booleanTrue/falsetrue
enumOne of options"compact"
bindingData path"/metrics/revenue"
actionFlow to trigger"submit-form"

Reference widgets by ID:

{
"id": "revenue-card",
"widgetRef": "kpi-card",
"inputs": {
"title": "Revenue",
"value": "/metrics/revenue",
"trend": "/metrics/revenueTrend",
"icon": "dollar"
}
}

Use the same widget with different data:

{
"components": [
{
"id": "revenue",
"widgetRef": "kpi-card",
"inputs": { "title": "Revenue", "value": "/revenue" }
},
{
"id": "orders",
"widgetRef": "kpi-card",
"inputs": { "title": "Orders", "value": "/orders" }
},
{
"id": "customers",
"widgetRef": "kpi-card",
"inputs": { "title": "Customers", "value": "/customers" }
}
]
}

Package widgets for sharing:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Export Widget β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Widget: KPI Card β”‚
β”‚ Version: 1.0.0 β”‚
β”‚ β”‚
β”‚ β˜‘ Include styling β”‚
β”‚ β˜‘ Include example data β”‚
β”‚ ☐ Include flow dependencies β”‚
β”‚ β”‚
β”‚ [Cancel] [Export .widget] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Add widgets from other projects:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Import Widget β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ πŸ“ Drop .widget file here β”‚
β”‚ β”‚
β”‚ Or browse from: β”‚
β”‚ β€’ Local files β”‚
β”‚ β€’ Widget marketplace β”‚
β”‚ β€’ Team shared library β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Your project maintains a widget library:

project/
β”œβ”€β”€ pages/
β”‚ β”œβ”€β”€ dashboard.json
β”‚ └── reports.json
β”œβ”€β”€ widgets/
β”‚ β”œβ”€β”€ kpi-card.widget.json
β”‚ β”œβ”€β”€ data-table.widget.json
β”‚ β”œβ”€β”€ chart-line.widget.json
β”‚ └── user-avatar.widget.json
└── shared/
└── imported-widgets/
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ πŸ“Š Chart Widget β”‚
β”‚ ──────────────────── β”‚
β”‚ β•±β•² β•±β•² β”‚
β”‚ β•± β•² β•± β•² β•± β”‚
β”‚ β•± β•²β•± β•²β•± β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ πŸ“ Contact Form Widget β”‚
β”‚ ──────────────────── β”‚
β”‚ Name: [____________] β”‚
β”‚ Email: [___________] β”‚
β”‚ Message: β”‚
β”‚ [___________________] β”‚
β”‚ [Submit] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ πŸ‘€ John Doe β”‚
β”‚ [email protected] β”‚
β”‚ [View] [Edit] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Widgets can connect to flows:

{
"actions": {
"onSubmit": {
"flow": "process-form",
"inputs": {
"data": "/form/values"
}
},
"onRefresh": {
"flow": "fetch-data",
"outputs": {
"result": "/widget/data"
}
}
}
}

Widgets inherit app theming but can be customized:

{
"styling": {
"variants": {
"default": {
"background": "var(--card-bg)",
"borderRadius": "var(--radius-md)"
},
"highlighted": {
"background": "var(--accent-bg)",
"border": "2px solid var(--accent)"
}
}
}
}