{
  "$id": "https://json.schemastore.org/noodl.schema.json",
  "$ref": "#/definitions/RootConfig",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "Action": {
      "additionalProperties": {},
      "properties": {
        "actionType": {
          "$ref": "#/definitions/ActionType"
        },
        "contentType": {
          "$ref": "#/definitions/ContentType"
        },
        "dataKey": {
          "$ref": "#/definitions/DataKeyString"
        },
        "dataObject": {
          "$ref": "#/definitions/DataObject"
        },
        "dismissOnTouchOutside": {
          "description": "Signals that a popup should close when a user clicks outside of it. This is used for closing modals/popups",
          "type": "boolean"
        },
        "emit": {
          "$ref": "#/definitions/Emit"
        },
        "funcName": {
          "description": "A name/identifier for a function. This is used mainly for builtIn actions, where applications implement their own behavior and binds it to some object in the noodl",
          "examples": [
            "redraw",
            "goto",
            "saveSignature"
          ],
          "title": "Function name",
          "type": "string"
        },
        "goto": {
          "$ref": "#/definitions/Goto"
        },
        "object": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "object"
            },
            {
              "type": "array"
            }
          ],
          "title": "Eval object's object"
        },
        "popUpView": {
          "description": "A binding between a popUp or popUpDismiss component to a popUp action.",
          "title": "A popUp component's identifier by popup behavior",
          "type": "string"
        },
        "reload": {
          "description": "When set to true, this signals that a page should run its \"init\" operation upon visiting from the user. If it is false, a page will not run it, which can be used to  persist values when navigating pages",
          "title": "Skip or run \"init\"",
          "type": "boolean"
        },
        "timer": {
          "description": "A timer is useful for situations such as chat rooms where users will have a time limit before being getting out",
          "title": "Timer",
          "type": "string"
        },
        "timerTag": {
          "title": "Timer tag",
          "type": "string"
        },
        "viewTag": {
          "$ref": "#/definitions/ViewTag"
        },
        "wait": {
          "description": "Used to prevent further actions from happening. For example, a popUp action with \"wait: true\" will open a pop up in the page and will not run actions that are next in the call stack. This can be used to restrict access to pages when authenticating",
          "examples": [
            true,
            "5000"
          ],
          "oneOf": [
            {
              "type": "boolean"
            },
            {
              "type": "number"
            }
          ],
          "title": "Wait"
        }
      },
      "type": "object"
    },
    "ActionChain": {
      "description": "A chain of actions in sequential order",
      "items": {
        "$ref": "#/definitions/UserEvent"
      },
      "title": "Action chain",
      "type": "array"
    },
    "ActionType": {
      "description": "An identifier/name for an action",
      "examples": [
        "openCamera",
        "openPhotoLibrary",
        "openDocumentManager",
        "pageJump",
        "popUpDismiss",
        "refresh",
        "register",
        "removeSignature",
        "saveObject",
        "saveSignature",
        "updateObject",
        "popUp",
        "builtIn",
        "evalObject"
      ],
      "title": "Action type",
      "type": "string"
    },
    "AwaitReference": {
      "description": "A reference that returns its result after the value at the referenced path is received",
      "pattern": "^[=.]*[a-zA-Z0-9]+.*@$",
      "title": "Await reference",
      "type": "string"
    },
    "Boolean": {
      "description": "A boolean value is either one of \"true\", true, \"false\", or false",
      "enum": [
        "true",
        "false",
        true,
        false
      ],
      "title": "Boolean"
    },
    "Border": {
      "description": "Border styles",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "additionalProperties": true,
          "properties": {
            "color": {
              "$ref": "#/definitions/Color"
            },
            "line": {
              "examples": [
                "dashed",
                "solid"
              ],
              "type": "string"
            },
            "style": {
              "$ref": "#/definitions/BorderStylePreset"
            },
            "width": {
              "$ref": "#/definitions/NoodlUnit"
            }
          },
          "type": "object"
        }
      ],
      "title": "Border"
    },
    "BorderPreset1": {
      "description": "Removes border including the radius",
      "enum": [
        "1",
        1
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #1"
    },
    "BorderPreset2": {
      "description": "Removes border from all sides (including radius) except the bottom. This will create an underline effect",
      "enum": [
        2,
        "2"
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #2"
    },
    "BorderPreset3": {
      "description": "Applies a solid border to all sides",
      "enum": [
        "3",
        3
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #3"
    },
    "BorderPreset4": {
      "description": "Sets the border to be a dashed border",
      "enum": [
        "4",
        4
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #4"
    },
    "BorderPreset5": {
      "description": "Removes border from all sides",
      "enum": [
        "5",
        5
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #5"
    },
    "BorderPreset6": {
      "description": "Sets the border to be a solid border. This will also remove border radius from all sides",
      "enum": [
        "6",
        6
      ],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "title": "Border style preset #1"
    },
    "BorderStylePreset": {
      "description": "A set of border presets, each applying a different style",
      "oneOf": [
        {
          "$ref": "#/definitions/BorderPreset1"
        },
        {
          "$ref": "#/definitions/BorderPreset2"
        },
        {
          "$ref": "#/definitions/BorderPreset3"
        },
        {
          "$ref": "#/definitions/BorderPreset4"
        },
        {
          "$ref": "#/definitions/BorderPreset5"
        },
        {
          "$ref": "#/definitions/BorderPreset6"
        }
      ],
      "title": "Border style preset"
    },
    "BuiltInEval": {
      "description": "Objects that become built in functions when parsed/serialized",
      "patternProperties": {
        "^=.builtIn.[a-zA-Z0-9]+$": {
          "additionalProperties": true,
          "properties": {
            "dataIn": {
              "$ref": "#/definitions/DataIn"
            },
            "dataOut": {
              "$ref": "#/definitions/DataOut"
            }
          },
          "type": "object"
        }
      },
      "title": "Built in eval object",
      "type": "object"
    },
    "Color": {
      "examples": [
        "\"0x000000\""
      ],
      "pattern": "^(0x)[a-zA-Z0-9]+$",
      "title": "Color",
      "type": "string"
    },
    "Component": {
      "additionalProperties": true,
      "description": "Components are the building blocks that construct to user interfaces",
      "properties": {
        "audioStream": {
          "type": "boolean"
        },
        "borderRadius": {
          "$ref": "#/definitions/NoodlUnit"
        },
        "children": {
          "items": {
            "oneOf": [
              {
                "$ref": "#/definitions/Component"
              },
              {
                "$ref": "#/definitions/Reference"
              }
            ]
          },
          "type": "array"
        },
        "contentType": {
          "$ref": "#/definitions/ContentType"
        },
        "dataKey": {
          "$ref": "#/definitions/DataKey"
        },
        "ecosObj": {
          "examples": [
            "..document.ecosObj"
          ],
          "type": "string"
        },
        "global": {
          "$ref": "#/definitions/Boolean",
          "examples": [
            "true"
          ]
        },
        "image": {
          "type": "string"
        },
        "imgPath": {
          "type": "string"
        },
        "isEdit": {
          "$ref": "#/definitions/Boolean"
        },
        "isEditable": {
          "anyOf": [
            {
              "$ref": "#/definitions/Boolean"
            },
            {
              "type": "string"
            }
          ]
        },
        "itemObject": {
          "description": "This is a common value used for iteratorVar",
          "title": "itemObject",
          "type": "string"
        },
        "iteratorVar": {
          "examples": [
            "itemObject"
          ],
          "title": "Iterator variable",
          "type": "string"
        },
        "listObject": {
          "anyOf": [
            {
              "$ref": "#/definitions/Empty"
            },
            {
              "$ref": "#/definitions/Reference",
              "examples": [
                "..listData.contactList.docs"
              ]
            },
            {
              "type": "array"
            }
          ],
          "title": "List data"
        },
        "onBlur": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onChange": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onClick": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onEvent": {
          "examples": [
            "onNewEcosDoc"
          ],
          "type": "string"
        },
        "onFocus": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onHover": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onInput": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onMouseEnter": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onMouseLeave": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onMouseOut": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "onMouseOver": {
          "oneOf": [
            {
              "$ref": "#/definitions/ActionChain"
            },
            {
              "$ref": "#/definitions/UserEvent"
            }
          ]
        },
        "options": {
          "examples": [
            "..formData.options"
          ],
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array"
            }
          ]
        },
        "overflow": {
          "examples": [
            "hidden"
          ],
          "type": "string"
        },
        "path": {
          "$ref": "#/definitions/Path"
        },
        "placeholder": {
          "oneOf": [
            {
              "examples": [
                "..myPlaceholder"
              ],
              "type": "string"
            },
            {
              "$ref": "#/definitions/If"
            },
            {
              "properties": {
                "emit": {
                  "$ref": "#/definitions/Emit"
                }
              },
              "type": "object"
            }
          ]
        },
        "popUpView": {
          "type": "string"
        },
        "postMessage": {
          "type": "array"
        },
        "poster": {
          "description": "A cover image used on video components. When a video has not been interacted with by a user, a cover image is displayed. This value can be used for the cover image",
          "examples": [
            "poster.png"
          ],
          "title": "Cover image",
          "type": "string"
        },
        "required": {
          "oneOf": [
            {
              "examples": [
                "true",
                "false"
              ],
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ]
        },
        "resource": {
          "examples": [
            "https://google.com/someImage.jpeg"
          ],
          "type": "string"
        },
        "style": {
          "$ref": "#/definitions/Style"
        },
        "text": {
          "$ref": "#/definitions/Text"
        },
        "text=func": {
          "description": "A function to transform a component's text. A component must have the 'text' property.",
          "examples": [
            "=.builtIn.system.configUrl"
          ],
          "title": "Text transformer",
          "type": "string"
        },
        "textAlign": {
          "$ref": "#/definitions/TextAlign"
        },
        "textBoard": {
          "$ref": "#/definitions/TextBoard"
        },
        "type": {
          "$ref": "#/definitions/ComponentType"
        },
        "videoFormat": {
          "examples": [
            "mp4"
          ],
          "type": "string"
        },
        "videoStream": {
          "type": "boolean"
        },
        "viewTag": {
          "$ref": "#/definitions/ViewTag"
        },
        "zIndex": {
          "examples": [
            "\"1000\""
          ],
          "type": "number"
        }
      },
      "title": "Component",
      "type": "object"
    },
    "ComponentType": {
      "examples": [
        "button",
        "canvas",
        "chart",
        "chatList",
        "ecosDoc",
        "divider",
        "footer",
        "header",
        "image",
        "label",
        "list",
        "listItem",
        "map",
        "page",
        "plugin",
        "pluginHead",
        "pluginBodyTop",
        "pluginBodyTail",
        "popUp",
        "register",
        "scrollView",
        "textField",
        "textView",
        "video",
        "view"
      ],
      "title": "Component type",
      "type": "string"
    },
    "ConfigVersionObjectByDevice": {
      "additionalProperties": false,
      "properties": {
        "cadlVersion": {
          "properties": {
            "stable": {
              "examples": [
                "0.56d"
              ],
              "type": "string"
            },
            "test": {
              "examples": [
                "0.56d"
              ],
              "type": "string"
            }
          },
          "type": "object"
        }
      },
      "title": "Root config version object",
      "type": "object"
    },
    "ContentType": {
      "description": "Determines the content type of the component. For example, a textField component may be a date textField if it has contentType: date, or a password textField with contentType: password, etc",
      "examples": [
        "countryCode",
        "email",
        "date",
        "file",
        "formattedDate",
        "formattedDuration",
        "hidden",
        "listObject",
        "messageHidden",
        "number",
        "password",
        "passwordHidden",
        "phone",
        "phoneNumber",
        "tel",
        "text",
        "timer",
        "videoSubStream"
      ],
      "title": "Content type",
      "type": "string"
    },
    "DataIn": {
      "$ref": "#/definitions/Value",
      "description": "Argument(s) to the surrounding built in function",
      "title": "Data in"
    },
    "DataKey": {
      "anyOf": [
        {
          "$ref": "#/definitions/DataKeyString"
        },
        {
          "$ref": "#/definitions/DataKeyObject"
        }
      ],
      "description": "A value/pointer to a a property of an object",
      "title": "Data key"
    },
    "DataKeyObject": {
      "description": "Data key in the emit object",
      "patternProperties": {
        "^[a-zA-Z0-9]+$": {
          "examples": [
            "{var:\"\"}"
          ],
          "type": "object"
        }
      },
      "title": "Data key",
      "type": "object"
    },
    "DataKeyString": {
      "description": "The path to a data object or value. It might provide a different behavior depending on where it is placed. For example, a dataKey set on a textField component will bind its value to the path in the dataKey, enabling it to mutate the value while updating textField's value",
      "examples": [
        "formData.password",
        "SignIn.formData.password"
      ],
      "title": "Data key",
      "type": "string"
    },
    "DataObject": {
      "description": "An object that contains data. It is most commonly used in actions such as updateObject as a way to update its data values",
      "title": "Data object",
      "type": "string"
    },
    "DataOut": {
      "$ref": "#/definitions/Value",
      "description": "Return value(s) to the surrounding built in function",
      "title": "Data out"
    },
    "Emit": {
      "additionalProperties": false,
      "description": "An emit is a special type of action that usually contains a dataKey paired with a list of actions that are called in order. Some emits can contain just a list of actions. When paired with a dataKey it is usually mutating the value at the path in the dataKey",
      "properties": {
        "actions": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/Action"
              },
              {
                "$ref": "#/definitions/BuiltInEval"
              }
            ]
          },
          "title": "Emit actions",
          "type": "array"
        },
        "dataKey": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "object"
            }
          ],
          "title": "Emit action data key string or data key object"
        }
      },
      "required": [
        "actions"
      ],
      "title": "Emit",
      "type": "object"
    },
    "Empty": {
      "const": "",
      "description": "Empty value (empty string)",
      "title": "Empty",
      "type": "string"
    },
    "Goto": {
      "anyOf": [
        {
          "examples": [
            "SignIn"
          ],
          "type": "string"
        },
        {
          "$ref": "#/definitions/GotoObject",
          "type": "object"
        },
        {
          "$ref": "#/definitions/GotoPageComponentUrl",
          "type": "string"
        }
      ],
      "description": "The destination the user should navigate to",
      "not": {
        "type": "number"
      },
      "title": "Goto"
    },
    "GotoObject": {
      "properties": {
        "destination": {
          "examples": [
            "SignIn"
          ],
          "type": "string"
        }
      },
      "title": "Goto (object)",
      "type": "object"
    },
    "GotoPage": {
      "examples": [
        "SignIn",
        "SignOut"
      ],
      "title": "Goto (string)",
      "type": "string"
    },
    "GotoPageComponentUrl": {
      "examples": [
        "Dashboard@SignIn#someViewTag"
      ],
      "pattern": "[a-zA-Z0-9]+@[a-zA-Z0-9]+#[a-zA-Z0-9]+",
      "title": "Goto url",
      "type": "string"
    },
    "If": {
      "description": "If objects contain an array with three items used for conditional checks. The first item is used as a test for truthiness which can be in the form of any data type such as a string, number, boolean, object, etc. Either the second or third item is returned depending on the result of the truthiness test",
      "properties": {
        "if": {
          "items": {
            "$ref": "#/definitions/Value"
          },
          "maxItems": 3,
          "minItems": 3,
          "type": "array"
        }
      },
      "title": "A condition evaluation",
      "type": "object"
    },
    "Init": {
      "anyOf": [
        {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/If"
              },
              {
                "type": "string"
              },
              {
                "$ref": "#/definitions/Goto"
              },
              {
                "const": [
                  ""
                ],
                "title": "Page init",
                "type": "string"
              }
            ]
          },
          "type": "array"
        },
        {
          "$ref": "#/definitions/MixedActionChain"
        }
      ],
      "description": "One or more action(s) which will occur when entering a page",
      "title": "Init"
    },
    "LocalEvalReference": {
      "description": "Mutates the value at the referenced path after receiving its result",
      "pattern": "^=[.][.][a-zA-Z0-9]+.*$",
      "title": "Local eval reference",
      "type": "string"
    },
    "LocalReference": {
      "description": "A reference whose scope is within the page object, making them invisible to the objects outside of its scope",
      "pattern": "^[.][.][a-zA-Z0-9]+.*$",
      "title": "Local reference",
      "type": "string"
    },
    "MixedActionChain": {
      "description": "An ActionChain but also includes the BuiltInEval objects =.builtIn.* as well as await/eval references",
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/ActionChain"
          },
          {
            "items": {
              "$ref": "#/definitions/BuiltInEval"
            },
            "type": "array"
          },
          {
            "patternProperties": {
              "(=.[a-zA_Z0-9])*@$": {
                "$ref": "#/definitions/Value"
              }
            },
            "type": "object"
          }
        ]
      },
      "title": "ActionChain + Init",
      "type": "array"
    },
    "NoodlUnit": {
      "description": "A measurement adaptive to the size of the viewport",
      "examples": [
        "\"0\"",
        "\"0.1\"",
        "\"1\""
      ],
      "title": "Noodl unit (ex: \"0.1\", \"0.25\", etc)",
      "type": "string"
    },
    "Page": {
      "additionalProperties": {},
      "description": "A page object",
      "properties": {
        "check": {
          "$ref": "#/definitions/Init"
        },
        "components": {
          "items": {
            "$ref": "#/definitions/Component"
          },
          "title": "Page components",
          "type": "array"
        },
        "init": {
          "oneOf": [
            {
              "$ref": "#/definitions/Init"
            },
            {
              "const": ""
            }
          ]
        },
        "module": {
          "$ref": "#/definitions/PageModule"
        },
        "pageNumber": {
          "$ref": "#/definitions/PageNumber"
        },
        "save": {
          "$ref": "#/definitions/Init"
        },
        "title": {
          "description": "Titles can be used to represent the page",
          "examples": [
            "My Title"
          ],
          "title": "Page title",
          "type": "string"
        },
        "update": {
          "$ref": "#/definitions/Init"
        },
        "viewPort": {
          "description": "Determines the initial scroll position for the user",
          "examples": [
            "top",
            "center",
            "bottom"
          ],
          "type": "string"
        }
      },
      "title": "Page",
      "type": "object"
    },
    "PageActions": {
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/If"
          },
          {
            "properties": {
              "emit": {
                "$ref": "#/definitions/Emit"
              }
            },
            "type": "object"
          },
          {
            "type": "object"
          },
          {
            "$ref": "#/definitions/BuiltInEval"
          }
        ],
        "type": "array"
      },
      "title": "Page actions",
      "type": "array"
    },
    "PageModule": {
      "examples": [
        "admin",
        "business"
      ],
      "title": "Page module",
      "type": "string"
    },
    "PageNumber": {
      "description": "A page number may help distinguish between pages with similar names",
      "examples": [
        "\"219\""
      ],
      "title": "Page number",
      "type": "string"
    },
    "Path": {
      "description": "A path can be in the form of a string, an if object, or an emit object",
      "oneOf": [
        {
          "anyOf": [
            {
              "examples": [
                "logo.png",
                "SignIn"
              ],
              "type": "string"
            },
            {
              "$ref": "#/definitions/GotoPageComponentUrl"
            }
          ]
        },
        {
          "anyOf": [
            {
              "$ref": "#/definitions/BuiltInEval"
            },
            {
              "$ref": "#/definitions/If"
            },
            {
              "properties": {
                "emit": {
                  "$ref": "#/definitions/Emit"
                }
              },
              "type": "object"
            }
          ]
        }
      ],
      "title": "Destination pointing to a separate page or url"
    },
    "Reference": {
      "description": "Placeholder values that obtain their real values at a later time",
      "oneOf": [
        {
          "$ref": "#/definitions/LocalReference"
        },
        {
          "$ref": "#/definitions/RootReference"
        },
        {
          "$ref": "#/definitions/LocalEvalReference"
        },
        {
          "$ref": "#/definitions/RootEvalReference"
        },
        {
          "$ref": "#/definitions/AwaitReference"
        }
      ],
      "title": "Reference",
      "type": "string"
    },
    "Root": {
      "additionalProperties": true,
      "description": "The root/base object. It is global to all descendants",
      "properties": {
        "BaseCSS": {
          "properties": {
            "Style": {
              "$ref": "#/definitions/Style"
            }
          },
          "title": "Base CSS styles",
          "type": "object"
        },
        "BaseDataModel": {
          "additionalProperties": {
            "anyOf": [
              {
                "type": "object"
              }
            ]
          },
          "properties": {
            "Config": {
              "$ref": "#/definitions/RootConfig"
            },
            "Global": {
              "type": "object"
            }
          },
          "title": "Base data models",
          "type": "object"
        },
        "BasePage": {
          "title": "Base page components",
          "type": "object"
        },
        "Config": {
          "$ref": "#/definitions/RootConfig",
          "title": "Alias of RootConfig"
        },
        "Global": {
          "description": "This can be accessed and mutated by any object at any time",
          "title": "Global object",
          "type": "object"
        }
      },
      "title": "Root object",
      "type": "object"
    },
    "RootConfig": {
      "additionalProperties": true,
      "properties": {
        "android": {
          "$ref": "#/definitions/ConfigVersionObjectByDevice",
          "type": "object"
        },
        "apiCheck": {
          "type": "object"
        },
        "apiHost": {
          "type": "string"
        },
        "apiPort": {
          "examples": [
            "443"
          ],
          "type": "string"
        },
        "appApiHost": {
          "type": "string"
        },
        "cadlBaseUrl": {
          "type": "string"
        },
        "cadlMain": {
          "examples": [
            "cadlEndpoint.yml"
          ],
          "type": "string"
        },
        "cadlVersion": {
          "type": "object"
        },
        "connectiontimeout": {
          "examples": [
            "5"
          ],
          "type": "string"
        },
        "debug": {
          "oneOf": [
            {
              "examples": [
                "console_log_api"
              ],
              "type": "string"
            },
            {
              "type": "object"
            }
          ]
        },
        "elasticClient": {
          "type": "object"
        },
        "ios": {
          "$ref": "#/definitions/ConfigVersionObjectByDevice",
          "type": "object"
        },
        "isGetPosition": {
          "$ref": "#/definitions/Boolean"
        },
        "keywords": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "loadingLevel": {
          "examples": [
            "1"
          ],
          "type": "number"
        },
        "log": {
          "type": "string"
        },
        "myBaseUrl": {
          "type": "string"
        },
        "searchLink": {
          "type": "object"
        },
        "syncHost": {
          "type": "string"
        },
        "timestamp": {
          "examples": [
            5272021
          ],
          "type": "number"
        },
        "viewWidthHeightRatio": {
          "properties": {
            "max": {
              "examples": [
                0.56
              ],
              "type": "number"
            },
            "min": {
              "examples": [
                0.7
              ],
              "type": "number"
            }
          },
          "type": "object"
        },
        "web": {
          "$ref": "#/definitions/ConfigVersionObjectByDevice"
        },
        "webApiHost": {
          "type": "string"
        }
      },
      "title": "Root/base config",
      "type": "object"
    },
    "RootEvalReference": {
      "description": "Mutates the value at the root referenced path after receiving its result",
      "pattern": "^=[.][a-zA-Z0-9]+.*$",
      "title": "Root eval reference",
      "type": "string"
    },
    "RootReference": {
      "description": "A reference whose scope is at the global level",
      "pattern": "^[.][a-zA-Z0-9]+.*$",
      "title": "Root reference",
      "type": "string"
    },
    "SelectOptions": {
      "description": "Options for a select component. These are the items that appear in the drop down menu when interacting with a select component",
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "number"
          }
        ]
      },
      "title": "Select options",
      "type": "array"
    },
    "Style": {
      "additionalProperties": true,
      "properties": {
        "align": {
          "description": "The alignment in a block. If align is horizontal, siblings will align horizontally, vice versa. This is functionally equivalent to the \"axis\" keyword",
          "examples": [
            "centerX",
            "centerY"
          ],
          "title": "Alignment",
          "type": "string"
        },
        "axis": {
          "description": "The axis in a block. If axis is horizontal, siblings will align horizontally, vice versa. This was previously used in list/listItem components",
          "examples": [
            "horizontal",
            "vertical"
          ],
          "title": "Axis",
          "type": "string"
        },
        "backgroundColor": {
          "examples": [
            "\"0x030303\""
          ],
          "title": "Background color",
          "type": "string"
        },
        "border": {
          "$ref": "#/definitions/Border"
        },
        "borderBottom": {
          "title": "Bottom border",
          "type": "string"
        },
        "borderColor": {
          "examples": [
            "\"0x000000\""
          ],
          "title": "Border color",
          "type": "string"
        },
        "borderRadius": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Border radius"
        },
        "borderWidth": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Border width"
        },
        "boxShadow": {
          "description": "Applies a box shadow style effect",
          "title": "Box shadow",
          "type": "string"
        },
        "boxSizing": {
          "examples": [
            "border-box",
            "content-box"
          ],
          "title": "Box sizing",
          "type": "string"
        },
        "color": {
          "examples": [
            "\"0x000000\""
          ],
          "title": "Color",
          "type": "string"
        },
        "fontFamily": {
          "examples": [
            "Arial",
            "Courier New",
            "Verdana",
            "Times New Roman",
            "Consolas",
            "Helvetica"
          ],
          "title": "Font family",
          "type": "string"
        },
        "fontSize": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Font size"
        },
        "fontStyle": {
          "title": "Font style",
          "type": "string"
        },
        "fontWeight": {
          "oneOf": [
            {
              "description": "Applies a thickness style effect",
              "examples": [
                100,
                200,
                400,
                500,
                700,
                900,
                "bold"
              ],
              "type": "number"
            },
            {
              "type": "string"
            }
          ],
          "title": "Font weight"
        },
        "height": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Component Height"
        },
        "isEditable": {
          "$ref": "#/definitions/Boolean"
        },
        "isHidden": {
          "$ref": "#/definitions/Boolean",
          "description": "Used for hiding/showing components"
        },
        "justifyContent": {
          "examples": [
            "flex-start",
            "center",
            "flex-end",
            "space-around"
          ],
          "title": "Justify content",
          "type": "string"
        },
        "left": {
          "$ref": "#/definitions/NoodlUnit",
          "description": "Left position. The greater the value, the further away from the left position",
          "title": "Component left position"
        },
        "letterSpacing": {
          "description": "Spacing between each letter",
          "title": "Letter spacing",
          "type": "string"
        },
        "lineHeight": {
          "description": "Spacing between each line",
          "title": "Line height",
          "type": "string"
        },
        "margin": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Margin"
        },
        "marginTop": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Margin top"
        },
        "opacity": {
          "description": "Applies a transparenct style effect. The lower the opacity, the more the transparent effect is applied",
          "examples": [
            "0.5"
          ],
          "title": "Opacity",
          "type": "number"
        },
        "overflow": {
          "description": "If hidden, any styles flowing outside of a component's bounds will be invisible",
          "examples": [
            "hidden"
          ],
          "title": "Overflow",
          "type": "string"
        },
        "paddingBottom": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Padding bottom"
        },
        "paddingLeft": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Padding left"
        },
        "position": {
          "examples": [
            "relative",
            "absolute",
            "fixed",
            "static"
          ],
          "title": "Position",
          "type": "string"
        },
        "required": {
          "type": "string"
        },
        "shadow": {
          "description": "Applies a box shadow effect",
          "oneOf": [
            {
              "examples": [
                "true",
                "false"
              ],
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "title": "Shadow"
        },
        "textAlign": {
          "$ref": "#/definitions/TextAlign"
        },
        "textColor": {
          "$ref": "#/definitions/Color"
        },
        "textIndent": {
          "type": "string"
        },
        "top": {
          "$ref": "#/definitions/NoodlUnit",
          "description": "Top position. The greater the value, the further away from the top position",
          "title": "Component top position"
        },
        "width": {
          "$ref": "#/definitions/NoodlUnit",
          "title": "Component width"
        },
        "zIndex": {
          "description": "Applies a level of precedence/importance to a component. The higher the zIndex the higher level the component will be placed. For example, if a child 3 levels down applies a higher zIndex than the parent, then the child will appear to be on top in the page",
          "examples": [
            "\"1000\""
          ],
          "title": "zIndex",
          "type": "string"
        }
      },
      "title": "Component style object",
      "type": "object"
    },
    "Text": {
      "description": "Used to display text in the user interface. Most commonly used in label components",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "$ref": "#/definitions/If"
        }
      ],
      "title": "Text"
    },
    "TextAlign": {
      "oneOf": [
        {
          "$ref": "#/definitions/TextAlignEnum"
        },
        {
          "$ref": "#/definitions/TextAlignObject"
        }
      ],
      "title": "Text alignment"
    },
    "TextAlignEnum": {
      "examples": [
        "left",
        "center",
        "centerX",
        "right"
      ],
      "title": "Enum for the string textAlign type",
      "type": "string"
    },
    "TextAlignObject": {
      "additionalProperties": true,
      "properties": {
        "x": {
          "examples": [
            "left",
            "center",
            "centerX",
            "right"
          ],
          "type": "string"
        },
        "y": {
          "examples": [
            "center"
          ],
          "type": "string"
        }
      },
      "title": "Text align object",
      "type": "object"
    },
    "TextBoard": {
      "description": "A component that contains children of text that are positioned inline (side by side)",
      "items": {
        "properties": {
          "color": {
            "type": "string"
          },
          "text": {
            "$ref": "#/definitions/Text"
          }
        },
        "type": "object"
      },
      "title": "Textboard components",
      "type": "array"
    },
    "UserEvent": {
      "anyOf": [
        {
          "$ref": "#/definitions/Action",
          "type": "object"
        },
        {
          "$ref": "#/definitions/Reference"
        }
      ],
      "description": "An event in the form of an ActionChain that triggers from user interactions, like onClick and onFocus",
      "title": "User event"
    },
    "Value": {
      "description": "A valid value in accordance to the noodl specification",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "$ref": "#/definitions/NoodlUnit"
        },
        {
          "type": "number"
        },
        {
          "type": "object"
        },
        {
          "type": "array"
        },
        {
          "$ref": "#/definitions/Reference"
        },
        {
          "type": "null"
        },
        {
          "$ref": "#/definitions/If"
        },
        {
          "properties": {
            "emit": {
              "$ref": "#/definitions/Emit"
            }
          },
          "type": "object"
        }
      ],
      "title": "Noodl value"
    },
    "ViewTag": {
      "description": "An identifier which is used to bind a component and an action together. Actions can define a viewTag that invokes certain behavior towards a component. The component must also contain the same viewTag key/value. If multiple components have the same viewTag, then the action will effect multiple components",
      "title": "View tag",
      "type": "string"
    }
  },
  "patternProperties": {
    "^[a-zA-Z0-9]*$": {
      "anyOf": [
        {
          "$ref": "#/definitions/Page"
        }
      ],
      "type": "object"
    }
  },
  "title": "Noodl Schema",
  "type": "object"
}