{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://shinylib.net/a2ui/shiny.controls/v1.json",
  "protocolVersion": "1.0",
  "title": "Shiny Controls Catalog",
  "description": "The A2UI v1.0 basic catalog plus Shiny Controls (DataGrid, Gauge, ChipGroup, DateRangePicker and more), rendered natively by Shiny.Maui.Controls.Agents and Shiny.Blazor.Controls.Agents.",
  "catalogId": "https://shinylib.net/a2ui/shiny.controls/v1.json",
  "instructions": "This catalog contains every component and function of the A2UI v1.0 basic catalog, with the same rules, plus the Shiny components below. Prefer a Shiny component over composing the same thing from basic ones: DataGrid for tabular data, Gauge for a single measurement against a scale, ChipGroup for picking tags or categories, DateRangePicker for a date range, Pill for a status. Bind inputs (ChipGroup, TagEntry, DateRangePicker, RangeSlider, Expander) to the data model with {\u0022@path\u0022: ...} so the user\u0027s choice is written back and sent with the next action.",
  "components": {
    "Text": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Text"
        },
        "text": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The text content to display. While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation."
        },
        "variant": {
          "type": "string",
          "description": "A hint for the base text style.",
          "enum": [
            "caption",
            "body"
          ],
          "default": "body"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "text"
      ]
    },
    "Image": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Image"
        },
        "url": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The URL of the image to display."
        },
        "description": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "Accessibility text for the image."
        },
        "fit": {
          "type": "string",
          "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS \u0027object-fit\u0027 property.",
          "enum": [
            "contain",
            "cover",
            "fill",
            "none",
            "scaleDown"
          ],
          "default": "fill"
        },
        "variant": {
          "type": "string",
          "description": "A hint for the image size and style.",
          "enum": [
            "icon",
            "avatar",
            "smallFeature",
            "mediumFeature",
            "largeFeature",
            "header"
          ],
          "default": "mediumFeature"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "url"
      ]
    },
    "Icon": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Icon"
        },
        "name": {
          "description": "The name of the icon to display.",
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "accountCircle",
                "add",
                "arrowBack",
                "arrowForward",
                "attachFile",
                "calendarToday",
                "call",
                "camera",
                "check",
                "close",
                "delete",
                "download",
                "edit",
                "event",
                "error",
                "fastForward",
                "favorite",
                "favoriteOff",
                "folder",
                "help",
                "home",
                "info",
                "locationOn",
                "lock",
                "lockOpen",
                "mail",
                "menu",
                "moreVert",
                "moreHoriz",
                "notificationsOff",
                "notifications",
                "pause",
                "payment",
                "person",
                "phone",
                "photo",
                "play",
                "print",
                "refresh",
                "rewind",
                "search",
                "send",
                "settings",
                "share",
                "shoppingCart",
                "skipNext",
                "skipPrevious",
                "star",
                "starHalf",
                "starOff",
                "stop",
                "upload",
                "visibility",
                "visibilityOff",
                "volumeDown",
                "volumeMute",
                "volumeOff",
                "volumeUp",
                "warning"
              ]
            },
            {
              "type": "object",
              "properties": {
                "svgPath": {
                  "$ref": "common_types.json#/$defs/DynamicString"
                }
              },
              "required": [
                "svgPath"
              ],
              "additionalProperties": false
            },
            {
              "$ref": "common_types.json#/$defs/DataBinding"
            }
          ]
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "name"
      ]
    },
    "Video": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Video"
        },
        "url": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The URL of the video to display."
        },
        "posterUrl": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The URL of the poster image to display before the video plays."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "url"
      ]
    },
    "AudioPlayer": {
      "type": "object",
      "properties": {
        "component": {
          "const": "AudioPlayer"
        },
        "url": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The URL of the audio to be played."
        },
        "description": {
          "description": "A description of the audio, such as a title or summary.",
          "$ref": "common_types.json#/$defs/DynamicString"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "url"
      ]
    },
    "Row": {
      "type": "object",
      "description": "A layout component that arranges its children horizontally. To create a grid layout, nest Columns within this Row.",
      "properties": {
        "component": {
          "const": "Row"
        },
        "children": {
          "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.",
          "$ref": "common_types.json#/$defs/ChildList"
        },
        "justify": {
          "type": "string",
          "description": "Defines the arrangement of children along the main axis (horizontally). Use \u0027spaceBetween\u0027 to push items to the edges, or \u0027start\u0027/\u0027end\u0027/\u0027center\u0027 to pack them together.",
          "enum": [
            "center",
            "end",
            "spaceAround",
            "spaceBetween",
            "spaceEvenly",
            "start",
            "stretch"
          ],
          "default": "start"
        },
        "align": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis (vertically). This is similar to the CSS \u0027align-items\u0027 property, but uses camelCase values (e.g., \u0027start\u0027).",
          "enum": [
            "start",
            "center",
            "end",
            "stretch"
          ],
          "default": "stretch"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "children"
      ]
    },
    "Column": {
      "type": "object",
      "description": "A layout component that arranges its children vertically. To create a grid layout, nest Rows within this Column.",
      "properties": {
        "component": {
          "const": "Column"
        },
        "children": {
          "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.",
          "$ref": "common_types.json#/$defs/ChildList"
        },
        "justify": {
          "type": "string",
          "description": "Defines the arrangement of children along the main axis (vertically). Use \u0027spaceBetween\u0027 to push items to the edges (e.g. header at top, footer at bottom), or \u0027start\u0027/\u0027end\u0027/\u0027center\u0027 to pack them together.",
          "enum": [
            "start",
            "center",
            "end",
            "spaceBetween",
            "spaceAround",
            "spaceEvenly",
            "stretch"
          ],
          "default": "start"
        },
        "align": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis (horizontally). This is similar to the CSS \u0027align-items\u0027 property.",
          "enum": [
            "center",
            "end",
            "start",
            "stretch"
          ],
          "default": "stretch"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "children"
      ]
    },
    "List": {
      "type": "object",
      "properties": {
        "component": {
          "const": "List"
        },
        "children": {
          "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list.",
          "$ref": "common_types.json#/$defs/ChildList"
        },
        "direction": {
          "type": "string",
          "description": "The direction in which the list items are laid out.",
          "enum": [
            "vertical",
            "horizontal"
          ],
          "default": "vertical"
        },
        "align": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis.",
          "enum": [
            "start",
            "center",
            "end",
            "stretch"
          ],
          "default": "stretch"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "children"
      ]
    },
    "Card": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Card"
        },
        "child": {
          "$ref": "common_types.json#/$defs/Child",
          "description": "The ID of the single child component to be rendered inside the card. To display multiple elements, you MUST wrap them in a layout component (like Column or Row) and pass that container\u0027s ID here. Do NOT pass multiple IDs or a non-existent ID."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "child"
      ]
    },
    "Tabs": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Tabs"
        },
        "tabs": {
          "type": "array",
          "description": "An array of objects, where each object defines a tab with a title and a child component.",
          "minItems": 1,
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "description": "The tab title.",
                "$ref": "common_types.json#/$defs/DynamicString"
              },
              "child": {
                "$ref": "common_types.json#/$defs/Child",
                "description": "The ID of the child component."
              }
            },
            "required": [
              "title",
              "child"
            ],
            "additionalProperties": false
          }
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "tabs"
      ]
    },
    "Modal": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Modal"
        },
        "trigger": {
          "$ref": "common_types.json#/$defs/Child",
          "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
        },
        "content": {
          "$ref": "common_types.json#/$defs/Child",
          "description": "The ID of the component to be displayed inside the modal."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "trigger",
        "content"
      ]
    },
    "Divider": {
      "type": "object",
      "properties": {
        "component": {
          "const": "Divider"
        },
        "axis": {
          "type": "string",
          "description": "The orientation of the divider.",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "default": "horizontal"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component"
      ]
    },
    "Button": {
      "type": "object",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "Button"
            },
            "child": {
              "$ref": "common_types.json#/$defs/Child",
              "description": "The ID of the child component. Use a \u0027Text\u0027 component for a labeled button. Only use an \u0027Icon\u0027 if the requirements explicitly ask for an icon-only button."
            },
            "variant": {
              "type": "string",
              "description": "A hint for the button style. If omitted, a default button style is used. \u0027primary\u0027 indicates this is the main call-to-action button. \u0027borderless\u0027 means the button has no visual border or background, making its child content appear like a clickable link.",
              "enum": [
                "default",
                "primary",
                "borderless"
              ],
              "default": "default"
            },
            "action": {
              "$ref": "common_types.json#/$defs/Action"
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "child",
            "action"
          ]
        }
      ]
    },
    "TextField": {
      "type": "object",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "TextField"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The text label for the input field."
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The value of the text field."
            },
            "placeholder": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The placeholder text for the input field."
            },
            "variant": {
              "type": "string",
              "description": "The type of input field to display.",
              "enum": [
                "longText",
                "number",
                "shortText",
                "obscured"
              ],
              "default": "shortText"
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "label",
            "value"
          ]
        }
      ]
    },
    "CheckBox": {
      "type": "object",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "CheckBox"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The text to display next to the checkbox."
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicBoolean",
              "description": "The current state of the checkbox (true for checked, false for unchecked)."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "label",
            "value"
          ]
        }
      ]
    },
    "ChoicePicker": {
      "type": "object",
      "description": "A component that allows selecting one or more options from a list.",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "ChoicePicker"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The label for the group of options."
            },
            "variant": {
              "type": "string",
              "description": "A hint for how the choice picker should be displayed and behave.",
              "enum": [
                "multipleSelection",
                "mutuallyExclusive"
              ],
              "default": "mutuallyExclusive"
            },
            "options": {
              "type": "array",
              "description": "The list of available options to choose from.",
              "items": {
                "type": "object",
                "properties": {
                  "label": {
                    "description": "The text to display for this option.",
                    "$ref": "common_types.json#/$defs/DynamicString"
                  },
                  "value": {
                    "type": "string",
                    "description": "The stable value associated with this option."
                  }
                },
                "required": [
                  "label",
                  "value"
                ],
                "additionalProperties": false
              }
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicStringList",
              "description": "The list of currently selected values. This should be bound to a string array in the data model."
            },
            "displayStyle": {
              "type": "string",
              "description": "The display style of the component.",
              "enum": [
                "checkbox",
                "chips"
              ],
              "default": "checkbox"
            },
            "filterable": {
              "type": "boolean",
              "description": "If true, displays a search input to filter the options.",
              "default": false
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "options",
            "value"
          ]
        }
      ]
    },
    "Slider": {
      "type": "object",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "Slider"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The label for the slider."
            },
            "min": {
              "type": "number",
              "description": "The minimum value of the slider.",
              "default": 0
            },
            "max": {
              "type": "number",
              "description": "The maximum value of the slider."
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The current value of the slider."
            },
            "steps": {
              "type": "integer",
              "minimum": 1,
              "description": "The number of discrete divisions in the slider range. If specified, the slider will snap to discrete values."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "value",
            "max"
          ]
        }
      ]
    },
    "DateTimeInput": {
      "type": "object",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "DateTimeInput"
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string."
            },
            "enableDate": {
              "type": "boolean",
              "description": "If true, allows the user to select a date.",
              "default": false
            },
            "enableTime": {
              "type": "boolean",
              "description": "If true, allows the user to select a time.",
              "default": false
            },
            "min": {
              "allOf": [
                {
                  "$ref": "common_types.json#/$defs/DynamicString"
                },
                {
                  "if": {
                    "type": "string"
                  },
                  "then": {
                    "oneOf": [
                      {
                        "format": "date"
                      },
                      {
                        "format": "time"
                      },
                      {
                        "format": "date-time"
                      }
                    ]
                  }
                }
              ],
              "description": "The minimum allowed date/time in ISO 8601 format."
            },
            "max": {
              "allOf": [
                {
                  "$ref": "common_types.json#/$defs/DynamicString"
                },
                {
                  "if": {
                    "type": "string"
                  },
                  "then": {
                    "oneOf": [
                      {
                        "format": "date"
                      },
                      {
                        "format": "time"
                      },
                      {
                        "format": "date-time"
                      }
                    ]
                  }
                }
              ],
              "description": "The maximum allowed date/time in ISO 8601 format."
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The text label for the input field."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "value"
          ]
        }
      ]
    },
    "DataGrid": {
      "type": "object",
      "description": "A sortable table of rows. Bind \u0027rows\u0027 to an array of objects in the data model; each column shows one member of every row. Inside a chat message it scrolls sideways only, never vertically.",
      "properties": {
        "component": {
          "const": "DataGrid"
        },
        "title": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "An optional caption above the grid."
        },
        "columns": {
          "type": "array",
          "description": "The columns, in order.",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "description": "The member of each row object this column shows."
              },
              "header": {
                "$ref": "common_types.json#/$defs/DynamicString",
                "description": "The column header."
              },
              "format": {
                "type": "string",
                "enum": [
                  "text",
                  "number",
                  "currency",
                  "percent",
                  "date"
                ],
                "default": "text",
                "description": "How cell values are formatted, in the user\u0027s locale. \u0027percent\u0027 expects a fraction (0.25 is 25%); \u0027date\u0027 expects an ISO 8601 string."
              },
              "currency": {
                "type": "string",
                "description": "ISO 4217 code for \u0027currency\u0027 columns.",
                "default": "USD"
              },
              "align": {
                "type": "string",
                "enum": [
                  "start",
                  "center",
                  "end"
                ],
                "description": "Cell alignment. Number, currency and percent columns default to \u0027end\u0027."
              }
            },
            "required": [
              "key",
              "header"
            ],
            "additionalProperties": false
          }
        },
        "rows": {
          "$ref": "common_types.json#/$defs/DynamicValue",
          "description": "The rows: an array of objects, usually a binding such as {\u0022@path\u0022: \u0022/orders\u0022}."
        },
        "sortable": {
          "type": "boolean",
          "default": true,
          "description": "Whether tapping a header sorts by that column."
        },
        "rowAction": {
          "$ref": "common_types.json#/$defs/Action",
          "description": "Dispatched when a row is tapped. Relative paths in its context resolve against the tapped row."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "columns",
        "rows"
      ]
    },
    "Gauge": {
      "type": "object",
      "description": "A dial gauge showing one number on a scale.",
      "properties": {
        "component": {
          "const": "Gauge"
        },
        "value": {
          "$ref": "common_types.json#/$defs/DynamicNumber",
          "description": "The value the needle points at."
        },
        "min": {
          "type": "number",
          "default": 0,
          "description": "The start of the scale."
        },
        "max": {
          "type": "number",
          "description": "The end of the scale."
        },
        "label": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "A caption under the value."
        },
        "units": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "Units shown after the value (e.g. \u0027km/h\u0027, \u0027%\u0027)."
        },
        "ranges": {
          "type": "array",
          "description": "Coloured bands on the scale.",
          "items": {
            "type": "object",
            "properties": {
              "from": {
                "type": "number"
              },
              "to": {
                "type": "number"
              },
              "tone": {
                "type": "string",
                "enum": [
                  "good",
                  "warning",
                  "danger",
                  "neutral"
                ],
                "default": "neutral"
              }
            },
            "required": [
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "value",
        "max"
      ]
    },
    "ProgressBar": {
      "type": "object",
      "description": "A horizontal progress bar.",
      "properties": {
        "component": {
          "const": "ProgressBar"
        },
        "value": {
          "$ref": "common_types.json#/$defs/DynamicNumber",
          "description": "Progress between min and max. Omit it for an indeterminate bar."
        },
        "min": {
          "type": "number",
          "default": 0
        },
        "max": {
          "type": "number",
          "default": 1
        },
        "label": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "Text shown with the bar."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component"
      ]
    },
    "Pill": {
      "type": "object",
      "description": "A small status badge.",
      "properties": {
        "component": {
          "const": "Pill"
        },
        "text": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The badge text."
        },
        "tone": {
          "type": "string",
          "enum": [
            "neutral",
            "success",
            "info",
            "warning",
            "caution",
            "critical"
          ],
          "default": "neutral",
          "description": "The badge colour."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "text"
      ]
    },
    "Avatar": {
      "type": "object",
      "description": "A person\u0027s picture, or their initials when there is no picture.",
      "properties": {
        "component": {
          "const": "Avatar"
        },
        "name": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The person\u0027s name; the initials come from it."
        },
        "imageUrl": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "An optional picture (https only)."
        },
        "size": {
          "type": "string",
          "enum": [
            "small",
            "medium",
            "large"
          ],
          "default": "medium"
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "name"
      ]
    },
    "ChipGroup": {
      "type": "object",
      "description": "A set of selectable chips.",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "ChipGroup"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "An optional caption."
            },
            "options": {
              "type": "array",
              "description": "The options to choose from.",
              "items": {
                "type": "object",
                "properties": {
                  "label": {
                    "$ref": "common_types.json#/$defs/DynamicString",
                    "description": "The text shown for this option."
                  },
                  "value": {
                    "type": "string",
                    "description": "The stable value stored when this option is selected."
                  }
                },
                "required": [
                  "label",
                  "value"
                ],
                "additionalProperties": false
              }
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicStringList",
              "description": "The selected values. Bind it to a string array in the data model."
            },
            "variant": {
              "type": "string",
              "enum": [
                "single",
                "multiple"
              ],
              "default": "multiple",
              "description": "Whether one or several chips can be selected."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "options",
            "value"
          ]
        }
      ]
    },
    "TagEntry": {
      "type": "object",
      "description": "Free-text tags typed by the user and shown as removable chips.",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "TagEntry"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "An optional caption."
            },
            "value": {
              "$ref": "common_types.json#/$defs/DynamicStringList",
              "description": "The tags. Bind it to a string array in the data model."
            },
            "placeholder": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "Hint text in the empty entry."
            },
            "maxTags": {
              "type": "integer",
              "minimum": 1,
              "description": "The most tags the user may add."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "value"
          ]
        }
      ]
    },
    "DateRangePicker": {
      "type": "object",
      "description": "Picks a start and end date on a calendar.",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "DateRangePicker"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "An optional caption."
            },
            "start": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The range start as an ISO 8601 date (YYYY-MM-DD). Bind it so the choice is written back."
            },
            "end": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The range end as an ISO 8601 date (YYYY-MM-DD). Bind it so the choice is written back."
            },
            "min": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The earliest selectable date (YYYY-MM-DD)."
            },
            "max": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The latest selectable date (YYYY-MM-DD)."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "start",
            "end"
          ]
        }
      ]
    },
    "RangeSlider": {
      "type": "object",
      "description": "A slider with two thumbs picking a lower and an upper value.",
      "allOf": [
        {
          "$ref": "common_types.json#/$defs/Checkable"
        },
        {
          "type": "object",
          "properties": {
            "component": {
              "const": "RangeSlider"
            },
            "label": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "An optional caption."
            },
            "min": {
              "type": "number",
              "default": 0
            },
            "max": {
              "type": "number"
            },
            "lower": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The lower value. Bind it so the choice is written back."
            },
            "upper": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The upper value. Bind it so the choice is written back."
            },
            "step": {
              "type": "number",
              "exclusiveMinimum": 0,
              "description": "Snap the values to multiples of this."
            },
            "weight": {
              "$ref": "#/$defs/Weight"
            }
          },
          "required": [
            "component",
            "max",
            "lower",
            "upper"
          ]
        }
      ]
    },
    "Timeline": {
      "type": "object",
      "description": "A vertical list of events in time order.",
      "properties": {
        "component": {
          "const": "Timeline"
        },
        "items": {
          "$ref": "common_types.json#/$defs/DynamicValue",
          "description": "An array of objects, each with \u0027title\u0027 and optionally \u0027description\u0027, \u0027time\u0027 and \u0027tone\u0027 (neutral, success, info, warning, critical)."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "items"
      ]
    },
    "Expander": {
      "type": "object",
      "description": "A header that shows or hides its child when tapped.",
      "properties": {
        "component": {
          "const": "Expander"
        },
        "header": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The always-visible header text."
        },
        "child": {
          "$ref": "common_types.json#/$defs/Child",
          "description": "The component shown when expanded."
        },
        "expanded": {
          "$ref": "common_types.json#/$defs/DynamicBoolean",
          "description": "Whether it is expanded. A binding is written back when the user toggles it."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "header",
        "child"
      ]
    },
    "Markdown": {
      "type": "object",
      "description": "Formatted text written in Markdown (headings, lists, emphasis, links, code, tables). Never HTML.",
      "properties": {
        "component": {
          "const": "Markdown"
        },
        "text": {
          "$ref": "common_types.json#/$defs/DynamicString",
          "description": "The Markdown source."
        },
        "weight": {
          "$ref": "#/$defs/Weight"
        }
      },
      "required": [
        "component",
        "text"
      ]
    }
  },
  "functions": {
    "required": {
      "type": "object",
      "description": "Checks that the value is not null, undefined, or empty.",
      "returnType": "validationResult",
      "properties": {
        "@call": {
          "const": "required"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "description": "The value to check."
            }
          },
          "required": [
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "regex": {
      "type": "object",
      "description": "Checks that the value matches a regular expression string.",
      "returnType": "validationResult",
      "properties": {
        "@call": {
          "const": "regex"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString"
            },
            "pattern": {
              "type": "string",
              "description": "The regular expression to search for in the value. Uses the A2UI regex dialect: a portable subset of ECMAScript pattern syntax in Unicode mode with no flags. Matching is case-sensitive, \u0027.\u0027 excludes line terminators, and \u0027^\u0027 and \u0027$\u0027 match only at the ends of the value. Backreferences, lookbehind, named groups and \u0027\\p{...}\u0027 are not allowed. Patterns longer than 256 code points or that could backtrack catastrophically are rejected."
            }
          },
          "required": [
            "value",
            "pattern"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "length": {
      "type": "object",
      "description": "Checks string length constraints.",
      "returnType": "validationResult",
      "properties": {
        "@call": {
          "const": "length"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString"
            },
            "min": {
              "type": "integer",
              "minimum": 0,
              "description": "The minimum allowed length."
            },
            "max": {
              "type": "integer",
              "minimum": 0,
              "description": "The maximum allowed length."
            }
          },
          "required": [
            "value"
          ],
          "anyOf": [
            {
              "required": [
                "min"
              ]
            },
            {
              "required": [
                "max"
              ]
            }
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "numeric": {
      "type": "object",
      "description": "Checks numeric range constraints.",
      "returnType": "validationResult",
      "properties": {
        "@call": {
          "const": "numeric"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicNumber"
            },
            "min": {
              "type": "number",
              "description": "The minimum allowed value."
            },
            "max": {
              "type": "number",
              "description": "The maximum allowed value."
            }
          },
          "required": [
            "value"
          ],
          "anyOf": [
            {
              "required": [
                "min"
              ]
            },
            {
              "required": [
                "max"
              ]
            }
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "email": {
      "type": "object",
      "description": "Checks that the value is a valid email address.",
      "returnType": "validationResult",
      "properties": {
        "@call": {
          "const": "email"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString"
            }
          },
          "required": [
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "formatString": {
      "type": "object",
      "description": "Performs string interpolation of data model values and other functions in the catalog functions list and returns the resulting string. The value string can contain interpolated expressions in the \u0060${expression}\u0060 format. Supported expression types include: JSON Pointer paths to the data model (e.g., \u0060${/absolute/path}\u0060 or \u0060${relative/path}\u0060), and renderer-side function calls (e.g., \u0060${now()}\u0060). Function arguments must be named (e.g., \u0060${formatDate(value:${/currentDate}, format:\u0027MM-dd\u0027)}\u0060). To include a literal \u0060${\u0060 sequence, escape it as \u0060\\${\u0060.",
      "returnType": "string",
      "properties": {
        "@call": {
          "const": "formatString"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicString"
            }
          },
          "required": [
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "formatNumber": {
      "type": "object",
      "description": "Formats a number with the specified grouping and decimal precision.",
      "returnType": "string",
      "properties": {
        "@call": {
          "const": "formatNumber"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The number to format."
            },
            "decimals": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale."
            },
            "grouping": {
              "$ref": "common_types.json#/$defs/DynamicBoolean",
              "description": "Optional. If true, uses locale-specific grouping separators (e.g. \u00271,000\u0027). If false, returns raw digits (e.g. \u00271000\u0027). Defaults to true."
            }
          },
          "required": [
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "formatCurrency": {
      "type": "object",
      "description": "Formats a number as a currency string.",
      "returnType": "string",
      "properties": {
        "@call": {
          "const": "formatCurrency"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The monetary amount."
            },
            "currency": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The ISO 4217 currency code (e.g., \u0027USD\u0027, \u0027EUR\u0027)."
            },
            "decimals": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale."
            },
            "grouping": {
              "$ref": "common_types.json#/$defs/DynamicBoolean",
              "description": "Optional. If true, uses locale-specific grouping separators (e.g. \u00271,000\u0027). If false, returns raw digits (e.g. \u00271000\u0027). Defaults to true."
            }
          },
          "required": [
            "currency",
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "formatDate": {
      "type": "object",
      "description": "Formats a timestamp into a string using a pattern.",
      "returnType": "string",
      "properties": {
        "@call": {
          "const": "formatDate"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicValue",
              "description": "The date to format."
            },
            "format": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "A Unicode TR35 date pattern string.\n\nToken Reference:\n- Year: \u0027yy\u0027 (26), \u0027yyyy\u0027 (2026)\n- Month: \u0027M\u0027 (1), \u0027MM\u0027 (01), \u0027MMM\u0027 (Jan), \u0027MMMM\u0027 (January)\n- Day: \u0027d\u0027 (1), \u0027dd\u0027 (01), \u0027E\u0027 (Tue), \u0027EEEE\u0027 (Tuesday)\n- Hour (12h): \u0027h\u0027 (1-12), \u0027hh\u0027 (01-12) - requires \u0027a\u0027 for AM/PM\n- Hour (24h): \u0027H\u0027 (0-23), \u0027HH\u0027 (00-23) - Military Time\n- Minute: \u0027mm\u0027 (00-59)\n- Second: \u0027ss\u0027 (00-59)\n- Period: \u0027a\u0027 (AM/PM)\n\nExamples:\n- \u0027MMM dd, yyyy\u0027 -\u003E \u0027Jan 16, 2026\u0027\n- \u0027HH:mm\u0027 -\u003E \u002714:30\u0027 (Military)\n- \u0027h:mm a\u0027 -\u003E \u00272:30 PM\u0027\n- \u0027EEEE, d MMMM\u0027 -\u003E \u0027Friday, 16 January\u0027"
            }
          },
          "required": [
            "format",
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "pluralize": {
      "type": "object",
      "description": "Returns a localized string based on the Common Locale Data Repository (CLDR) plural category of the count (zero, one, two, few, many, other). Requires an \u0027other\u0027 fallback. For English, just use \u0027one\u0027 and \u0027other\u0027.",
      "returnType": "string",
      "properties": {
        "@call": {
          "const": "pluralize"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicNumber",
              "description": "The numeric value used to determine the plural category."
            },
            "zero": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "String for the \u0027zero\u0027 category (e.g., 0 items)."
            },
            "one": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "String for the \u0027one\u0027 category (e.g., 1 item)."
            },
            "two": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "String for the \u0027two\u0027 category (used in Arabic, Welsh, etc.)."
            },
            "few": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "String for the \u0027few\u0027 category (e.g., small groups in Slavic languages)."
            },
            "many": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "String for the \u0027many\u0027 category (e.g., large groups in various languages)."
            },
            "other": {
              "$ref": "common_types.json#/$defs/DynamicString",
              "description": "The default/fallback string (used for general plural cases)."
            }
          },
          "required": [
            "value",
            "other"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "openUrl": {
      "type": "object",
      "description": "Opens the specified URL in a browser or handler (requires user activation). This function has no return value.",
      "returnType": "void",
      "requiresUserActivation": true,
      "properties": {
        "@call": {
          "const": "openUrl"
        },
        "args": {
          "type": "object",
          "properties": {
            "url": {
              "description": "The URL to open.",
              "oneOf": [
                {
                  "type": "string",
                  "format": "uri"
                },
                {
                  "$ref": "common_types.json#/$defs/DataBinding"
                },
                {
                  "$ref": "common_types.json#/$defs/FunctionCall"
                }
              ]
            }
          },
          "required": [
            "url"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "and": {
      "type": "object",
      "description": "Performs a logical AND operation on a list of boolean values.",
      "returnType": "boolean",
      "properties": {
        "@call": {
          "const": "and"
        },
        "args": {
          "type": "object",
          "properties": {
            "values": {
              "type": "array",
              "description": "The list of boolean values to evaluate.",
              "items": {
                "$ref": "common_types.json#/$defs/DynamicBoolean"
              },
              "minItems": 2
            }
          },
          "required": [
            "values"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "or": {
      "type": "object",
      "description": "Performs a logical OR operation on a list of boolean values.",
      "returnType": "boolean",
      "properties": {
        "@call": {
          "const": "or"
        },
        "args": {
          "type": "object",
          "properties": {
            "values": {
              "type": "array",
              "description": "The list of boolean values to evaluate.",
              "items": {
                "$ref": "common_types.json#/$defs/DynamicBoolean"
              },
              "minItems": 2
            }
          },
          "required": [
            "values"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    },
    "not": {
      "type": "object",
      "description": "Performs a logical NOT operation on a boolean value.",
      "returnType": "boolean",
      "properties": {
        "@call": {
          "const": "not"
        },
        "args": {
          "type": "object",
          "properties": {
            "value": {
              "$ref": "common_types.json#/$defs/DynamicBoolean",
              "description": "The boolean value to negate."
            }
          },
          "required": [
            "value"
          ],
          "unevaluatedProperties": false
        }
      },
      "required": [
        "@call",
        "args"
      ]
    }
  },
  "$defs": {
    "anyComponent": {
      "oneOf": [
        {
          "$ref": "#/components/Text"
        },
        {
          "$ref": "#/components/Image"
        },
        {
          "$ref": "#/components/Icon"
        },
        {
          "$ref": "#/components/Video"
        },
        {
          "$ref": "#/components/AudioPlayer"
        },
        {
          "$ref": "#/components/Row"
        },
        {
          "$ref": "#/components/Column"
        },
        {
          "$ref": "#/components/List"
        },
        {
          "$ref": "#/components/Card"
        },
        {
          "$ref": "#/components/Tabs"
        },
        {
          "$ref": "#/components/Modal"
        },
        {
          "$ref": "#/components/Divider"
        },
        {
          "$ref": "#/components/Button"
        },
        {
          "$ref": "#/components/TextField"
        },
        {
          "$ref": "#/components/CheckBox"
        },
        {
          "$ref": "#/components/ChoicePicker"
        },
        {
          "$ref": "#/components/Slider"
        },
        {
          "$ref": "#/components/DateTimeInput"
        },
        {
          "$ref": "#/components/DataGrid"
        },
        {
          "$ref": "#/components/Gauge"
        },
        {
          "$ref": "#/components/ProgressBar"
        },
        {
          "$ref": "#/components/Pill"
        },
        {
          "$ref": "#/components/Avatar"
        },
        {
          "$ref": "#/components/ChipGroup"
        },
        {
          "$ref": "#/components/TagEntry"
        },
        {
          "$ref": "#/components/DateRangePicker"
        },
        {
          "$ref": "#/components/RangeSlider"
        },
        {
          "$ref": "#/components/Timeline"
        },
        {
          "$ref": "#/components/Expander"
        },
        {
          "$ref": "#/components/Markdown"
        }
      ],
      "discriminator": {
        "propertyName": "component"
      }
    },
    "anyFunction": {
      "oneOf": [
        {
          "$ref": "#/functions/required"
        },
        {
          "$ref": "#/functions/regex"
        },
        {
          "$ref": "#/functions/length"
        },
        {
          "$ref": "#/functions/numeric"
        },
        {
          "$ref": "#/functions/email"
        },
        {
          "$ref": "#/functions/formatString"
        },
        {
          "$ref": "#/functions/formatNumber"
        },
        {
          "$ref": "#/functions/formatCurrency"
        },
        {
          "$ref": "#/functions/formatDate"
        },
        {
          "$ref": "#/functions/pluralize"
        },
        {
          "$ref": "#/functions/openUrl"
        },
        {
          "$ref": "#/functions/and"
        },
        {
          "$ref": "#/functions/or"
        },
        {
          "$ref": "#/functions/not"
        }
      ]
    },
    "Weight": {
      "type": "number",
      "description": "The relative weight of this component within a Row or Column. This is similar to the CSS \u0027flex-grow\u0027 property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column."
    }
  }
}