Timeline

An event feed. Events are data, not components — the same philosophy as DataTable rows.

rendered, live
the wire — click a line to scrub
the contract — Timeline in catalog.json
{
  "type": "object",
  "description": "An event feed. Events are data, not components — the same philosophy as DataTable rows.",
  "properties": {
    "component": {
      "const": "Timeline"
    },
    "label": {
      "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString",
      "description": "Optional heading for the feed, e.g. 'Incident timeline'."
    },
    "items": {
      "oneOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "What happened, one line."
              },
              "time": {
                "type": "string",
                "description": "When, as ISO 8601. The renderer formats it (absolute or relative) in the user's locale."
              },
              "text": {
                "type": "string",
                "description": "Optional detail line. Inline markdown allowed."
              },
              "intent": {
                "type": "string",
                "enum": [
                  "good",
                  "bad",
                  "warning",
                  "info",
                  "neutral"
                ],
                "description": "Judgment of this event on the shared scale. Default: 'neutral'."
              }
            },
            "required": [
              "title"
            ],
            "additionalProperties": false
          }
        },
        {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DataBinding"
        }
      ],
      "description": "The events, oldest first. Bind with {\"path\": ...} and append by rewriting the array — the feed grows without re-sending the component."
    },
    "emptyText": {
      "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString",
      "description": "Shown while the bound items array is empty. Quiet and factual."
    }
  },
  "required": [
    "component",
    "items"
  ]
}
the prompt-pack — paste into your agent
### Timeline — an event feed

Events are data, not components — the same philosophy as DataTable rows. Append events by
rewriting the bound array; the feed grows without re-sending the component.

| prop        | type                | required | notes                                  |
| ----------- | ------------------- | -------- | -------------------------------------- |
| `items`     | array \| `{"path"}` | yes      | events, oldest first; item shape below |
| `label`     | string              | no       | heading, e.g. `"Incident timeline"`    |
| `emptyText` | string              | no       | shown while the feed is empty          |

Item shape — `title` required; `time` is ISO 8601 (the renderer shows it humanized); `intent`
judges the single event:

```
{"title":"Canary healthy","time":"2026-08-17T14:21:40Z","intent":"good","text":"All probes passing on pod 1."}
```

```
{"id":"feed","component":"Timeline","label":"Rollout so far","items":{"path":"/events"},"emptyText":"Nothing yet."}
```