{
  "components": {
    "Text": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "text": {
          "type": "object",
          "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). 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.",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "usageHint": {
          "type": "string",
          "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.",
          "enum": [
            "h1",
            "h2",
            "h3",
            "h4",
            "h5",
            "caption",
            "body"
          ]
        }
      },
      "required": ["text"]
    },
    "Image": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "url": {
          "type": "object",
          "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "fit": {
          "type": "string",
          "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
          "enum": [
            "contain",
            "cover",
            "fill",
            "none",
            "scale-down"
          ]
        },
        "usageHint": {
          "type": "string",
          "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.",
          "enum": [
            "icon",
            "avatar",
            "smallFeature",
            "mediumFeature",
            "largeFeature",
            "header"
          ]
        }
      },
      "required": ["url"]
    },
    "Icon": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "object",
          "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string",
              "enum": [
                "accountCircle",
                "add",
                "arrowBack",
                "arrowForward",
                "attachFile",
                "calendarToday",
                "call",
                "camera",
                "check",
                "close",
                "delete",
                "download",
                "edit",
                "event",
                "error",
                "favorite",
                "favoriteOff",
                "folder",
                "help",
                "home",
                "info",
                "locationOn",
                "lock",
                "lockOpen",
                "mail",
                "menu",
                "moreVert",
                "moreHoriz",
                "notificationsOff",
                "notifications",
                "payment",
                "person",
                "phone",
                "photo",
                "print",
                "refresh",
                "search",
                "send",
                "settings",
                "share",
                "shoppingCart",
                "star",
                "starHalf",
                "starOff",
                "upload",
                "visibility",
                "visibilityOff",
                "warning"
              ]
            },
            "path": {
              "type": "string"
            }
          }
        }
      },
      "required": ["name"]
    },
    "Video": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "url": {
          "type": "object",
          "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        }
      },
      "required": ["url"]
    },
    "AudioPlayer": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "url": {
          "type": "object",
          "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "description": {
          "type": "object",
          "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        }
      },
      "required": ["url"]
    },
    "Row": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "children": {
          "type": "object",
          "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
          "additionalProperties": false,
          "properties": {
            "explicitList": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "template": {
              "type": "object",
              "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
              "additionalProperties": false,
              "properties": {
                "componentId": {
                  "type": "string"
                },
                "dataBinding": {
                  "type": "string"
                }
              },
              "required": ["componentId", "dataBinding"]
            }
          }
        },
        "distribution": {
          "type": "string",
          "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.",
          "enum": [
            "center",
            "end",
            "spaceAround",
            "spaceBetween",
            "spaceEvenly",
            "start"
          ]
        },
        "alignment": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.",
          "enum": ["start", "center", "end", "stretch"]
        }
      },
      "required": ["children"]
    },
    "Column": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "children": {
          "type": "object",
          "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
          "additionalProperties": false,
          "properties": {
            "explicitList": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "template": {
              "type": "object",
              "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
              "additionalProperties": false,
              "properties": {
                "componentId": {
                  "type": "string"
                },
                "dataBinding": {
                  "type": "string"
                }
              },
              "required": ["componentId", "dataBinding"]
            }
          }
        },
        "distribution": {
          "type": "string",
          "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.",
          "enum": [
            "start",
            "center",
            "end",
            "spaceBetween",
            "spaceAround",
            "spaceEvenly"
          ]
        },
        "alignment": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.",
          "enum": ["center", "end", "start", "stretch"]
        }
      },
      "required": ["children"]
    },
    "List": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "children": {
          "type": "object",
          "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
          "additionalProperties": false,
          "properties": {
            "explicitList": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "template": {
              "type": "object",
              "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
              "additionalProperties": false,
              "properties": {
                "componentId": {
                  "type": "string"
                },
                "dataBinding": {
                  "type": "string"
                }
              },
              "required": ["componentId", "dataBinding"]
            }
          }
        },
        "direction": {
          "type": "string",
          "description": "The direction in which the list items are laid out.",
          "enum": ["vertical", "horizontal"]
        },
        "alignment": {
          "type": "string",
          "description": "Defines the alignment of children along the cross axis.",
          "enum": ["start", "center", "end", "stretch"]
        }
      },
      "required": ["children"]
    },
    "Card": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "child": {
          "type": "string",
          "description": "The ID of the component to be rendered inside the card."
        }
      },
      "required": ["child"]
    },
    "Tabs": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "tabItems": {
          "type": "array",
          "description": "An array of objects, where each object defines a tab with a title and a child component.",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "object",
                "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').",
                "additionalProperties": false,
                "properties": {
                  "literalString": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string"
                  }
                }
              },
              "child": {
                "type": "string"
              }
            },
            "required": ["title", "child"]
          }
        }
      },
      "required": ["tabItems"]
    },
    "Divider": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "axis": {
          "type": "string",
          "description": "The orientation of the divider.",
          "enum": ["horizontal", "vertical"]
        }
      }
    },
    "Modal": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "entryPointChild": {
          "type": "string",
          "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
        },
        "contentChild": {
          "type": "string",
          "description": "The ID of the component to be displayed inside the modal."
        }
      },
      "required": ["entryPointChild", "contentChild"]
    },
    "Button": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "child": {
          "type": "string",
          "description": "The ID of the component to display in the button, typically a Text component."
        },
        "primary": {
          "type": "boolean",
          "description": "Indicates if this button should be styled as the primary action."
        },
        "action": {
          "type": "object",
          "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string"
            },
            "context": {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "key": {
                    "type": "string"
                  },
                  "value": {
                    "type": "object",
                    "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').",
                    "additionalProperties": false,
                    "properties": {
                      "path": {
                        "type": "string"
                      },
                      "literalString": {
                        "type": "string"
                      },
                      "literalNumber": {
                        "type": "number"
                      },
                      "literalBoolean": {
                        "type": "boolean"
                      }
                    }
                  }
                },
                "required": ["key", "value"]
              }
            }
          },
          "required": ["name"]
        }
      },
      "required": ["child", "action"]
    },
    "CheckBox": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "label": {
          "type": "object",
          "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "value": {
          "type": "object",
          "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').",
          "additionalProperties": false,
          "properties": {
            "literalBoolean": {
              "type": "boolean"
            },
            "path": {
              "type": "string"
            }
          }
        }
      },
      "required": ["label", "value"]
    },
    "TextField": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "label": {
          "type": "object",
          "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "text": {
          "type": "object",
          "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "textFieldType": {
          "type": "string",
          "description": "The type of input field to display.",
          "enum": [
            "date",
            "longText",
            "number",
            "shortText",
            "obscured"
          ]
        },
        "validationRegexp": {
          "type": "string",
          "description": "A regular expression used for client-side validation of the input."
        }
      },
      "required": ["label"]
    },
    "DateTimeInput": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "value": {
          "type": "object",
          "description": "The selected date and/or time value. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').",
          "additionalProperties": false,
          "properties": {
            "literalString": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "enableDate": {
          "type": "boolean",
          "description": "If true, allows the user to select a date."
        },
        "enableTime": {
          "type": "boolean",
          "description": "If true, allows the user to select a time."
        },
        "outputFormat": {
          "type": "string",
          "description": "The desired format for the output string after a date or time is selected."
        }
      },
      "required": ["value"]
    },
    "MultipleChoice": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "selections": {
          "type": "object",
          "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').",
          "additionalProperties": false,
          "properties": {
            "literalArray": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "path": {
              "type": "string"
            }
          }
        },
        "options": {
          "type": "array",
          "description": "An array of available options for the user to choose from.",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "object",
                "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').",
                "additionalProperties": false,
                "properties": {
                  "literalString": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string"
                  }
                }
              },
              "value": {
                "type": "string",
                "description": "The value to be associated with this option when selected."
              }
            },
            "required": ["label", "value"]
          }
        },
        "maxAllowedSelections": {
          "type": "integer",
          "description": "The maximum number of options that the user is allowed to select."
        }
      },
      "required": ["selections", "options"]
    },
    "Slider": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "value": {
          "type": "object",
          "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').",
          "additionalProperties": false,
          "properties": {
            "literalNumber": {
              "type": "number"
            },
            "path": {
              "type": "string"
            }
          }
        },
        "minValue": {
          "type": "number",
          "description": "The minimum value of the slider."
        },
        "maxValue": {
          "type": "number",
          "description": "The maximum value of the slider."
        }
      },
      "required": ["value"]
    }
  },
  "styles": {
    "font": {
      "type": "string",
      "description": "The primary font for the UI."
    },
    "primaryColor": {
      "type": "string",
      "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
      "pattern": "^#[0-9a-fA-F]{6}$"
    }
  }
}