{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:flab-ui:a2ui:catalog:v1",
  "protocolVersion": "1.0",
  "title": "Flab UI A2UI Catalog",
  "description": "Renders A2UI surfaces with Flab UI components.",
  "catalogId": "urn:flab-ui:a2ui:catalog:v1",
  "instructions": "Compose layouts from Column and Row; wrap grouped content in a Card. Text renders a typographic primitive; set `variant` to pick the scale step. Do not send colours — visual styling is owned by the Flab theme.",
  "components": {
    "Column": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Column"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        },
        "gap": {
          "type": "string",
          "enum": [
            "none",
            "sm",
            "md",
            "lg"
          ]
        },
        "align": {
          "type": "string",
          "enum": [
            "start",
            "center",
            "end",
            "stretch"
          ]
        }
      },
      "required": [
        "component"
      ]
    },
    "Row": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Row"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        },
        "gap": {
          "type": "string",
          "enum": [
            "none",
            "sm",
            "md",
            "lg"
          ]
        },
        "align": {
          "type": "string",
          "enum": [
            "start",
            "center",
            "end",
            "stretch"
          ]
        },
        "justify": {
          "type": "string",
          "enum": [
            "start",
            "center",
            "end",
            "between"
          ]
        }
      },
      "required": [
        "component"
      ]
    },
    "List": {
      "type": "object",
      "description": "A vertical list; bind `children` to an array via a template to repeat rows.",
      "properties": {
        "component": {
          "const": "List"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        },
        "gap": {
          "type": "string",
          "enum": [
            "none",
            "sm",
            "md",
            "lg"
          ]
        }
      },
      "required": [
        "component"
      ]
    },
    "Text": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Text"
        },
        "text": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "variant": {
          "type": "string",
          "enum": [
            "display",
            "heading",
            "title",
            "title-sm",
            "body",
            "body-sm",
            "caption",
            "micro"
          ]
        },
        "tone": {
          "type": "string",
          "enum": [
            "primary",
            "secondary",
            "tertiary",
            "accent",
            "danger"
          ]
        }
      },
      "required": [
        "component",
        "text"
      ]
    },
    "Button": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Button"
        },
        "child": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        },
        "variant": {
          "type": "string",
          "enum": [
            "primary",
            "accent",
            "secondary",
            "ghost",
            "destructive"
          ]
        },
        "action": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/Action"
        },
        "checks": {
          "type": "array"
        }
      },
      "required": [
        "component"
      ]
    },
    "Card": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Card"
        },
        "child": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        }
      },
      "required": [
        "component"
      ]
    },
    "TextField": {
      "type": "object",
      "description": "A single-line text input, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "TextField"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "label": {
          "type": "string"
        },
        "placeholder": {
          "type": "string"
        },
        "checks": {
          "type": "array"
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Checkbox": {
      "type": "object",
      "description": "A boolean checkbox, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "Checkbox"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicBoolean"
        },
        "label": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Switch": {
      "type": "object",
      "description": "A boolean on/off switch, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "Switch"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicBoolean"
        },
        "label": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Select": {
      "type": "object",
      "description": "A single-choice dropdown, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "Select"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string"
              },
              "value": {}
            },
            "required": [
              "label",
              "value"
            ]
          }
        },
        "label": {
          "type": "string"
        },
        "placeholder": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value",
        "options"
      ]
    },
    "Textarea": {
      "type": "object",
      "description": "A multi-line text input, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "Textarea"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "label": {
          "type": "string"
        },
        "placeholder": {
          "type": "string"
        },
        "autoResize": {
          "type": "boolean"
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Radio": {
      "type": "object",
      "description": "A single-choice radio group, two-way bound to the data model.",
      "properties": {
        "component": {
          "const": "Radio"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string"
              },
              "value": {}
            },
            "required": [
              "label",
              "value"
            ]
          }
        },
        "label": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value",
        "options"
      ]
    },
    "MultiSelect": {
      "type": "object",
      "description": "A multiple-choice dropdown; value is a list of selected values.",
      "properties": {
        "component": {
          "const": "MultiSelect"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicStringList"
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "label",
              "value"
            ]
          }
        },
        "label": {
          "type": "string"
        },
        "placeholder": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value",
        "options"
      ]
    },
    "DateSelect": {
      "type": "object",
      "description": "A single-date picker; value is an ISO 8601 date string.",
      "properties": {
        "component": {
          "const": "DateSelect"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "placeholder": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Separator": {
      "type": "object",
      "description": "A hairline divider.",
      "properties": {
        "component": {
          "const": "Separator"
        },
        "axis": {
          "type": "string",
          "enum": [
            "horizontal",
            "vertical"
          ]
        }
      },
      "required": [
        "component"
      ]
    },
    "Badge": {
      "type": "object",
      "description": "A compact status/label pill.",
      "properties": {
        "component": {
          "const": "Badge"
        },
        "text": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "tone": {
          "type": "string",
          "enum": [
            "neutral",
            "success",
            "warning",
            "danger",
            "info",
            "alt"
          ]
        }
      },
      "required": [
        "component",
        "text"
      ]
    },
    "Avatar": {
      "type": "object",
      "description": "A person marker (photo or coloured initials).",
      "properties": {
        "component": {
          "const": "Avatar"
        },
        "name": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "src": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        }
      },
      "required": [
        "component",
        "name"
      ]
    },
    "Callout": {
      "type": "object",
      "description": "A soft explanatory banner with a tone icon.",
      "properties": {
        "component": {
          "const": "Callout"
        },
        "tone": {
          "type": "string",
          "enum": [
            "info",
            "success",
            "warning",
            "danger",
            "ai"
          ]
        },
        "text": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "child": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        }
      },
      "required": [
        "component"
      ]
    },
    "Stat": {
      "type": "object",
      "description": "A KPI readout: a large value with a label and optional hint.",
      "properties": {
        "component": {
          "const": "Stat"
        },
        "label": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "hint": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        }
      },
      "required": [
        "component",
        "label",
        "value"
      ]
    },
    "DataTable": {
      "type": "object",
      "description": "A data-dense table. `columns` declares [{key,header}]; `rows` binds to an array of row objects in the data model.",
      "properties": {
        "component": {
          "const": "DataTable"
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string"
              },
              "header": {
                "type": "string"
              }
            },
            "required": [
              "key"
            ]
          }
        },
        "rows": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        }
      },
      "required": [
        "component",
        "columns",
        "rows"
      ]
    },
    "Timeline": {
      "type": "object",
      "description": "A vertical event timeline. `items` binds to [{title,body,meta,tone}] in the data model.",
      "properties": {
        "component": {
          "const": "Timeline"
        },
        "items": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        }
      },
      "required": [
        "component",
        "items"
      ]
    },
    "Kanban": {
      "type": "object",
      "description": "A column-per-stage board. `columns` binds to [{title,tone,count,cards:[{title,meta,accent}]}].",
      "properties": {
        "component": {
          "const": "Kanban"
        },
        "columns": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        }
      },
      "required": [
        "component",
        "columns"
      ]
    },
    "Gauge": {
      "type": "object",
      "description": "An arc dial for a single score within [min,max].",
      "properties": {
        "component": {
          "const": "Gauge"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicNumber"
        },
        "min": {
          "type": "number"
        },
        "max": {
          "type": "number"
        },
        "caption": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "label": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "tone": {
          "type": "string",
          "enum": [
            "neutral",
            "success",
            "warning",
            "danger",
            "info",
            "alt"
          ]
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "Meter": {
      "type": "object",
      "description": "A labelled progress meter (0–100).",
      "properties": {
        "component": {
          "const": "Meter"
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicNumber"
        },
        "valueLabel": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "label": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "tone": {
          "type": "string",
          "enum": [
            "neutral",
            "success",
            "warning",
            "danger",
            "info",
            "alt"
          ]
        }
      },
      "required": [
        "component",
        "value"
      ]
    },
    "AgentLegion": {
      "type": "object",
      "description": "A live roster of AI agents: a grid of status cards plus an optional data-flow view, with a shared selection that highlights the picked agent in both. `agents` binds to an array of [{id,name,task,status,model?,activity?,progress?,steps:{done,total}?,elapsed?,tokens?,branch?}]; status is one of running|waiting|done|failed|queued|paused. `flow` (optional) adds a \"Data flow\" tab; bind it to {nodes:[{id,title,column,row,tone?,status?,subtitle?}],edges:[{from,to,label?,tone?}]} — give a node the same id as an agent so selecting it drives the shared selection. Bind `selectedId` to a data path to make cards and flow highlight each other.",
      "properties": {
        "component": {
          "const": "AgentLegion"
        },
        "agents": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "flow": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "selectedId": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "summary": {
          "type": "boolean"
        },
        "columns": {
          "type": "number"
        },
        "ariaLabel": {
          "type": "string"
        },
        "cardsTabLabel": {
          "type": "string"
        },
        "flowTabLabel": {
          "type": "string"
        },
        "defaultView": {
          "type": "string",
          "enum": [
            "cards",
            "flow"
          ]
        }
      },
      "required": [
        "component",
        "agents"
      ]
    },
    "Breadcrumb": {
      "type": "object",
      "description": "A \"where am I\" trail. `items` binds to an array of [{label, href?}]; the last item renders as the current page, the rest as links.",
      "properties": {
        "component": {
          "const": "Breadcrumb"
        },
        "items": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        }
      },
      "required": [
        "component",
        "items"
      ]
    },
    "Tabs": {
      "type": "object",
      "description": "A segmented tab switcher. `tabs` is an array of [{value, label, child}] where `child` is the component id rendered as that tab's panel. Bind `value` to a data path for two-way selection, or set `defaultValue` for an uncontrolled start.",
      "properties": {
        "component": {
          "const": "Tabs"
        },
        "tabs": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "value": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "child": {
                "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
              }
            },
            "required": [
              "value",
              "label"
            ]
          }
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "defaultValue": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "tabs"
      ]
    },
    "FilterChip": {
      "type": "object",
      "description": "A row of toggle filter chips. `options` is [{value, label, count?}]; `value` two-way binds to the selected value(s). Set `multiple` to allow more than one active chip.",
      "properties": {
        "component": {
          "const": "FilterChip"
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "value": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "count": {
                "type": "number"
              }
            },
            "required": [
              "value",
              "label"
            ]
          }
        },
        "value": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicStringList"
        },
        "multiple": {
          "type": "boolean"
        },
        "label": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "options"
      ]
    },
    "Flow": {
      "type": "object",
      "description": "A node/edge canvas for pipelines and dependency graphs. `nodes` binds to [{id,title,column,row,subtitle?,tone?,status?}] and `edges` to [{from,to,label?,tone?,variant?}]. Bind `selectedId` to a data path to make node selection reactive.",
      "properties": {
        "component": {
          "const": "Flow"
        },
        "nodes": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "edges": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "selectedId": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "ariaLabel": {
          "type": "string"
        },
        "height": {
          "type": [
            "number",
            "string"
          ]
        },
        "controls": {
          "type": "boolean"
        },
        "fitOnMount": {
          "type": "boolean"
        }
      },
      "required": [
        "component",
        "nodes",
        "edges"
      ]
    },
    "EmptyState": {
      "type": "object",
      "description": "A \"nothing here yet\" surface. `variant` \"empty\" (first-run) or \"no-results\" (a filter cleared the list). `action` is a component id for the single next step.",
      "properties": {
        "component": {
          "const": "EmptyState"
        },
        "title": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "description": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "variant": {
          "type": "string",
          "enum": [
            "empty",
            "no-results"
          ]
        },
        "action": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        }
      },
      "required": [
        "component",
        "title"
      ]
    },
    "ErrorState": {
      "type": "object",
      "description": "A system-failure surface (a failed fetch, a timeout). Set an `action` event to offer a retry; `retryLabel` names the button.",
      "properties": {
        "component": {
          "const": "ErrorState"
        },
        "title": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "description": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "retryLabel": {
          "type": "string"
        },
        "action": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/Action"
        }
      },
      "required": [
        "component",
        "title"
      ]
    },
    "Skeleton": {
      "type": "object",
      "description": "A loading placeholder box. Size it with `width`/`height` (a number is px).",
      "properties": {
        "component": {
          "const": "Skeleton"
        },
        "width": {
          "type": [
            "number",
            "string"
          ]
        },
        "height": {
          "type": [
            "number",
            "string"
          ]
        },
        "radius": {
          "type": [
            "number",
            "string"
          ]
        }
      },
      "required": [
        "component"
      ]
    },
    "Panel": {
      "type": "object",
      "description": "A neutral, full-height layout region with an optional title header and footer. Put body content in `child` or `children`; `footer` is a component id.",
      "properties": {
        "component": {
          "const": "Panel"
        },
        "title": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "child": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        },
        "footer": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        }
      },
      "required": [
        "component"
      ]
    },
    "DetailPanel": {
      "type": "object",
      "description": "A right-hand context panel for a selected record: a title header (with an optional close `closeAction`) and `rows` of [{label, value}] key/value lines, plus optional `child`/`children` body content.",
      "properties": {
        "component": {
          "const": "DetailPanel"
        },
        "title": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "rows": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "closeAction": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/Action"
        },
        "child": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ComponentId"
        },
        "children": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/ChildList"
        }
      },
      "required": [
        "component"
      ]
    },
    "TaskBoard": {
      "type": "object",
      "description": "A draggable issue board. `columns` binds to [{id,title,tone?,wipLimit?}] and `cards` to [{id,columnId,title,tag?,description?,issueKey?,priority?,progress?,points?,assignee?,meta?,accent?}]. Bind `cards` to a data path to enable drag-to-move: dropping a card rewrites its columnId and order in the model.",
      "properties": {
        "component": {
          "const": "TaskBoard"
        },
        "columns": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "cards": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        }
      },
      "required": [
        "component",
        "columns",
        "cards"
      ]
    },
    "FilterTree": {
      "type": "object",
      "description": "A hierarchical facet for filtering a list. `nodes` binds to a nested [{id,label,count?,children?}] tree; bind `selectedId` to a data path for the single active selection. Set `rootLabel` to show an \"all\" row, and `searchable` (default true) for the filter field.",
      "properties": {
        "component": {
          "const": "FilterTree"
        },
        "nodes": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "selectedId": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicString"
        },
        "rootId": {
          "type": "string"
        },
        "rootLabel": {
          "type": "string"
        },
        "rootCount": {
          "type": "number"
        },
        "searchable": {
          "type": "boolean"
        },
        "searchPlaceholder": {
          "type": "string"
        },
        "label": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "nodes"
      ]
    },
    "Gantt": {
      "type": "object",
      "description": "A period-based schedule. `periods` is an array of column header strings; `rows` binds to [{id,label,start,span,secondary?,progress?,tone?,value?}] where start is the zero-based period index and span the number of periods.",
      "properties": {
        "component": {
          "const": "Gantt"
        },
        "periods": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "rows": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "labelWidth": {
          "type": "string"
        },
        "valueWidth": {
          "type": "string"
        },
        "minWidth": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "periods",
        "rows"
      ]
    },
    "Calendar": {
      "type": "object",
      "description": "A week calendar. `days` binds to [{weekday,date,today?,count?}] and `events` to [{id,title,day,start?,end?,tone?,meta?,allDay?}] where day is the zero-based index into days and start/end are minutes from midnight or \"HH:MM\". Tune the visible grid with startHour/endHour/hourHeight and hour24.",
      "properties": {
        "component": {
          "const": "Calendar"
        },
        "days": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "events": {
          "$ref": "https://a2ui.org/specification/v1_0/common_types.json#/$defs/DynamicValue"
        },
        "startHour": {
          "type": "number"
        },
        "endHour": {
          "type": "number"
        },
        "hourHeight": {
          "type": "number"
        },
        "initialScrollHour": {
          "type": "number"
        },
        "hour24": {
          "type": "boolean"
        },
        "timezone": {
          "type": "string"
        }
      },
      "required": [
        "component",
        "days",
        "events"
      ]
    }
  },
  "functions": {
    "required": {
      "type": "object",
      "description": "Checks that the value is present.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "required"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "email": {
      "type": "object",
      "description": "Checks that the value is a valid email address.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "email"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "regex": {
      "type": "object",
      "description": "Checks that the value matches a regular expression.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "regex"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "length": {
      "type": "object",
      "description": "Checks string length constraints (min/max).",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "length"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "numeric": {
      "type": "object",
      "description": "Checks numeric range constraints (min/max).",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "numeric"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "and": {
      "type": "object",
      "description": "Logical AND over a list of validation results.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "and"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "or": {
      "type": "object",
      "description": "Logical OR over a list of validation results.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "or"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    },
    "not": {
      "type": "object",
      "description": "Logical NOT of a validation result.",
      "returnType": "validationResult",
      "allowedCallers": "rendererOnly",
      "properties": {
        "call": {
          "const": "not"
        },
        "args": {
          "type": "object"
        }
      },
      "required": [
        "call"
      ]
    }
  },
  "$defs": {
    "anyComponent": {
      "oneOf": [
        {
          "$ref": "#/components/Column"
        },
        {
          "$ref": "#/components/Row"
        },
        {
          "$ref": "#/components/List"
        },
        {
          "$ref": "#/components/Text"
        },
        {
          "$ref": "#/components/Button"
        },
        {
          "$ref": "#/components/Card"
        },
        {
          "$ref": "#/components/TextField"
        },
        {
          "$ref": "#/components/Textarea"
        },
        {
          "$ref": "#/components/Checkbox"
        },
        {
          "$ref": "#/components/Switch"
        },
        {
          "$ref": "#/components/Radio"
        },
        {
          "$ref": "#/components/Select"
        },
        {
          "$ref": "#/components/MultiSelect"
        },
        {
          "$ref": "#/components/DateSelect"
        },
        {
          "$ref": "#/components/Separator"
        },
        {
          "$ref": "#/components/Badge"
        },
        {
          "$ref": "#/components/Avatar"
        },
        {
          "$ref": "#/components/Callout"
        },
        {
          "$ref": "#/components/Stat"
        },
        {
          "$ref": "#/components/DataTable"
        },
        {
          "$ref": "#/components/Timeline"
        },
        {
          "$ref": "#/components/Kanban"
        },
        {
          "$ref": "#/components/Gauge"
        },
        {
          "$ref": "#/components/Meter"
        },
        {
          "$ref": "#/components/AgentLegion"
        },
        {
          "$ref": "#/components/Breadcrumb"
        },
        {
          "$ref": "#/components/Tabs"
        },
        {
          "$ref": "#/components/FilterChip"
        },
        {
          "$ref": "#/components/Flow"
        },
        {
          "$ref": "#/components/EmptyState"
        },
        {
          "$ref": "#/components/ErrorState"
        },
        {
          "$ref": "#/components/Skeleton"
        },
        {
          "$ref": "#/components/Panel"
        },
        {
          "$ref": "#/components/DetailPanel"
        },
        {
          "$ref": "#/components/TaskBoard"
        },
        {
          "$ref": "#/components/FilterTree"
        },
        {
          "$ref": "#/components/Gantt"
        },
        {
          "$ref": "#/components/Calendar"
        }
      ],
      "discriminator": {
        "propertyName": "component"
      }
    },
    "anyFunction": {
      "oneOf": [
        {
          "$ref": "#/functions/required"
        },
        {
          "$ref": "#/functions/email"
        },
        {
          "$ref": "#/functions/regex"
        },
        {
          "$ref": "#/functions/length"
        },
        {
          "$ref": "#/functions/numeric"
        },
        {
          "$ref": "#/functions/and"
        },
        {
          "$ref": "#/functions/or"
        },
        {
          "$ref": "#/functions/not"
        }
      ],
      "discriminator": {
        "propertyName": "call"
      }
    }
  }
}
