{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/vacs-project/vacs-data/refs/heads/main/docs/schemas/profiles.schema.json", "title": "vacs dataset - profile configuration", "type": "object", "oneOf": [ { "$ref": "#/$defs/GeoProfile" }, { "$ref": "#/$defs/TabbedProfile" } ], "$defs": { "ProfileId": { "type": "string", "minLength": 1, "description": "Profile identifier, used to reference profile in positions configuration. Must start with your FIR's two-letter country code and be globally unique, e.g. LOVV, LOWW." }, "StationId": { "type": "string", "minLength": 1, "description": "Station identifier, used to reference a station from the stations configuration. Can reference stations from own and different FIRs, but the station identifier must already exist in the global dataset. Must be globally unique and should start with the two-letter country code of the FIR it is defined in, e.g. LOWW_APP, LOVV_N1." }, "LabelLines": { "type": "array", "maxItems": 3, "description": "Content of a multi-line label. Can be empty to represent a blank key.", "items": { "type": "string" } }, "LabelStringOrLines": { "description": "Label that can be either a single string or an array of strings (lines).", "oneOf": [{ "type": "string" }, { "$ref": "#/$defs/LabelLines" }] }, "FlexDirection": { "type": "string", "enum": ["row", "col"] }, "JustifyContent": { "type": "string", "enum": [ "start", "end", "center", "space-between", "space-around", "space-evenly" ] }, "AlignItems": { "type": "string", "enum": ["start", "end", "center"] }, "GeoPageDividerOrientation": { "type": "string", "enum": ["horizontal", "vertical"] }, "ContainerSize": { "type": "string", "description": "Must be an integer followed by % or rem (matches ^\\d+(%|rem)$). Examples: \"100%\", \"12rem\".", "pattern": "^\\d+(%|rem)$" }, "NonNegativeNumber": { "type": "number", "minimum": 0 }, "PositiveNumber": { "type": "number", "exclusiveMinimum": 0 }, "FrequencyDisplayMode": { "type": "string", "enum": ["ShowAll", "HideAll"], "default": "ShowAll" }, "ClientGroupMode": { "type": "string", "enum": ["None", "Fir", "Icao", "FirAndIcao"], "default": "FirAndIcao" }, "ClientPageConfig": { "type": "object", "additionalProperties": false, "properties": { "include": { "type": "array", "items": { "type": "string" }, "default": [] }, "exclude": { "type": "array", "items": { "type": "string" }, "default": [] }, "priority": { "type": "array", "items": { "type": "string" }, "default": ["*_FMP", "*_CTR", "*_APP", "*_TWR", "*_GND"] }, "frequencies": { "$ref": "#/$defs/FrequencyDisplayMode" }, "grouping": { "$ref": "#/$defs/ClientGroupMode" } } }, "DirectAccessKey": { "type": "object", "additionalProperties": false, "required": ["label"], "properties": { "label": { "$ref": "#/$defs/LabelStringOrLines" }, "station_id": { "$ref": "#/$defs/StationId" }, "page": { "$ref": "#/$defs/DirectAccessPage" } }, "not": { "required": ["station_id", "page"] } }, "DirectAccessPage": { "type": "object", "additionalProperties": false, "required": ["rows"], "properties": { "rows": { "type": "integer", "minimum": 1 }, "keys": { "type": "array", "items": { "$ref": "#/$defs/DirectAccessKey" } }, "client_page": { "$ref": "#/$defs/ClientPageConfig" } }, "oneOf": [{ "required": ["keys"] }, { "required": ["client_page"] }], "not": { "required": ["keys", "client_page"] } }, "Tab": { "type": "object", "additionalProperties": false, "required": ["label", "page"], "properties": { "label": { "allOf": [ { "$ref": "#/$defs/LabelStringOrLines" }, { "if": { "type": "array" }, "then": { "minItems": 1 } }, { "if": { "type": "string" }, "then": { "minLength": 1 } } ] }, "page": { "$ref": "#/$defs/DirectAccessPage" } } }, "GeoPageButton": { "type": "object", "additionalProperties": false, "required": ["label", "size"], "properties": { "label": { "description": "Geo page button labels must be non-empty and cannot exceed 3 lines.", "allOf": [ { "$ref": "#/$defs/LabelStringOrLines" }, { "if": { "type": "array" }, "then": { "minItems": 1 } }, { "if": { "type": "string" }, "then": { "minLength": 1 } } ] }, "size": { "$ref": "#/$defs/PositiveNumber" }, "page": { "$ref": "#/$defs/DirectAccessPage" } } }, "GeoPageDivider": { "type": "object", "additionalProperties": false, "required": ["orientation", "thickness", "color"], "properties": { "orientation": { "$ref": "#/$defs/GeoPageDividerOrientation" }, "thickness": { "$ref": "#/$defs/PositiveNumber" }, "color": { "type": "string", "minLength": 1, "description": "CSS color for divider line. Accepts any kind of valid CSS color, e.g. hex, RGB." }, "oversize": { "$ref": "#/$defs/PositiveNumber" } } }, "GeoPageContainer": { "type": "object", "required": ["direction", "children"], "properties": { "direction": { "$ref": "#/$defs/FlexDirection" }, "height": { "$ref": "#/$defs/ContainerSize" }, "width": { "$ref": "#/$defs/ContainerSize" }, "padding": { "$ref": "#/$defs/NonNegativeNumber" }, "padding_left": { "$ref": "#/$defs/NonNegativeNumber" }, "padding_right": { "$ref": "#/$defs/NonNegativeNumber" }, "padding_top": { "$ref": "#/$defs/NonNegativeNumber" }, "padding_bottom": { "$ref": "#/$defs/NonNegativeNumber" }, "gap": { "$ref": "#/$defs/NonNegativeNumber" }, "justify_content": { "$ref": "#/$defs/JustifyContent" }, "align_items": { "$ref": "#/$defs/AlignItems" }, "children": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/GeoNode" } } } }, "GeoNode": { "oneOf": [ { "$ref": "#/$defs/GeoPageContainer" }, { "$ref": "#/$defs/GeoPageButton" }, { "$ref": "#/$defs/GeoPageDivider" } ] }, "GeoProfile": { "type": "object", "allOf": [ { "$ref": "#/$defs/GeoPageContainer" }, { "type": "object", "required": ["id", "type"], "properties": { "id": { "$ref": "#/$defs/ProfileId" }, "type": { "const": "Geo" } } } ], "unevaluatedProperties": false }, "TabbedProfile": { "type": "object", "required": ["id", "type", "tabs"], "properties": { "id": { "$ref": "#/$defs/ProfileId" }, "type": { "const": "Tabbed" }, "tabs": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/Tab" } } }, "unevaluatedProperties": false } } }