{
  "$ref": "#/definitions/CoreRootSpec",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "AggregateOp": {
      "enum": [
        "count",
        "valid",
        "sum",
        "min",
        "max",
        "mean",
        "q1",
        "median",
        "q3",
        "variance"
      ],
      "type": "string"
    },
    "AggregateParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The names for the output fields corresponding to each aggregated field. If not provided, names will be automatically created using the operation and field names (e.g., `sum_field`, `average_field`).",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "fields": {
          "description": "The data fields to apply aggregate functions to. This array should correspond with the `ops` and `as` arrays. If no fields or operations are specified, a count aggregation will be applied by default.",
          "items": {
            "$ref": "#/definitions/Field"
          },
          "type": "array"
        },
        "groupby": {
          "description": "The fields by which to group the data. If these are not defined, all data objects will be grouped into a single category.",
          "items": {
            "$ref": "#/definitions/Field"
          },
          "type": "array"
        },
        "ops": {
          "description": "The aggregation operations to be performed on the fields, such as `\"sum\"`, `\"q1\"`, `\"median\"`, `\"q3\"`, or `\"count\"`.",
          "items": {
            "$ref": "#/definitions/AggregateOp"
          },
          "type": "array"
        },
        "type": {
          "const": "aggregate",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "Align": {
      "enum": [
        "left",
        "center",
        "right"
      ],
      "type": "string"
    },
    "Axis": {
      "additionalProperties": false,
      "properties": {
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "domainColor": {
          "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`.",
          "type": "string"
        },
        "domainDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "domainDashOffset": {
          "description": "The pixel offset at which to start drawing with the domain dash array.",
          "type": "number"
        },
        "domainWidth": {
          "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
          "type": "number"
        },
        "format": {
          "description": "The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.",
          "type": "string"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "gridCap": {
          "description": "The stroke cap for the grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "gridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "gridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "gridDashOffset": {
          "description": "The pixel offset at which to start drawing with the grid mark dash array.",
          "type": "number"
        },
        "gridOpacity": {
          "description": "The opacity of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "gridWidth": {
          "description": "Width of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "labelAlign": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
        },
        "labelAngle": {
          "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`."
        },
        "labelColor": {
          "description": "The color of the tick label, can be in hex color code or regular color name.",
          "type": "string"
        },
        "labelFont": {
          "description": "The font of the tick label.",
          "type": "string"
        },
        "labelFontSize": {
          "description": "The font size of the label, in pixels.",
          "minimum": 0,
          "type": "number"
        },
        "labelFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "labelFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of axis tick labels."
        },
        "labelLimit": {
          "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
          "type": "number"
        },
        "labelPadding": {
          "description": "The padding, in pixels, between axis and text labels.\n\n__Default value:__ `2`",
          "type": "number"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "maxExtent": {
          "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
          "type": "number"
        },
        "minExtent": {
          "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
          "type": "number"
        },
        "offset": {
          "description": "The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.",
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/AxisOrient",
          "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tickCap": {
          "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "tickColor": {
          "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`",
          "type": "string"
        },
        "tickCount": {
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of `2`, `5`, `10`) and lie within the underlying scale's range.",
          "minimum": 0,
          "type": "number"
        },
        "tickDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "tickDashOffset": {
          "description": "The pixel offset at which to start drawing with the tick mark dash array.",
          "type": "number"
        },
        "tickMinStep": {
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.",
          "type": "number"
        },
        "tickSize": {
          "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "tickWidth": {
          "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "description": "A title for the axis (none by default). Set to `null` to remove it.",
          "type": [
            "string",
            "null"
          ]
        },
        "titleColor": {
          "description": "Color of the title, can be in hex color code or regular color name.",
          "type": "string"
        },
        "titleFont": {
          "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
          "type": "string"
        },
        "titleFontSize": {
          "description": "Font size of the title.",
          "minimum": 0,
          "type": "number"
        },
        "titleFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "titleFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleOpacity": {
          "description": "Opacity of the axis title.",
          "type": "number"
        },
        "titlePadding": {
          "description": "The padding, in pixels, between title and axis.",
          "type": "number"
        },
        "values": {
          "description": "Explicitly set the visible axis tick and label values.",
          "items": {},
          "type": "array"
        },
        "zindex": {
          "description": "Z-order of the axis relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`, or `10` when the view content is clipped or scrollable.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "AxisConfig": {
      "additionalProperties": false,
      "properties": {
        "chromGrid": {
          "description": "A boolean flag indicating if chromosome grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "chromGridCap": {
          "description": "The stroke cap for the chromosome grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "chromGridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "chromGridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed chromosome grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromGridDashOffset": {
          "description": "The pixel offset at which to start drawing with the chromosome grid mark dash array.",
          "type": "number"
        },
        "chromGridFillEven": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridFillOdd": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridOpacity": {
          "description": "The opacity of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromGridWidth": {
          "description": "Width of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromLabelAlign": {
          "$ref": "#/definitions/Align"
        },
        "chromLabelColor": {
          "type": "string"
        },
        "chromLabelFont": {
          "type": "string"
        },
        "chromLabelFontSize": {
          "type": "number"
        },
        "chromLabelFontStyle": {
          "$ref": "#/definitions/FontStyle"
        },
        "chromLabelFontWeight": {
          "$ref": "#/definitions/FontWeight"
        },
        "chromLabelPadding": {
          "type": "number"
        },
        "chromLabels": {
          "type": "boolean"
        },
        "chromTickColor": {
          "type": "string"
        },
        "chromTickDash": {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromTickDashOffset": {
          "type": "number"
        },
        "chromTickSize": {
          "type": "number"
        },
        "chromTickWidth": {
          "type": "number"
        },
        "chromTicks": {
          "type": "boolean"
        },
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "domainColor": {
          "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`.",
          "type": "string"
        },
        "domainDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "domainDashOffset": {
          "description": "The pixel offset at which to start drawing with the domain dash array.",
          "type": "number"
        },
        "domainWidth": {
          "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
          "type": "number"
        },
        "format": {
          "description": "The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.",
          "type": "string"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "gridCap": {
          "description": "The stroke cap for the grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "gridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "gridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "gridDashOffset": {
          "description": "The pixel offset at which to start drawing with the grid mark dash array.",
          "type": "number"
        },
        "gridOpacity": {
          "description": "The opacity of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "gridWidth": {
          "description": "Width of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "labelAlign": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
        },
        "labelAngle": {
          "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`."
        },
        "labelColor": {
          "description": "The color of the tick label, can be in hex color code or regular color name.",
          "type": "string"
        },
        "labelFont": {
          "description": "The font of the tick label.",
          "type": "string"
        },
        "labelFontSize": {
          "description": "The font size of the label, in pixels.",
          "minimum": 0,
          "type": "number"
        },
        "labelFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "labelFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of axis tick labels."
        },
        "labelLimit": {
          "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
          "type": "number"
        },
        "labelPadding": {
          "description": "The padding, in pixels, between axis and text labels.\n\n__Default value:__ `2`",
          "type": "number"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "maxExtent": {
          "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
          "type": "number"
        },
        "minExtent": {
          "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
          "type": "number"
        },
        "offset": {
          "description": "The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.",
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/AxisOrient",
          "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tickCap": {
          "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "tickColor": {
          "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`",
          "type": "string"
        },
        "tickCount": {
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of `2`, `5`, `10`) and lie within the underlying scale's range.",
          "minimum": 0,
          "type": "number"
        },
        "tickDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "tickDashOffset": {
          "description": "The pixel offset at which to start drawing with the tick mark dash array.",
          "type": "number"
        },
        "tickMinStep": {
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.",
          "type": "number"
        },
        "tickSize": {
          "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "tickWidth": {
          "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "description": "A title for the axis (none by default). Set to `null` to remove it.",
          "type": [
            "string",
            "null"
          ]
        },
        "titleColor": {
          "description": "Color of the title, can be in hex color code or regular color name.",
          "type": "string"
        },
        "titleFont": {
          "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
          "type": "string"
        },
        "titleFontSize": {
          "description": "Font size of the title.",
          "minimum": 0,
          "type": "number"
        },
        "titleFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "titleFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleOpacity": {
          "description": "Opacity of the axis title.",
          "type": "number"
        },
        "titlePadding": {
          "description": "The padding, in pixels, between title and axis.",
          "type": "number"
        },
        "values": {
          "description": "Explicitly set the visible axis tick and label values.",
          "items": {},
          "type": "array"
        },
        "zindex": {
          "description": "Z-order of the axis relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`, or `10` when the view content is clipped or scrollable.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "AxisGenomeData": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to use"
        },
        "type": {
          "const": "axisGenome",
          "type": "string"
        }
      },
      "required": [
        "type",
        "channel"
      ],
      "type": "object"
    },
    "AxisOrient": {
      "enum": [
        "top",
        "bottom",
        "left",
        "right"
      ],
      "type": "string"
    },
    "AxisTicksData": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "$ref": "#/definitions/Axis",
          "description": "Optional axis properties"
        },
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to listen to"
        },
        "type": {
          "const": "axisTicks",
          "type": "string"
        }
      },
      "required": [
        "type",
        "channel"
      ],
      "type": "object"
    },
    "BamData": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "indexUrl": {
          "description": "URL of the index file.\n\n__Default value:__ `url` + `\".bai\"`.",
          "type": "string"
        },
        "type": {
          "const": "bam",
          "type": "string"
        },
        "url": {
          "description": "URL of the BigBed file.",
          "type": "string"
        },
        "windowSize": {
          "description": "Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\n\n__Default value:__ `10000`",
          "type": "number"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "Baseline": {
      "enum": [
        "top",
        "middle",
        "bottom",
        "alphabetic",
        "baseline"
      ],
      "type": "string"
    },
    "BedDataFormat": {
      "additionalProperties": false,
      "properties": {
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "const": "bed",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "BedpeDataFormat": {
      "additionalProperties": false,
      "properties": {
        "columns": {
          "description": "Optional ordered list of field names for headerless BEDPE input. If omitted, BEDPE fields are resolved from the default BEDPE column order or from a matching header row when present.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "const": "bedpe",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "BigBedData": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "type": {
          "const": "bigbed",
          "type": "string"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "URL of the BigBed file."
        },
        "windowSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\n\n__Default value:__ `1000000`"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "BigWigData": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "pixelsPerBin": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The approximate minimum width of each data bin, in pixels.\n\n__Default value:__ `2`"
        },
        "type": {
          "const": "bigwig",
          "type": "string"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "URL of the BigWig file."
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "BindCheckbox": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "description": {
          "description": "An optional description or help text that is shown below the input element.",
          "type": "string"
        },
        "input": {
          "const": "checkbox",
          "type": "string"
        },
        "name": {
          "description": "By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.",
          "type": "string"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    },
    "BindInput": {
      "additionalProperties": false,
      "properties": {
        "autocomplete": {
          "description": "A hint for form autofill. See the [HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for additional information.",
          "type": "string"
        },
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "description": {
          "description": "An optional description or help text that is shown below the input element.",
          "type": "string"
        },
        "input": {
          "description": "The type of input element to use. The valid values are `\"checkbox\"`, `\"radio\"`, `\"range\"`, `\"select\"`, `\"text\"`, `\"number\"`, and `\"color\"`.",
          "enum": [
            "text",
            "number",
            "color"
          ],
          "type": "string"
        },
        "name": {
          "description": "By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.",
          "type": "string"
        },
        "placeholder": {
          "description": "Text that appears in the form control when it has no value set.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "BindRadioSelect": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "description": {
          "description": "An optional description or help text that is shown below the input element.",
          "type": "string"
        },
        "input": {
          "enum": [
            "radio",
            "select"
          ],
          "type": "string"
        },
        "labels": {
          "description": "An array of label strings to represent the `options` values. If unspecified, the `options` value will be coerced to a string and used as the label.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "name": {
          "description": "By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.",
          "type": "string"
        },
        "options": {
          "description": "An array of options to select from.",
          "items": {},
          "type": "array"
        }
      },
      "required": [
        "input",
        "options"
      ],
      "type": "object"
    },
    "BindRange": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "description": {
          "description": "An optional description or help text that is shown below the input element.",
          "type": "string"
        },
        "input": {
          "const": "range",
          "type": "string"
        },
        "max": {
          "description": "Sets the maximum slider value. Defaults to the larger of the signal value and `100`.",
          "type": "number"
        },
        "min": {
          "description": "Sets the minimum slider value. Defaults to the smaller of the signal value and `0`.",
          "type": "number"
        },
        "name": {
          "description": "By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.",
          "type": "string"
        },
        "step": {
          "description": "Sets the minimum slider increment. If undefined, the step size will be automatically determined based on the `min` and `max` values.",
          "type": "number"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    },
    "Binding": {
      "anyOf": [
        {
          "$ref": "#/definitions/BindCheckbox"
        },
        {
          "$ref": "#/definitions/BindRadioSelect"
        },
        {
          "$ref": "#/definitions/BindRange"
        },
        {
          "$ref": "#/definitions/BindInput"
        }
      ]
    },
    "BrushConfig": {
      "additionalProperties": false,
      "properties": {
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "Whether the brush rectangle should be clipped to the viewport.\n\n__Default value:__ `true`"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the interval mark.\n\n__Default value:__ `{ expr: \"intervalDragActive ? 'grabbing' : 'move'\" }`"
        },
        "fill": {
          "description": "The fill color of the interval mark.\n\n__Default value:__ `\"#808080\"`",
          "type": "string"
        },
        "fillOpacity": {
          "description": "The fill opacity of the interval mark (a value between `0` and `1`).\n\n__Default value:__ `0.05`",
          "type": "number"
        },
        "measure": {
          "description": "Where to display the measurement text (e.g., number of base pairs) for the interval selection.\n\n- `\"none\"` -- do not show the measurement.\n- `\"inside\"` -- show inside the brush rectangle.\n- `\"outside\"` -- show outside the brush rectangle.\n\n__Default value:__ `\"none\"`",
          "enum": [
            "none",
            "inside",
            "outside"
          ],
          "type": "string"
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "stroke": {
          "description": "The stroke color of the interval mark.\n\n__Default value:__ `\"black\"`",
          "type": "string"
        },
        "strokeOpacity": {
          "description": "The stroke opacity of the interval mark (a value between `0` and `1`).\n\n__Default value:__ `0.2`",
          "type": "number"
        },
        "strokeWidth": {
          "description": "The stroke width of the interval mark.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "zindex": {
          "description": "Z-order of the interval mark relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `1`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "BuiltInThemeName": {
      "enum": [
        "genomespy",
        "vegalite",
        "quartz",
        "dark",
        "fivethirtyeight",
        "urbaninstitute"
      ],
      "type": "string"
    },
    "ChannelWithScale": {
      "anyOf": [
        {
          "$ref": "#/definitions/PositionalChannel"
        },
        {
          "const": "color",
          "type": "string"
        },
        {
          "const": "fill",
          "type": "string"
        },
        {
          "const": "stroke",
          "type": "string"
        },
        {
          "const": "opacity",
          "type": "string"
        },
        {
          "const": "fillOpacity",
          "type": "string"
        },
        {
          "const": "strokeOpacity",
          "type": "string"
        },
        {
          "const": "strokeWidth",
          "type": "string"
        },
        {
          "const": "size",
          "type": "string"
        },
        {
          "const": "shape",
          "type": "string"
        },
        {
          "const": "angle",
          "type": "string"
        },
        {
          "const": "dx",
          "type": "string"
        },
        {
          "const": "dy",
          "type": "string"
        }
      ]
    },
    "ChromPosDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/GenomeAxis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "chrom": {
          "$ref": "#/definitions/FieldName",
          "description": "The field having the chromosome or contig."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "offset": {
          "description": "An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\n\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\n\n**Default:** `0`",
          "type": "number"
        },
        "pos": {
          "$ref": "#/definitions/FieldName",
          "description": "The field having an intra-chromosomal position."
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "const": "locus",
          "type": "string"
        }
      },
      "required": [
        "chrom",
        "type"
      ],
      "type": "object"
    },
    "ChromosomalLocus": {
      "additionalProperties": false,
      "properties": {
        "chrom": {
          "description": "The name of the chromosome. For example: `\"chr1\"`, `\"CHR1\"`, or `\"1\"`.",
          "type": "string"
        },
        "pos": {
          "description": "The zero-based position inside the chromosome or contig.",
          "type": "number"
        }
      },
      "required": [
        "chrom"
      ],
      "type": "object"
    },
    "CollectParams": {
      "additionalProperties": false,
      "properties": {
        "groupby": {
          "description": "Arranges the data into consecutive batches based on the groups. This is mainly intended for internal use so that faceted data can be handled as batches.",
          "items": {
            "$ref": "#/definitions/Field"
          },
          "type": "array"
        },
        "sort": {
          "$ref": "#/definitions/CompareParams",
          "description": "The sort order."
        },
        "type": {
          "const": "collect",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ColorDef": {
      "$ref": "#/definitions/MarkPropDef%3C(string%7Cnull)%3E"
    },
    "ColorSchemeConfig": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "$ref": "#/definitions/SchemeParams"
        }
      ]
    },
    "CompareParams": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/definitions/Field"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/Field"
            }
          ],
          "description": "The field(s) to sort by"
        },
        "order": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/definitions/SortOrder"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/SortOrder"
            }
          ],
          "description": "The order(s) to use: `\"ascending\"` (default), `\"descending\"`."
        }
      },
      "required": [
        "field"
      ],
      "type": "object"
    },
    "ComplexDomain": {
      "description": "A complex domain that needs to be converted into a scalar domain before it is assigned to a scale.",
      "items": {
        "$ref": "#/definitions/ChromosomalLocus"
      },
      "type": "array"
    },
    "ConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "columns": {
          "description": "The number of columns in the grid.",
          "type": "number"
        },
        "concat": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/ViewSpec"
              },
              {
                "$ref": "#/definitions/ImportSpec"
              }
            ]
          },
          "type": "array"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "separator": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/SeparatorProps"
            }
          ],
          "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
        },
        "spacing": {
          "description": "The gap between the views, in pixels.",
          "type": "number"
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "columns",
        "concat"
      ],
      "type": "object"
    },
    "Conditional<MarkPropExprDef<Type>>": {
      "$ref": "#/definitions/ConditionalParameter%3CMarkPropExprDef%3CType%3E%3E"
    },
    "Conditional<MarkPropExprDef<TypeForShape>>": {
      "$ref": "#/definitions/ConditionalParameter%3CMarkPropExprDef%3CTypeForShape%3E%3E"
    },
    "Conditional<MarkPropFieldDef<Type>>": {
      "$ref": "#/definitions/ConditionalParameter%3CMarkPropFieldDef%3CType%3E%3E"
    },
    "Conditional<MarkPropFieldDef<TypeForShape>>": {
      "$ref": "#/definitions/ConditionalParameter%3CMarkPropFieldDef%3CTypeForShape%3E%3E"
    },
    "Conditional<ScaleDatumDef>": {
      "$ref": "#/definitions/ConditionalParameter%3CScaleDatumDef%3E"
    },
    "Conditional<ValueDef<(number|ExprRef)>>": {
      "$ref": "#/definitions/ConditionalParameter%3CValueDef%3C(number%7CExprRef)%3E%3E"
    },
    "Conditional<ValueDef<(string|null|ExprRef)>>": {
      "$ref": "#/definitions/ConditionalParameter%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
    },
    "ConditionalParameter<MarkPropExprDef<Type>>": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "expr": {
          "description": "An expression. Properties of the data can be accessed through the `datum` object.",
          "type": "string"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "expr",
        "param",
        "type"
      ],
      "type": "object"
    },
    "ConditionalParameter<MarkPropExprDef<TypeForShape>>": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "expr": {
          "description": "An expression. Properties of the data can be accessed through the `datum` object.",
          "type": "string"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "expr",
        "param",
        "type"
      ],
      "type": "object"
    },
    "ConditionalParameter<MarkPropFieldDef<Type>>": {
      "additionalProperties": {
        "not": {}
      },
      "properties": {
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "param",
        "type"
      ],
      "type": "object"
    },
    "ConditionalParameter<MarkPropFieldDef<TypeForShape>>": {
      "additionalProperties": {
        "not": {}
      },
      "properties": {
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/TypeForShape"
        }
      },
      "required": [
        "param",
        "type"
      ],
      "type": "object"
    },
    "ConditionalParameter<ScaleDatumDef>": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "param"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(number|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(string|null|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "description": "Filter using a parameter name.",
          "type": "string"
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "Contig": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string"
        },
        "size": {
          "type": "number"
        }
      },
      "required": [
        "name",
        "size"
      ],
      "type": "object"
    },
    "CoreRootSpec": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "mark": {
              "anyOf": [
                {
                  "$ref": "#/definitions/MarkType"
                },
                {
                  "$ref": "#/definitions/MarkProps"
                }
              ],
              "description": "The graphical mark presenting the data objects."
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "opacity": {
              "$ref": "#/definitions/ViewOpacityDef",
              "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "view": {
              "$ref": "#/definitions/ViewBackground",
              "description": "The background of the view, including fill, stroke, and stroke width."
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "mark"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "layer": {
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/definitions/LayerSpec"
                  },
                  {
                    "$ref": "#/definitions/UnitSpec"
                  },
                  {
                    "$ref": "#/definitions/MultiscaleSpec"
                  },
                  {
                    "$ref": "#/definitions/ImportSpec"
                  }
                ]
              },
              "type": "array"
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "opacity": {
              "$ref": "#/definitions/ViewOpacityDef",
              "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "view": {
              "$ref": "#/definitions/ViewBackground"
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "layer"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "multiscale": {
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/definitions/LayerSpec"
                  },
                  {
                    "$ref": "#/definitions/UnitSpec"
                  },
                  {
                    "$ref": "#/definitions/MultiscaleSpec"
                  },
                  {
                    "$ref": "#/definitions/ImportSpec"
                  }
                ]
              },
              "type": "array"
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "opacity": {
              "$ref": "#/definitions/ViewOpacityDef",
              "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "stops": {
              "$ref": "#/definitions/MultiscaleStopsDef",
              "description": "Stop definition that controls transitions between the multiscale levels.\n\n- `number[]` is shorthand for `{ metric: \"unitsPerPixel\", values: ... }`\n- `(number | ExprRef)[]` supports mixed constants and expressions\n- Object form allows configuring metric, channel, and fade."
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "view": {
              "$ref": "#/definitions/ViewBackground"
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "multiscale",
            "stops"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "separator": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/SeparatorProps"
                }
              ],
              "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
            },
            "spacing": {
              "description": "The gap between the views, in pixels.",
              "type": "number"
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "vconcat": {
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/definitions/ViewSpec"
                  },
                  {
                    "$ref": "#/definitions/ImportSpec"
                  }
                ]
              },
              "type": "array"
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "vconcat"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "hconcat": {
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/definitions/ViewSpec"
                  },
                  {
                    "$ref": "#/definitions/ImportSpec"
                  }
                ]
              },
              "type": "array"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "separator": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/SeparatorProps"
                }
              ],
              "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
            },
            "spacing": {
              "description": "The gap between the views, in pixels.",
              "type": "number"
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "hconcat"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "type": "string"
            },
            "assembly": {
              "description": "Default assembly for locus scales that do not define `scale.assembly`.\n\nCan reference either a key in `genomes` or a built-in assembly name.",
              "type": "string"
            },
            "background": {
              "description": "Background color of the canvas.",
              "type": "string"
            },
            "baseUrl": {
              "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
              "type": "string"
            },
            "columns": {
              "description": "The number of columns in the grid.",
              "type": "number"
            },
            "concat": {
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/definitions/ViewSpec"
                  },
                  {
                    "$ref": "#/definitions/ImportSpec"
                  }
                ]
              },
              "type": "array"
            },
            "config": {
              "$ref": "#/definitions/GenomeSpyConfig",
              "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
            },
            "cursor": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
            },
            "data": {
              "$ref": "#/definitions/Data",
              "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
            },
            "datasets": {
              "additionalProperties": {
                "items": {},
                "type": "array"
              },
              "description": "https://vega.github.io/vega-lite/docs/data.html#datasets",
              "type": "object"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
            },
            "domainInert": {
              "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "encoding": {
              "$ref": "#/definitions/Encoding",
              "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
            },
            "genome": {
              "$ref": "#/definitions/GenomeConfig",
              "deprecated": "Legacy root-level genome config. Use `genomes` and `assembly` instead."
            },
            "genomes": {
              "additionalProperties": {
                "$ref": "#/definitions/NamedGenomeConfig"
              },
              "description": "Named genome assembly definitions.\n\nEach object key is the assembly name.",
              "type": "object"
            },
            "height": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
            },
            "name": {
              "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
              "type": "string"
            },
            "padding": {
              "$ref": "#/definitions/PaddingConfig",
              "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
            },
            "params": {
              "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            "resolve": {
              "additionalProperties": false,
              "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
              "properties": {
                "axis": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                },
                "scale": {
                  "additionalProperties": {
                    "$ref": "#/definitions/ResolutionBehavior"
                  },
                  "properties": {
                    "angle": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "color": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "default": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dx": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "dy": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "facetIndex": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fill": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "fillOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "key": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "opacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "sample": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "search": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "semanticScore": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "shape": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "size": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "stroke": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeOpacity": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "strokeWidth": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "text": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "uniqueId": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "x2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    },
                    "y2": {
                      "$ref": "#/definitions/ResolutionBehavior"
                    }
                  },
                  "type": "object"
                }
              },
              "type": "object"
            },
            "separator": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/SeparatorProps"
                }
              ],
              "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
            },
            "spacing": {
              "description": "The gap between the views, in pixels.",
              "type": "number"
            },
            "templates": {
              "additionalProperties": {
                "$ref": "#/definitions/ViewSpec"
              },
              "type": "object"
            },
            "theme": {
              "anyOf": [
                {
                  "$ref": "#/definitions/BuiltInThemeName"
                },
                {
                  "items": {
                    "$ref": "#/definitions/BuiltInThemeName"
                  },
                  "type": "array"
                }
              ],
              "description": "Selects built-in theme preset(s) for the whole visualization."
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Title"
                }
              ],
              "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
            },
            "transform": {
              "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
              "items": {
                "$ref": "#/definitions/TransformParams"
              },
              "type": "array"
            },
            "viewportHeight": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
            },
            "viewportWidth": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
            },
            "visible": {
              "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
              "type": "boolean"
            },
            "width": {
              "anyOf": [
                {
                  "$ref": "#/definitions/SizeDef"
                },
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/Step"
                },
                {
                  "const": "container",
                  "type": "string"
                }
              ],
              "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
            }
          },
          "required": [
            "columns",
            "concat"
          ],
          "type": "object"
        }
      ]
    },
    "CoverageParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field for the computed coverage.",
          "type": "string"
        },
        "asChrom": {
          "description": "The output field for the chromosome.\n\n**Default:** Same as `chrom`",
          "type": "string"
        },
        "asEnd": {
          "description": "The output field for the end coordinate.\n\n**Default:** Same as `end`",
          "type": "string"
        },
        "asStart": {
          "description": "The output field for the start coordinate.\n\n**Default:** Same as `start`",
          "type": "string"
        },
        "chrom": {
          "$ref": "#/definitions/Field",
          "description": "An optional chromosome field that is passed through. TODO: groupby"
        },
        "end": {
          "$ref": "#/definitions/Field",
          "description": "The field representing the end coordinate of the segment (exclusive)."
        },
        "start": {
          "$ref": "#/definitions/Field",
          "description": "The field representing the start coordinate of the segment (inclusive)."
        },
        "type": {
          "const": "coverage",
          "description": "The type of the transform to be applied",
          "type": "string"
        },
        "weight": {
          "$ref": "#/definitions/Field",
          "description": "A field representing an optional weight for the segment. Can be used with copy ratios, for example."
        }
      },
      "required": [
        "end",
        "start",
        "type"
      ],
      "type": "object"
    },
    "CsvDataFormat": {
      "additionalProperties": false,
      "properties": {
        "columns": {
          "description": "Optional ordered list of field names for headerless CSV or TSV input. When provided, the first row is interpreted as data rather than a header row.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "enum": [
            "csv",
            "tsv"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "Data": {
      "anyOf": [
        {
          "$ref": "#/definitions/DataSource"
        },
        {
          "$ref": "#/definitions/Generator"
        }
      ]
    },
    "DataFormat": {
      "anyOf": [
        {
          "$ref": "#/definitions/CsvDataFormat"
        },
        {
          "$ref": "#/definitions/DsvDataFormat"
        },
        {
          "$ref": "#/definitions/JsonDataFormat"
        },
        {
          "$ref": "#/definitions/BedDataFormat"
        },
        {
          "$ref": "#/definitions/BedpeDataFormat"
        },
        {
          "$ref": "#/definitions/OtherDataFormat"
        }
      ]
    },
    "DataSource": {
      "anyOf": [
        {
          "$ref": "#/definitions/UrlData"
        },
        {
          "$ref": "#/definitions/InlineData"
        },
        {
          "$ref": "#/definitions/NamedData"
        },
        {
          "$ref": "#/definitions/DynamicCallbackData"
        },
        {
          "$ref": "#/definitions/LazyData"
        }
      ]
    },
    "DomEventType": {
      "anyOf": [
        {
          "$ref": "#/definitions/InteractionEventType"
        },
        {
          "const": "pointerover",
          "type": "string"
        }
      ]
    },
    "DsvDataFormat": {
      "additionalProperties": false,
      "properties": {
        "columns": {
          "description": "Optional ordered list of field names for headerless delimiter-separated input. When provided, the first row is interpreted as data rather than a header row.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "delimiter": {
          "description": "The delimiter between records. The delimiter must be a single character (i.e., a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not.",
          "maxLength": 1,
          "minLength": 1,
          "type": "string"
        },
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "const": "dsv",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "required": [
        "delimiter"
      ],
      "type": "object"
    },
    "DynamicCallbackData": {
      "additionalProperties": false,
      "properties": {
        "dynamicCallbackSource": {
          "description": "The View class has `getDynamicData()` methods that provides the data. This is intended for internal use.",
          "type": "boolean"
        },
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        }
      },
      "required": [
        "dynamicCallbackSource"
      ],
      "type": "object"
    },
    "DynamicOpacity": {
      "additionalProperties": false,
      "description": "DynamicOpacity specifies a zoom-dependent behavior for view opacity. The opacity is interpolated between the specified stops.",
      "properties": {
        "channel": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimaryPositionalChannel"
            },
            {
              "const": "auto",
              "type": "string"
            }
          ],
          "description": "The positional channel whose scale domain controls the opacity. If set to `\"auto\"`, both `x` and `y` scales may contribute.\n\nIf omitted, `x` is used when available and `y` is used as a fallback."
        },
        "unitsPerPixel": {
          "description": "Opacity stops expressed as units (base pairs, for example) per pixel. The values must be positive.\n\nEach stop is paired with an opacity in `values` at the same index. Stops can be constants or expression references.",
          "items": {
            "$ref": "#/definitions/NumericStopDef"
          },
          "type": "array"
        },
        "values": {
          "description": "Opacity values that match the given `unitsPerPixel` stops.\n\nValues outside the stop range are clamped to the nearest stop.",
          "items": {
            "type": "number"
          },
          "type": "array"
        }
      },
      "required": [
        "unitsPerPixel",
        "values"
      ],
      "type": "object"
    },
    "Encoding": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Rotation angle of point and text marks."
        },
        "color": {
          "$ref": "#/definitions/ColorDef",
          "description": "Color of the marks – either fill or stroke color based on  the `filled` property of mark definition.\n\n_Note:_ 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. The `fill` or `stroke` encodings have higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified. 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme)."
        },
        "dx": {
          "anyOf": [
            {
              "$ref": "#/definitions/NumericMarkPropDef"
            },
            {
              "$ref": "#/definitions/MarkPropExprDef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "$ref": "#/definitions/NumericMarkPropDef"
            },
            {
              "$ref": "#/definitions/MarkPropExprDef"
            }
          ]
        },
        "facetIndex": {
          "$ref": "#/definitions/FieldDefWithoutScale",
          "description": "For internal use"
        },
        "fill": {
          "$ref": "#/definitions/ColorDef",
          "description": "Fill color of the marks.\n\n_Note:_ The `fill` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "fillOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Fill opacity of the marks."
        },
        "key": {
          "$ref": "#/definitions/KeyDef",
          "description": "One or more data fields that uniquely identify data objects for stable point selections and bookmarking across sessions. Unlike `uniqueId` (an implicit surrogate key), key fields must be stable in the source data.\n\nUse a single field definition for simple keys, or an array of field definitions for composite keys. For composite keys, field order is significant."
        },
        "opacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Opacity of the marks."
        },
        "sample": {
          "$ref": "#/definitions/FieldDefWithoutScale",
          "description": "Facet identifier for interactive filtering, sorting, and grouping in the App."
        },
        "search": {
          "$ref": "#/definitions/SearchDef",
          "description": "One or more fields used by the App's location/search input to match data objects in this view.\n\nUse a single field definition for simple search, or an array for matching against multiple fields. A datum matches when any configured search field matches the entered term."
        },
        "semanticScore": {
          "additionalProperties": false,
          "properties": {
            "field": {
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
              "type": "string"
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            },
            "type": {
              "$ref": "#/definitions/Type"
            }
          },
          "type": "object"
        },
        "shape": {
          "$ref": "#/definitions/ShapeDef",
          "description": "Shape of the mark.\n\nFor `point` marks the supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- centered directional shape `\"triangle\"`"
        },
        "size": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Size of the mark.\n- For `\"point\"` – the symbol size, or pixel area of the mark.\n- For `\"text\"` – the text's font size."
        },
        "stroke": {
          "$ref": "#/definitions/ColorDef",
          "description": "Stroke color of the marks.\n\n_Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "strokeOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke opacity of the marks."
        },
        "strokeWidth": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke width of the marks."
        },
        "text": {
          "$ref": "#/definitions/TextDef",
          "description": "Text of the `text` mark."
        },
        "uniqueId": {
          "$ref": "#/definitions/FieldDefWithoutScale",
          "description": "For internal use"
        },
        "x": {
          "anyOf": [
            {
              "additionalProperties": false,
              "properties": {
                "axis": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/GenomeAxis"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
                },
                "band": {
                  "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "buildIndex": {
                  "description": "Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\n\nThis setting implicitly sorts the data by the field assigned on the `x` channel.",
                  "type": "boolean"
                },
                "domainInert": {
                  "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
                  "type": "boolean"
                },
                "field": {
                  "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
                  "type": "string"
                },
                "resolutionChannel": {
                  "$ref": "#/definitions/ChannelWithScale",
                  "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
                },
                "scale": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/Scale"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
                },
                "title": {
                  "description": "A title for the field. If `null`, the title will be removed.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "$ref": "#/definitions/Type"
                }
              },
              "required": [
                "type"
              ],
              "type": "object"
            },
            {
              "additionalProperties": false,
              "properties": {
                "axis": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/GenomeAxis"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
                },
                "band": {
                  "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "buildIndex": {
                  "description": "Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\n\nThis setting implicitly sorts the data by the field assigned on the `x` channel.",
                  "type": "boolean"
                },
                "chrom": {
                  "$ref": "#/definitions/FieldName",
                  "description": "The field having the chromosome or contig."
                },
                "domainInert": {
                  "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
                  "type": "boolean"
                },
                "offset": {
                  "description": "An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\n\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\n\n**Default:** `0`",
                  "type": "number"
                },
                "pos": {
                  "$ref": "#/definitions/FieldName",
                  "description": "The field having an intra-chromosomal position."
                },
                "resolutionChannel": {
                  "$ref": "#/definitions/ChannelWithScale",
                  "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
                },
                "scale": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/Scale"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
                },
                "title": {
                  "description": "A title for the field. If `null`, the title will be removed.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "const": "locus",
                  "type": "string"
                }
              },
              "required": [
                "chrom",
                "type"
              ],
              "type": "object"
            },
            {
              "additionalProperties": false,
              "properties": {
                "axis": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/GenomeAxis"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
                },
                "band": {
                  "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "buildIndex": {
                  "description": "Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\n\nThis setting implicitly sorts the data by the field assigned on the `x` channel.",
                  "type": "boolean"
                },
                "datum": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/Scalar"
                    },
                    {
                      "$ref": "#/definitions/ExprRef"
                    }
                  ],
                  "description": "A constant value in data domain."
                },
                "domainInert": {
                  "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
                  "type": "boolean"
                },
                "resolutionChannel": {
                  "$ref": "#/definitions/ChannelWithScale",
                  "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
                },
                "scale": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/Scale"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
                },
                "title": {
                  "description": "A title for the field. If `null`, the title will be removed.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "$ref": "#/definitions/Type"
                }
              },
              "required": [
                "type"
              ],
              "type": "object"
            },
            {
              "additionalProperties": false,
              "properties": {
                "axis": {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/GenomeAxis"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
                },
                "band": {
                  "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "buildIndex": {
                  "description": "Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\n\nThis setting implicitly sorts the data by the field assigned on the `x` channel.",
                  "type": "boolean"
                },
                "domainInert": {
                  "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
                  "type": "boolean"
                },
                "expr": {
                  "description": "An expression. Properties of the data can be accessed through the `datum` object.",
                  "type": "string"
                },
                "title": {
                  "description": "A title for the field. If `null`, the title will be removed.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "$ref": "#/definitions/Type"
                }
              },
              "required": [
                "expr",
                "type"
              ],
              "type": "object"
            },
            {
              "additionalProperties": false,
              "properties": {
                "buildIndex": {
                  "description": "Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\n\nThis setting implicitly sorts the data by the field assigned on the `x` channel.",
                  "type": "boolean"
                },
                "title": {
                  "description": "A title for the field. If `null`, the title will be removed.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "$ref": "#/definitions/ExprRef"
                    }
                  ],
                  "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
                }
              },
              "required": [
                "value"
              ],
              "type": "object"
            }
          ],
          "description": "X coordinates of the marks.\n\nThe `value` of this channel can be a number between zero and one."
        },
        "x2": {
          "anyOf": [
            {
              "$ref": "#/definitions/Position2Def"
            },
            {
              "type": "null"
            }
          ],
          "description": "X2 coordinates of the marks.\n\nThe `value` of this channel can be a number between zero and one."
        },
        "y": {
          "$ref": "#/definitions/PositionDef",
          "description": "Y coordinates of the marks.\n\nThe `value` of this channel can be a number between zero and one."
        },
        "y2": {
          "anyOf": [
            {
              "$ref": "#/definitions/Position2Def"
            },
            {
              "type": "null"
            }
          ],
          "description": "Y2 coordinates of the marks.\n\nThe `value` of this channel can be a number between zero and one."
        }
      },
      "type": "object"
    },
    "EventConfig": {
      "additionalProperties": false,
      "properties": {
        "filter": {
          "description": "An optional filter expression to further filter events of the specified type. The expression can only refer to the event object as `event`, and should evaluate to a boolean value indicating whether to include the event. No other data or parameters are in scope.",
          "type": "string"
        },
        "type": {
          "$ref": "#/definitions/DomEventType",
          "description": "The type of event to listen to. For example, `\"click\"` or `\"mouseenter\"`."
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ExprDef": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "expr": {
          "description": "An expression. Properties of the data can be accessed through the `datum` object.",
          "type": "string"
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "expr"
      ],
      "type": "object"
    },
    "ExprFilterParams": {
      "additionalProperties": false,
      "properties": {
        "expr": {
          "description": "An expression string. The data object is removed if the expression evaluates to false.",
          "type": "string"
        },
        "type": {
          "const": "filter",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "expr",
        "type"
      ],
      "type": "object"
    },
    "ExprRef": {
      "additionalProperties": false,
      "properties": {
        "expr": {
          "description": "The expression string.",
          "type": "string"
        }
      },
      "required": [
        "expr"
      ],
      "type": "object"
    },
    "Field": {
      "description": "The name of the field or a JavaScript expression for accessing nested properties. Dots and brackets in the field name must be escaped.",
      "type": "string"
    },
    "FieldDefWithoutScale": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "type": "object"
    },
    "FieldName": {
      "type": "string"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef<Type>,(string|null)>": {
      "additionalProperties": {
        "not": {}
      },
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef<Type>,number>": {
      "additionalProperties": {
        "not": {}
      },
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef<TypeForShape>,(string|null)>": {
      "additionalProperties": {
        "not": {}
      },
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/TypeForShape"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<ScaleDatumDef,(string|null)>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<ScaleDatumDef,number>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "type": "object"
    },
    "FilterParams": {
      "anyOf": [
        {
          "$ref": "#/definitions/ExprFilterParams"
        },
        {
          "$ref": "#/definitions/SelectionFilterParams"
        }
      ]
    },
    "FilterScoredLabelsParams": {
      "additionalProperties": false,
      "properties": {
        "asMidpoint": {
          "description": "Outputs the average of pos and pos2 as the midpoint of the element. This is useful for elements that have a width, such as transcripts. The midpoint is clamped to the visible region of the element.",
          "type": "string"
        },
        "channel": {
          "description": "**Default:** `\"x\"`",
          "enum": [
            "x",
            "y"
          ],
          "type": "string"
        },
        "lane": {
          "$ref": "#/definitions/Field",
          "description": "An optional field representing element's lane, e.g., if transcripts are shown using a piled up layout. Each line is processed separately."
        },
        "padding": {
          "description": "Padding (in pixels) around the element.\n\n**Default:** `0`",
          "type": "number"
        },
        "pos": {
          "$ref": "#/definitions/Field",
          "description": "The field representing element's start position on the domain."
        },
        "pos2": {
          "$ref": "#/definitions/Field",
          "description": "The field representing element's end position on the domain. If not specified, the `pos` field is used."
        },
        "score": {
          "$ref": "#/definitions/Field",
          "description": "The field representing the score used for prioritization."
        },
        "type": {
          "const": "filterScoredLabels",
          "description": "The type of the transform to be applied",
          "type": "string"
        },
        "width": {
          "$ref": "#/definitions/Field",
          "description": "The field representing element's width in pixels."
        }
      },
      "required": [
        "pos",
        "score",
        "type",
        "width"
      ],
      "type": "object"
    },
    "FlattenCompressedExonsParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "Field names for the flattened exons.\n\n**Default:** `[\"exonStart\", \"exonEnd\"]`",
          "items": {
            "type": "string"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "exons": {
          "$ref": "#/definitions/Field",
          "description": "The field containing the exons.\n\n**Default:** `\"exons\"`"
        },
        "start": {
          "$ref": "#/definitions/Field",
          "description": "Start coordinate of the gene body.\n\n**Default:** `\"start\"`"
        },
        "type": {
          "const": "flattenCompressedExons",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FlattenDelimitedParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            }
          ],
          "description": "The output field name(s) for the flattened field.\n\n**Default:** the input fields."
        },
        "field": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/definitions/Field"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/Field"
            }
          ],
          "description": "The field(s) to split and flatten"
        },
        "separator": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            }
          ],
          "description": "Separator(s) used on the field(s) TODO: Rename to delimiter"
        },
        "type": {
          "const": "flattenDelimited",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "field",
        "separator",
        "type"
      ],
      "type": "object"
    },
    "FlattenParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            }
          ],
          "description": "The output field name(s) for the flattened field.\n\n**Default:** the input fields."
        },
        "fields": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/definitions/Field"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/Field"
            }
          ],
          "description": "The field(s) to flatten. If no field is defined, the data object itself is treated as an array to be flattened."
        },
        "index": {
          "description": "The output field name for the zero-based index of the array values. If unspecified, an index field is not added.",
          "type": "string"
        },
        "type": {
          "const": "flatten",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FlattenSequenceParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "Name of the fields where the zero-based index number and flattened sequence letter are written to.\n\n**Default:** `[\"pos\", \"sequence\"]`",
          "items": {
            "type": "string"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "The field to flatten.\n\n**Default:** `\"sequence\"`"
        },
        "type": {
          "const": "flattenSequence",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "FontStyle": {
      "enum": [
        "normal",
        "italic"
      ],
      "type": "string"
    },
    "FontWeight": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "const": "thin",
          "type": "string"
        },
        {
          "const": "light",
          "type": "string"
        },
        {
          "const": "regular",
          "type": "string"
        },
        {
          "const": "normal",
          "type": "string"
        },
        {
          "const": "medium",
          "type": "string"
        },
        {
          "const": "bold",
          "type": "string"
        },
        {
          "const": "black",
          "type": "string"
        }
      ]
    },
    "FormulaParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The (new) field where the computed value is written to",
          "type": "string"
        },
        "expr": {
          "description": "An expression string",
          "type": "string"
        },
        "type": {
          "const": "formula",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "as",
        "expr",
        "type"
      ],
      "type": "object"
    },
    "Generator": {
      "$ref": "#/definitions/SequenceGenerator"
    },
    "GenomeAxis": {
      "additionalProperties": false,
      "properties": {
        "chromGrid": {
          "description": "A boolean flag indicating if chromosome grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "chromGridCap": {
          "description": "The stroke cap for the chromosome grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "chromGridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "chromGridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed chromosome grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromGridDashOffset": {
          "description": "The pixel offset at which to start drawing with the chromosome grid mark dash array.",
          "type": "number"
        },
        "chromGridFillEven": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridFillOdd": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridOpacity": {
          "description": "The opacity of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromGridWidth": {
          "description": "Width of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromLabelAlign": {
          "$ref": "#/definitions/Align"
        },
        "chromLabelColor": {
          "type": "string"
        },
        "chromLabelFont": {
          "type": "string"
        },
        "chromLabelFontSize": {
          "type": "number"
        },
        "chromLabelFontStyle": {
          "$ref": "#/definitions/FontStyle"
        },
        "chromLabelFontWeight": {
          "$ref": "#/definitions/FontWeight"
        },
        "chromLabelPadding": {
          "type": "number"
        },
        "chromLabels": {
          "type": "boolean"
        },
        "chromTickColor": {
          "type": "string"
        },
        "chromTickDash": {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromTickDashOffset": {
          "type": "number"
        },
        "chromTickSize": {
          "type": "number"
        },
        "chromTickWidth": {
          "type": "number"
        },
        "chromTicks": {
          "type": "boolean"
        },
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "domainColor": {
          "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`.",
          "type": "string"
        },
        "domainDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "domainDashOffset": {
          "description": "The pixel offset at which to start drawing with the domain dash array.",
          "type": "number"
        },
        "domainWidth": {
          "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
          "type": "number"
        },
        "format": {
          "description": "The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.",
          "type": "string"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "gridCap": {
          "description": "The stroke cap for the grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "gridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "gridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "gridDashOffset": {
          "description": "The pixel offset at which to start drawing with the grid mark dash array.",
          "type": "number"
        },
        "gridOpacity": {
          "description": "The opacity of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "gridWidth": {
          "description": "Width of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "labelAlign": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
        },
        "labelAngle": {
          "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`."
        },
        "labelColor": {
          "description": "The color of the tick label, can be in hex color code or regular color name.",
          "type": "string"
        },
        "labelFont": {
          "description": "The font of the tick label.",
          "type": "string"
        },
        "labelFontSize": {
          "description": "The font size of the label, in pixels.",
          "minimum": 0,
          "type": "number"
        },
        "labelFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "labelFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of axis tick labels."
        },
        "labelLimit": {
          "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
          "type": "number"
        },
        "labelPadding": {
          "description": "The padding, in pixels, between axis and text labels.\n\n__Default value:__ `2`",
          "type": "number"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "maxExtent": {
          "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
          "type": "number"
        },
        "minExtent": {
          "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
          "type": "number"
        },
        "offset": {
          "description": "The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.",
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/AxisOrient",
          "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tickCap": {
          "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "tickColor": {
          "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`",
          "type": "string"
        },
        "tickCount": {
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of `2`, `5`, `10`) and lie within the underlying scale's range.",
          "minimum": 0,
          "type": "number"
        },
        "tickDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "tickDashOffset": {
          "description": "The pixel offset at which to start drawing with the tick mark dash array.",
          "type": "number"
        },
        "tickMinStep": {
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.",
          "type": "number"
        },
        "tickSize": {
          "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "tickWidth": {
          "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "description": "A title for the axis (none by default). Set to `null` to remove it.",
          "type": [
            "string",
            "null"
          ]
        },
        "titleColor": {
          "description": "Color of the title, can be in hex color code or regular color name.",
          "type": "string"
        },
        "titleFont": {
          "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
          "type": "string"
        },
        "titleFontSize": {
          "description": "Font size of the title.",
          "minimum": 0,
          "type": "number"
        },
        "titleFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "titleFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleOpacity": {
          "description": "Opacity of the axis title.",
          "type": "number"
        },
        "titlePadding": {
          "description": "The padding, in pixels, between title and axis.",
          "type": "number"
        },
        "values": {
          "description": "Explicitly set the visible axis tick and label values.",
          "items": {},
          "type": "array"
        },
        "zindex": {
          "description": "Z-order of the axis relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`, or `10` when the view content is clipped or scrollable.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "GenomeConfig": {
      "anyOf": [
        {
          "$ref": "#/definitions/UrlGenomeConfig"
        },
        {
          "$ref": "#/definitions/InlineGenomeConfig"
        },
        {
          "$ref": "#/definitions/GenomeConfigBase"
        }
      ],
      "deprecated": "Use root `genomes` and `assembly` instead of root `genome`."
    },
    "GenomeConfigBase": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "Name of the genome assembly, e.g., `hg19` or `hg38`.",
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "GenomeDefinition": {
      "anyOf": [
        {
          "$ref": "#/definitions/UrlGenomeDefinition"
        },
        {
          "$ref": "#/definitions/InlineGenomeDefinition"
        }
      ],
      "description": "Genome definition for contexts where the name is provided externally (for example, as a key in root `genomes`) or not needed (for example, inline `scale.assembly`)."
    },
    "GenomeSpyConfig": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults shared by all axes."
        },
        "axisBottom": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for bottom-oriented axes."
        },
        "axisIndex": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for axes that visualize GenomeSpy `index` scales."
        },
        "axisLeft": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for left-oriented axes."
        },
        "axisLocus": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for axes that visualize GenomeSpy `locus` scales."
        },
        "axisNominal": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for axes that visualize nominal data."
        },
        "axisOrdinal": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for axes that visualize ordinal data."
        },
        "axisQuantitative": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for axes that visualize quantitative data."
        },
        "axisRight": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for right-oriented axes."
        },
        "axisTop": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for top-oriented axes."
        },
        "axisX": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for x axes."
        },
        "axisY": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Defaults for y axes."
        },
        "link": {
          "$ref": "#/definitions/LinkConfig",
          "description": "Defaults for link marks."
        },
        "mark": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Defaults shared by all mark types."
        },
        "point": {
          "$ref": "#/definitions/PointConfig",
          "description": "Defaults for point marks."
        },
        "range": {
          "$ref": "#/definitions/RangeConfig",
          "description": "Named reusable ranges for channels such as `shape`, `size`, and color."
        },
        "rect": {
          "$ref": "#/definitions/RectConfig",
          "description": "Defaults for rect marks."
        },
        "rule": {
          "$ref": "#/definitions/RuleConfig",
          "description": "Defaults for rule marks."
        },
        "scale": {
          "$ref": "#/definitions/ScaleConfig",
          "description": "Defaults for scale behavior and scale-type-specific buckets."
        },
        "style": {
          "additionalProperties": {
            "$ref": "#/definitions/StyleConfig"
          },
          "description": "Named reusable style buckets that marks, axes, titles, and views can reference through their `style` properties.",
          "type": "object"
        },
        "text": {
          "$ref": "#/definitions/TextConfig",
          "description": "Defaults for text marks."
        },
        "tick": {
          "$ref": "#/definitions/TickConfig",
          "description": "Defaults for tick marks."
        },
        "title": {
          "$ref": "#/definitions/TitleConfig",
          "description": "Defaults for view titles."
        },
        "view": {
          "$ref": "#/definitions/ViewConfig",
          "description": "Defaults for view background styling, including fill, stroke, shadow, and z-order properties."
        }
      },
      "type": "object"
    },
    "Gff3Data": {
      "additionalProperties": false,
      "properties": {
        "addChrPrefix": {
          "description": "Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\n\n__Default value:__ `false`",
          "type": [
            "boolean",
            "string"
          ]
        },
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "indexUrl": {
          "description": "Url of the tabix index file.\n\n__Default value:__ `url` + `\".tbi\"`.",
          "type": "string"
        },
        "type": {
          "const": "gff3",
          "type": "string"
        },
        "url": {
          "description": "Url of the bgzip compressed file.",
          "type": "string"
        },
        "windowSize": {
          "description": "Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\n\n__Default value:__ `30000000`",
          "type": "number"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "HConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "hconcat": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/ViewSpec"
              },
              {
                "$ref": "#/definitions/ImportSpec"
              }
            ]
          },
          "type": "array"
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "separator": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/SeparatorProps"
            }
          ],
          "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
        },
        "spacing": {
          "description": "The gap between the views, in pixels.",
          "type": "number"
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "hconcat"
      ],
      "type": "object"
    },
    "HandledTooltip": {
      "additionalProperties": false,
      "properties": {
        "handler": {
          "type": "string"
        },
        "params": {
          "type": "object"
        }
      },
      "required": [
        "handler"
      ],
      "type": "object"
    },
    "IdentifierParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "**Default:** `\"_uniqueId\"`",
          "type": "string"
        },
        "type": {
          "const": "identifier",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ImportSpec": {
      "additionalProperties": false,
      "properties": {
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for the imported subtree at the import site.\n\nThis config is merged before the imported spec's own root-level `config`, so imported specs can remain self-contained and override import-site defaults where needed."
        },
        "import": {
          "anyOf": [
            {
              "$ref": "#/definitions/UrlImport"
            },
            {
              "$ref": "#/definitions/TemplateImport"
            }
          ],
          "description": "The method to import a specification."
        },
        "name": {
          "description": "The name given to the imported view. This property overrides the name specified in the imported specification and defines an import scope that is used for bookmarkable view visibility and parameter addressing.",
          "type": "string"
        },
        "params": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/definitions/Parameter"
              },
              "type": "array"
            },
            {
              "type": "object"
            }
          ],
          "description": "Dynamic variables that parameterize a visualization. Parameters defined here override the parameters defined in the imported specification."
        },
        "visible": {
          "description": "Overrides the visibility of the imported view.\n\nIf not specified, the imported specification's `visible` property is used.",
          "type": "boolean"
        }
      },
      "required": [
        "import"
      ],
      "type": "object"
    },
    "IndexedFastaData": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "indexUrl": {
          "description": "URL of the index file.\n\n__Default value:__ `url` + `\".fai\"`.",
          "type": "string"
        },
        "type": {
          "const": "indexedFasta",
          "type": "string"
        },
        "url": {
          "description": "URL of the fasta file.",
          "type": "string"
        },
        "windowSize": {
          "description": "Size of each chunk when fetching the fasta file. Data is only fetched when the length of the visible domain smaller than the window size.\n\n__Default value:__ `7000`",
          "type": "number"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "InlineData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "values": {
          "$ref": "#/definitions/InlineDataset",
          "description": "The full data set, included inline. This can be an array of objects or primitive values, an object, or a string. Arrays of primitive values are ingested as objects with a `data` property. Strings are parsed according to the specified format type."
        }
      },
      "required": [
        "values"
      ],
      "type": "object"
    },
    "InlineDataset": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "boolean"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "object"
          },
          "type": "array"
        },
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    },
    "InlineGenomeConfig": {
      "additionalProperties": false,
      "deprecated": "Use `GenomeDefinition` in root `genomes` entries and `scale.assembly`.",
      "properties": {
        "contigs": {
          "description": "An array of contigs/sequences in the genome assembly.",
          "items": {
            "$ref": "#/definitions/Contig"
          },
          "type": "array"
        },
        "name": {
          "description": "Name of the genome assembly, e.g., `hg19` or `hg38`.",
          "type": "string"
        }
      },
      "required": [
        "contigs",
        "name"
      ],
      "type": "object"
    },
    "InlineGenomeDefinition": {
      "additionalProperties": false,
      "properties": {
        "contigs": {
          "description": "An array of contigs/sequences in the genome assembly.",
          "items": {
            "$ref": "#/definitions/Contig"
          },
          "type": "array"
        }
      },
      "required": [
        "contigs"
      ],
      "type": "object"
    },
    "InlineLocusAssembly": {
      "$ref": "#/definitions/GenomeDefinition"
    },
    "InteractionEventType": {
      "enum": [
        "click",
        "dblclick",
        "mouseenter",
        "mouseleave",
        "mouseover",
        "mousedown",
        "wheel"
      ],
      "type": "string"
    },
    "IntervalSelectionConfig": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/DomEventType"
            },
            {
              "$ref": "#/definitions/EventConfig"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "A string or object that defines the events that should clear the selection.\n\n__Default value:__ `\"dblclick\"`"
        },
        "encodings": {
          "description": "An array of encoding channels that define the interval selection.",
          "items": {
            "$ref": "#/definitions/PrimaryPositionalChannel"
          },
          "type": "array"
        },
        "mark": {
          "$ref": "#/definitions/BrushConfig",
          "description": "Interval selections display a rectangle mark to show the selected range. Use the `mark` property to adjust the appearance of this rectangle."
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/DomEventType"
            },
            {
              "$ref": "#/definitions/EventConfig"
            },
            {
              "type": "string"
            }
          ],
          "description": "A string or object that defines the events to which the selection should listen.\n\n__Default value:__\n\n- point selections: `\"click\"`\n- interval selections:   - `\"mousedown[event.shiftKey]\"` when any brushed channel is zoomable   - `\"mousedown\"` otherwise"
        },
        "type": {
          "const": "interval",
          "description": "The selection type.\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`.",
          "type": "string"
        },
        "zoom": {
          "anyOf": [
            {
              "$ref": "#/definitions/DomEventType"
            },
            {
              "$ref": "#/definitions/EventConfig"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Controls whether an active interval selection can be resized by mouse wheel. The wheel interaction only applies when the cursor is over the interval.\n\nCan be:\n\n- `true` / `false`\n- event type string such as `\"wheel\"` or `\"wheel[event.altKey]\"`\n- an `EventConfig` object\n\nCurrently, only `\"wheel\"` events are supported.\n\n__Default value:__\n\n- `false` when any brushed channel uses a zoomable scale\n- `true` otherwise"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "JsonDataFormat": {
      "additionalProperties": false,
      "properties": {
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "property": {
          "description": "The JSON property containing the desired data. This parameter can be used when the loaded JSON file may have surrounding structure or meta-data. For example `\"property\": \"values.features\"` is equivalent to retrieving `json.values.features` from the loaded JSON object.",
          "type": "string"
        },
        "type": {
          "const": "json",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "KeyDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldDefWithoutScale"
        },
        {
          "items": {
            "$ref": "#/definitions/FieldDefWithoutScale"
          },
          "type": "array"
        }
      ]
    },
    "LayerSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "layer": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/LayerSpec"
              },
              {
                "$ref": "#/definitions/UnitSpec"
              },
              {
                "$ref": "#/definitions/MultiscaleSpec"
              },
              {
                "$ref": "#/definitions/ImportSpec"
              }
            ]
          },
          "type": "array"
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "opacity": {
          "$ref": "#/definitions/ViewOpacityDef",
          "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground"
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "layer"
      ],
      "type": "object"
    },
    "LazyData": {
      "additionalProperties": false,
      "properties": {
        "lazy": {
          "$ref": "#/definitions/LazyDataParams"
        }
      },
      "required": [
        "lazy"
      ],
      "type": "object"
    },
    "LazyDataParams": {
      "anyOf": [
        {
          "$ref": "#/definitions/AxisTicksData"
        },
        {
          "$ref": "#/definitions/AxisGenomeData"
        },
        {
          "$ref": "#/definitions/IndexedFastaData"
        },
        {
          "$ref": "#/definitions/BigWigData"
        },
        {
          "$ref": "#/definitions/BigBedData"
        },
        {
          "$ref": "#/definitions/BamData"
        },
        {
          "$ref": "#/definitions/Gff3Data"
        },
        {
          "$ref": "#/definitions/VcfData"
        }
      ]
    },
    "LinearizeGenomicCoordinateParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "The output field or fields for linearized coordinates."
        },
        "channel": {
          "description": "Get the genome assembly from the scale of the channel.\n\n**Default:** `\"x\"`",
          "enum": [
            "x",
            "y"
          ],
          "type": "string"
        },
        "chrom": {
          "$ref": "#/definitions/Field",
          "description": "The chromosome/contig field"
        },
        "offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            }
          ],
          "description": "An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\n\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\n\n**Default:** `0`"
        },
        "pos": {
          "anyOf": [
            {
              "$ref": "#/definitions/Field"
            },
            {
              "items": {
                "$ref": "#/definitions/Field"
              },
              "type": "array"
            }
          ],
          "description": "The field or fields that contain intra-chromosomal positions"
        },
        "type": {
          "const": "linearizeGenomicCoordinate",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "as",
        "chrom",
        "pos",
        "type"
      ],
      "type": "object"
    },
    "LinkConfig": {
      "additionalProperties": false,
      "properties": {
        "arcFadingDistance": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "maxItems": 2,
              "minItems": 2,
              "type": "array"
            },
            {
              "const": false,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The range of the `\"arc\"` shape's fading distance in pixels. This property allows for making the arc's opacity fade out as it extends away from the chord. The fading distance is interpolated from one to zero between the interval defined by this property. Both `false` and `[0, 0]` disable fading.\n\n**Default value:** `false`"
        },
        "arcHeightFactor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Scaling factor for the `\"arc`\" shape's height. The default value `1.0` produces roughly circular arcs.\n\n**Default value:** `1.0`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clampApex": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Whether the apex of the `\"dome\"` shape is clamped to the viewport edge. When over a half of the dome is located outside the viewport, clamping allows for more accurate reading of the value encoded by the apex' position.\n\n**Default value:** `false`"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "linkShape": {
          "anyOf": [
            {
              "const": "arc",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "line",
              "type": "string"
            },
            {
              "const": "dome",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The shape of the link path.\n\nThe `\"arc\"` shape draws a circular arc between the two points. The apex of the arc resides on the left side of the line that connects the two points. The `\"dome\"` shape draws a vertical or horizontal arc with a specific height. The primary positional channel determines the apex of the arc and the secondary determines the endpoint placement. The `\"diagonal\"` shape draws an \"S\"-shaped curve between the two points. The `\"line\"` shape draws a straight line between the two points. See an [example](#different-link-shapes-and-orientations) of the different shapes below.\n\n**Default value:** `\"arc\"`"
        },
        "maxChordLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of `\"arc\"` shape's chord in pixels. The chord is the line segment between the two points that define the arc. Limiting the chord length serves two purposes when zooming in close enough: 1) it prevents the arc from becoming a straight line and 2) it mitigates the limited precision of floating point numbers in arc rendering.\n\n**Default value:** `50000`"
        },
        "minArcHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of an `\"arc\"` shape. Makes very short links more clearly visible.\n\n**Default value:** `1.5`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minPickingSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\n\n**Default value:** `3.0` for `\"link\"` and `2.0` for `\"point\"`"
        },
        "noFadingOnPointSelection": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Disables fading of the link when an mark instance is subject to any point selection. As the fading distance is unavailable as a visual channel, this property allows for enhancing the visibility of the selected links.\n\n**Default value:** `true`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "orient": {
          "anyOf": [
            {
              "const": "vertical",
              "type": "string"
            },
            {
              "const": "horizontal",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The orientation of the link path. Either `\"vertical\"` or `\"horizontal\"`. Only applies to diagonal links.\n\n**Default value:** `\"vertical\"`"
        },
        "segments": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The number of segments in the bézier curve. Affects the rendering quality and performance. Use a higher value for a smoother curve.\n\n**Default value:** `101`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "LinkProps": {
      "additionalProperties": false,
      "properties": {
        "arcFadingDistance": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "maxItems": 2,
              "minItems": 2,
              "type": "array"
            },
            {
              "const": false,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The range of the `\"arc\"` shape's fading distance in pixels. This property allows for making the arc's opacity fade out as it extends away from the chord. The fading distance is interpolated from one to zero between the interval defined by this property. Both `false` and `[0, 0]` disable fading.\n\n**Default value:** `false`"
        },
        "arcHeightFactor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Scaling factor for the `\"arc`\" shape's height. The default value `1.0` produces roughly circular arcs.\n\n**Default value:** `1.0`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clampApex": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Whether the apex of the `\"dome\"` shape is clamped to the viewport edge. When over a half of the dome is located outside the viewport, clamping allows for more accurate reading of the value encoded by the apex' position.\n\n**Default value:** `false`"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "linkShape": {
          "anyOf": [
            {
              "const": "arc",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "line",
              "type": "string"
            },
            {
              "const": "dome",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The shape of the link path.\n\nThe `\"arc\"` shape draws a circular arc between the two points. The apex of the arc resides on the left side of the line that connects the two points. The `\"dome\"` shape draws a vertical or horizontal arc with a specific height. The primary positional channel determines the apex of the arc and the secondary determines the endpoint placement. The `\"diagonal\"` shape draws an \"S\"-shaped curve between the two points. The `\"line\"` shape draws a straight line between the two points. See an [example](#different-link-shapes-and-orientations) of the different shapes below.\n\n**Default value:** `\"arc\"`"
        },
        "maxChordLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of `\"arc\"` shape's chord in pixels. The chord is the line segment between the two points that define the arc. Limiting the chord length serves two purposes when zooming in close enough: 1) it prevents the arc from becoming a straight line and 2) it mitigates the limited precision of floating point numbers in arc rendering.\n\n**Default value:** `50000`"
        },
        "minArcHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of an `\"arc\"` shape. Makes very short links more clearly visible.\n\n**Default value:** `1.5`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minPickingSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\n\n**Default value:** `3.0` for `\"link\"` and `2.0` for `\"point\"`"
        },
        "noFadingOnPointSelection": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Disables fading of the link when an mark instance is subject to any point selection. As the fading distance is unavailable as a visual channel, this property allows for enhancing the visibility of the selected links.\n\n**Default value:** `true`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "orient": {
          "anyOf": [
            {
              "const": "vertical",
              "type": "string"
            },
            {
              "const": "horizontal",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The orientation of the link path. Either `\"vertical\"` or `\"horizontal\"`. Only applies to diagonal links.\n\n**Default value:** `\"vertical\"`"
        },
        "segments": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The number of segments in the bézier curve. Affects the rendering quality and performance. Use a higher value for a smoother curve.\n\n**Default value:** `101`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "link",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "MarkConfig": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "MarkPropDef<(string|null),TypeForShape>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CTypeForShape%3E%2C(string%7Cnull)%3E"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CScaleDatumDef%2C(string%7Cnull)%3E"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition%3C(string%7Cnull)%2CTypeForShape%3E"
        }
      ]
    },
    "MarkPropDef<(string|null)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2C(string%7Cnull)%3E"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CScaleDatumDef%2C(string%7Cnull)%3E"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition%3C(string%7Cnull)%2CType%3E"
        }
      ]
    },
    "MarkPropDef<number>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2Cnumber%3E"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition%3CScaleDatumDef%2Cnumber%3E"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition%3Cnumber%2CType%3E"
        }
      ]
    },
    "MarkPropExprDef": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "expr": {
          "description": "An expression. Properties of the data can be accessed through the `datum` object.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "expr",
        "type"
      ],
      "type": "object"
    },
    "MarkProps": {
      "anyOf": [
        {
          "$ref": "#/definitions/RectProps"
        },
        {
          "$ref": "#/definitions/TextProps"
        },
        {
          "$ref": "#/definitions/RuleProps"
        },
        {
          "$ref": "#/definitions/TickProps"
        },
        {
          "$ref": "#/definitions/LinkProps"
        },
        {
          "$ref": "#/definitions/PointProps"
        }
      ]
    },
    "MarkType": {
      "enum": [
        "rect",
        "point",
        "rule",
        "tick",
        "text",
        "link"
      ],
      "type": "string"
    },
    "MeasureTextParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field where the measured width is written.",
          "type": "string"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "The field that contains the text to be measured."
        },
        "font": {
          "description": "The font typeface. Uses the same asynchronously loaded SDF fonts as the `\"text\"` mark.\n\n**Default:** `\"Lato\"`",
          "type": "string"
        },
        "fontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font size in pixels."
        },
        "fontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "The font style. Valid values: `\"normal\"` and `\"italic\"`.\n\n**Default:** `\"normal\"`"
        },
        "fontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "The font weight. The following strings and numbers are valid values: `\"thin\"` (`100`), `\"light\"` (`300`), `\"regular\"` (`400`), `\"normal\"` (`400`), `\"medium\"` (`500`), `\"bold\"` (`700`), `\"black\"` (`900`)\n\n**Default:** `\"regular\"`"
        },
        "type": {
          "const": "measureText",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "as",
        "field",
        "fontSize",
        "type"
      ],
      "type": "object"
    },
    "MergeFacetsParams": {
      "additionalProperties": false,
      "properties": {
        "type": {
          "const": "mergeFacets",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "MultiscaleSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "multiscale": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/LayerSpec"
              },
              {
                "$ref": "#/definitions/UnitSpec"
              },
              {
                "$ref": "#/definitions/MultiscaleSpec"
              },
              {
                "$ref": "#/definitions/ImportSpec"
              }
            ]
          },
          "type": "array"
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "opacity": {
          "$ref": "#/definitions/ViewOpacityDef",
          "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "stops": {
          "$ref": "#/definitions/MultiscaleStopsDef",
          "description": "Stop definition that controls transitions between the multiscale levels.\n\n- `number[]` is shorthand for `{ metric: \"unitsPerPixel\", values: ... }`\n- `(number | ExprRef)[]` supports mixed constants and expressions\n- Object form allows configuring metric, channel, and fade."
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground"
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "multiscale",
        "stops"
      ],
      "type": "object"
    },
    "MultiscaleStops": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimaryPositionalChannel"
            },
            {
              "const": "auto",
              "type": "string"
            }
          ],
          "description": "Which positional channel controls the stop metric.\n\n- `\"auto\"` averages `x` and `y` when both are available.\n- `\"x\"` uses only the `x` channel.\n- `\"y\"` uses only the `y` channel.\n\n__Default value:__ `\"auto\"`"
        },
        "fade": {
          "description": "Relative transition width around each stop.\n\nFor each stop value `s`, the fade transition is evaluated in the range:\n\n- upper edge: `s * (1 + fade)`\n- lower edge: `s * (1 - fade)`\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "metric": {
          "const": "unitsPerPixel",
          "description": "The metric used to evaluate zoom stops.\n\n__Default value:__ `\"unitsPerPixel\"`",
          "type": "string"
        },
        "values": {
          "description": "Stop values in descending order.",
          "items": {
            "$ref": "#/definitions/NumericStopDef"
          },
          "type": "array"
        }
      },
      "required": [
        "values"
      ],
      "type": "object"
    },
    "MultiscaleStopsDef": {
      "anyOf": [
        {
          "items": {
            "$ref": "#/definitions/NumericStopDef"
          },
          "type": "array"
        },
        {
          "$ref": "#/definitions/MultiscaleStops"
        }
      ]
    },
    "NamedData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "NamedGenomeConfig": {
      "anyOf": [
        {
          "$ref": "#/definitions/GenomeDefinition"
        },
        {
          "additionalProperties": {
            "not": {}
          },
          "type": "object"
        }
      ]
    },
    "NumericDomain": {
      "items": {
        "type": "number"
      },
      "type": "array"
    },
    "NumericMarkPropDef": {
      "$ref": "#/definitions/MarkPropDef%3Cnumber%3E"
    },
    "NumericStopDef": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "$ref": "#/definitions/ExprRef"
        }
      ]
    },
    "NumericValueDef": {
      "$ref": "#/definitions/ValueDef%3Cnumber%3E"
    },
    "OtherDataFormat": {
      "additionalProperties": false,
      "description": "Other data format, such as `\"fasta\"`",
      "properties": {
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. Compression suffixes such as `.gz` are ignored during inference. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "PaddingConfig": {
      "anyOf": [
        {
          "$ref": "#/definitions/Paddings"
        },
        {
          "type": "number"
        }
      ]
    },
    "Paddings": {
      "additionalProperties": false,
      "properties": {
        "bottom": {
          "type": "number"
        },
        "left": {
          "type": "number"
        },
        "right": {
          "type": "number"
        },
        "top": {
          "type": "number"
        }
      },
      "type": "object"
    },
    "Parameter": {
      "anyOf": [
        {
          "$ref": "#/definitions/VariableParameter"
        },
        {
          "$ref": "#/definitions/SelectionParameter"
        }
      ]
    },
    "Parse": {
      "additionalProperties": {
        "$ref": "#/definitions/ParseValue"
      },
      "type": "object"
    },
    "ParseValue": {
      "type": [
        "string",
        "null"
      ]
    },
    "PileupParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field name for the computed lane.\n\n**Default:** `\"lane\"`.",
          "type": "string"
        },
        "end": {
          "$ref": "#/definitions/Field",
          "description": "The field representing the end coordinate of the segment (exclusive)."
        },
        "preference": {
          "$ref": "#/definitions/Field",
          "description": "An optional field indicating the preferred lane. Use together with the `preferredOrder` property."
        },
        "preferredOrder": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "boolean"
              },
              "type": "array"
            }
          ],
          "description": "The order of the lane preferences. The first element contains the value that should place the segment on the first lane and so forth. If the preferred lane is occupied, the first available lane is taken."
        },
        "spacing": {
          "description": "The spacing between adjacent segments on the same lane in coordinate units.\n\n**Default:** `1`.",
          "type": "number"
        },
        "start": {
          "$ref": "#/definitions/Field",
          "description": "The field representing the start coordinate of the segment (inclusive)."
        },
        "type": {
          "const": "pileup",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "end",
        "start",
        "type"
      ],
      "type": "object"
    },
    "PointConfig": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The rotation angle in degrees.\n\n**Default value:** `0`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "dx": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal offset in pixels.\n\n**Default value:** `0`"
        },
        "dy": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Vertical offset in pixels.\n\n**Default value:** `0`"
        },
        "fill": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color."
        },
        "fillGradientStrength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Gradient strength controls the amount of the gradient eye-candy effect in the fill color. Valid values are between `0` and `1`.\n\n**Default value:** `0`"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill opacity. Value between `0` and `1`."
        },
        "filled": {
          "description": "Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).",
          "type": "boolean"
        },
        "geometricZoomBound": {
          "description": "Enables geometric zooming. The value is the base two logarithmic zoom level where the maximum point size is reached.\n\n**Default value:** `0`",
          "type": "number"
        },
        "inwardStroke": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Should the stroke only grow inwards, e.g, the diameter/outline is not affected by the stroke width. Thus, a point that has a zero size has no visible stroke. This allows strokes to be used with geometric zoom, etc.\n\n**Default value:** `false`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minPickingSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\n\n**Default value:** `3.0` for `\"link\"` and `2.0` for `\"point\"`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "sampleFacetPadding": {
          "description": "Additional padding used by sample facets.\n\n**Default value:** `0.1`",
          "type": "number"
        },
        "semanticScore": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The semantic score used by semantic zooming in the point mark. This is primarily intended for internal use.\n\n**Default value:** `0`"
        },
        "semanticZoomFraction": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "TODO\n\n**Default value:** `0.02`"
        },
        "shape": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "One of `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, `\"triangle-left\"`, `\"tick-up\"`, `\"tick-down\"`, `\"tick-right\"`, or `\"tick-left\"`\n\n**Default value:** `\"circle\"`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "stroke": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color"
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke opacity. Value between `0` and `1`."
        },
        "strokeWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke width in pixels."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "PointProps": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The rotation angle in degrees.\n\n**Default value:** `0`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "dx": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal offset in pixels.\n\n**Default value:** `0`"
        },
        "dy": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Vertical offset in pixels.\n\n**Default value:** `0`"
        },
        "fill": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color."
        },
        "fillGradientStrength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Gradient strength controls the amount of the gradient eye-candy effect in the fill color. Valid values are between `0` and `1`.\n\n**Default value:** `0`"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill opacity. Value between `0` and `1`."
        },
        "filled": {
          "description": "Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).",
          "type": "boolean"
        },
        "geometricZoomBound": {
          "description": "Enables geometric zooming. The value is the base two logarithmic zoom level where the maximum point size is reached.\n\n**Default value:** `0`",
          "type": "number"
        },
        "inwardStroke": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Should the stroke only grow inwards, e.g, the diameter/outline is not affected by the stroke width. Thus, a point that has a zero size has no visible stroke. This allows strokes to be used with geometric zoom, etc.\n\n**Default value:** `false`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minPickingSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\n\n**Default value:** `3.0` for `\"link\"` and `2.0` for `\"point\"`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "sampleFacetPadding": {
          "description": "Additional padding used by sample facets.\n\n**Default value:** `0.1`",
          "type": "number"
        },
        "semanticScore": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The semantic score used by semantic zooming in the point mark. This is primarily intended for internal use.\n\n**Default value:** `0`"
        },
        "semanticZoomFraction": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "TODO\n\n**Default value:** `0.02`"
        },
        "shape": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "One of `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, `\"triangle-left\"`, `\"tick-up\"`, `\"tick-down\"`, `\"tick-right\"`, or `\"tick-left\"`\n\n**Default value:** `\"circle\"`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "stroke": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color"
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke opacity. Value between `0` and `1`."
        },
        "strokeWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke width in pixels."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "point",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "PointSelectionConfig": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/DomEventType"
            },
            {
              "$ref": "#/definitions/EventConfig"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "A string or object that defines the events that should clear the selection.\n\n__Default value:__ `\"dblclick\"`"
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/DomEventType"
            },
            {
              "$ref": "#/definitions/EventConfig"
            },
            {
              "type": "string"
            }
          ],
          "description": "A string or object that defines the events to which the selection should listen.\n\n__Default value:__\n\n- point selections: `\"click\"`\n- interval selections:   - `\"mousedown[event.shiftKey]\"` when any brushed channel is zoomable   - `\"mousedown\"` otherwise"
        },
        "toggle": {
          "description": "Controls whether data values should be toggled (inserted or removed from a point selection) when clicking with the shift key pressed.\n\n- `true` -- additional values can be selected by shift-clicking.\n- `false` -- only a single value can be selected at a time.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "type": {
          "const": "point",
          "description": "The selection type.\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`.",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "Position2Def": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "band": {
              "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "domainInert": {
              "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "field": {
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
              "type": "string"
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "type": "object"
        },
        {
          "$ref": "#/definitions/SecondaryChromPosDef"
        },
        {
          "additionalProperties": false,
          "properties": {
            "band": {
              "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scalar"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "domainInert": {
              "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "resolutionChannel": {
              "$ref": "#/definitions/ChannelWithScale",
              "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            },
            "type": {
              "$ref": "#/definitions/Type"
            }
          },
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "band": {
              "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "domainInert": {
              "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "expr": {
              "description": "An expression. Properties of the data can be accessed through the `datum` object.",
              "type": "string"
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            },
            "type": {
              "$ref": "#/definitions/Type"
            }
          },
          "required": [
            "expr"
          ],
          "type": "object"
        },
        {
          "$ref": "#/definitions/PositionValueDef"
        }
      ]
    },
    "PositionDatumDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/GenomeAxis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "PositionDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/PositionFieldDef"
        },
        {
          "$ref": "#/definitions/ChromPosDef"
        },
        {
          "$ref": "#/definitions/PositionDatumDef"
        },
        {
          "$ref": "#/definitions/PositionExprDef"
        },
        {
          "$ref": "#/definitions/PositionValueDef"
        }
      ]
    },
    "PositionExprDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/GenomeAxis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "expr": {
          "description": "An expression. Properties of the data can be accessed through the `datum` object.",
          "type": "string"
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "expr",
        "type"
      ],
      "type": "object"
    },
    "PositionFieldDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/GenomeAxis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "field": {
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "PositionValueDef": {
      "$ref": "#/definitions/NumericValueDef"
    },
    "PositionalChannel": {
      "anyOf": [
        {
          "$ref": "#/definitions/PrimaryPositionalChannel"
        },
        {
          "$ref": "#/definitions/SecondaryPositionalChannel"
        }
      ]
    },
    "PrimaryPositionalChannel": {
      "enum": [
        "x",
        "y"
      ],
      "type": "string"
    },
    "ProjectParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "New names for the projected fields. If omitted, the names of the source fields are used.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "fields": {
          "description": "The fields to be projected.",
          "items": {
            "$ref": "#/definitions/Field"
          },
          "type": "array"
        },
        "type": {
          "const": "project",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "fields",
        "type"
      ],
      "type": "object"
    },
    "RangeConfig": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "description": "Named range for `angle` channels.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "diverging": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Named range for diverging color encodings."
        },
        "heatmap": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Named range for quantitative rect-like color encodings such as heatmaps."
        },
        "ramp": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Named range for quantitative ramp color encodings."
        },
        "shape": {
          "description": "Named range for `shape` channels.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "size": {
          "description": "Named range for `size` channels.",
          "items": {
            "type": "number"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "RectConfig": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the rounded corners.\n\n**Default value:** `0`"
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "fill": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color."
        },
        "fillOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill opacity. Value between `0` and `1`."
        },
        "filled": {
          "description": "Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).",
          "type": "boolean"
        },
        "hatch": {
          "anyOf": [
            {
              "const": "none",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "antiDiagonal",
              "type": "string"
            },
            {
              "const": "cross",
              "type": "string"
            },
            {
              "const": "vertical",
              "type": "string"
            },
            {
              "const": "horizontal",
              "type": "string"
            },
            {
              "const": "grid",
              "type": "string"
            },
            {
              "const": "dots",
              "type": "string"
            },
            {
              "const": "rings",
              "type": "string"
            },
            {
              "const": "ringsLarge",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A hatch pattern drawn inside the mark using the stroke width, color, and opacity. The pattern is aligned in screen space and scaled by the stroke width.\n\n**Default value:** `\"none\"`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of a rectangle in pixels. The property clamps rectangles' heights.\n\n**Default value:** `0`"
        },
        "minOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Clamps the minimum size-dependent opacity. The property does not affect the `opacity` channel. Valid values are between `0` and `1`.\n\nWhen a rectangle would be smaller than what is specified in `minHeight` and `minWidth`, it is faded out proportionally. Example: a rectangle would be rendered as one pixel wide, but `minWidth` clamps it to five pixels. The rectangle is actually rendered as five pixels wide, but its opacity is multiplied by 0.2. With this setting, you can limit the factor to, for example, 0.5 to keep the rectangles more clearly visible.\n\n**Default value:** `0`"
        },
        "minWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum width of a rectangle in pixels. The property clamps rectangles' widths when the viewport is zoomed out.\n\nThis property also reduces flickering of very narrow rectangles when zooming. The value should generally be at least one.\n\n**Default value:** `1`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "stroke": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color"
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke opacity. Value between `0` and `1`."
        },
        "strokeWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke width in pixels."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "RectProps": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the rounded corners.\n\n**Default value:** `0`"
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "fill": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color."
        },
        "fillOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill opacity. Value between `0` and `1`."
        },
        "filled": {
          "description": "Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).",
          "type": "boolean"
        },
        "hatch": {
          "anyOf": [
            {
              "const": "none",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "antiDiagonal",
              "type": "string"
            },
            {
              "const": "cross",
              "type": "string"
            },
            {
              "const": "vertical",
              "type": "string"
            },
            {
              "const": "horizontal",
              "type": "string"
            },
            {
              "const": "grid",
              "type": "string"
            },
            {
              "const": "dots",
              "type": "string"
            },
            {
              "const": "rings",
              "type": "string"
            },
            {
              "const": "ringsLarge",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A hatch pattern drawn inside the mark using the stroke width, color, and opacity. The pattern is aligned in screen space and scaled by the stroke width.\n\n**Default value:** `\"none\"`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of a rectangle in pixels. The property clamps rectangles' heights.\n\n**Default value:** `0`"
        },
        "minOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Clamps the minimum size-dependent opacity. The property does not affect the `opacity` channel. Valid values are between `0` and `1`.\n\nWhen a rectangle would be smaller than what is specified in `minHeight` and `minWidth`, it is faded out proportionally. Example: a rectangle would be rendered as one pixel wide, but `minWidth` clamps it to five pixels. The rectangle is actually rendered as five pixels wide, but its opacity is multiplied by 0.2. With this setting, you can limit the factor to, for example, 0.5 to keep the rectangles more clearly visible.\n\n**Default value:** `0`"
        },
        "minWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum width of a rectangle in pixels. The property clamps rectangles' widths when the viewport is zoomed out.\n\nThis property also reduces flickering of very narrow rectangles when zooming. The value should generally be at least one.\n\n**Default value:** `1`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "stroke": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color"
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke opacity. Value between `0` and `1`."
        },
        "strokeWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke width in pixels."
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "rect",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "RegexExtractParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "The new field or an array of fields where the extracted values are written."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "The source field"
        },
        "regex": {
          "description": "A valid JavaScript regular expression with at least one group. For example: `\"^Sample(\\\\d+)$\"`.\n\nRead more at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions",
          "type": "string"
        },
        "skipInvalidInput": {
          "description": "Do not complain about invalid input. Just skip it and leave the new fields undefined on the affected datum.\n\n**Default:** `false`",
          "type": "boolean"
        },
        "type": {
          "const": "regexExtract",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "as",
        "field",
        "regex",
        "type"
      ],
      "type": "object"
    },
    "RegexFoldParams": {
      "additionalProperties": false,
      "properties": {
        "asKey": {
          "description": "**Default:** `\"sample\"`",
          "type": "string"
        },
        "asValue": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            }
          ],
          "description": "A new column name for the extracted values."
        },
        "columnRegex": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            }
          ],
          "description": "A regular expression that matches to column names. The regex must have one capturing group that is used for extracting the key (e.g., a sample id) from the column name."
        },
        "skipRegex": {
          "description": "An optional regex that matches to fields that should not be included in the new folded data objects.",
          "type": "string"
        },
        "type": {
          "const": "regexFold",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "asValue",
        "columnRegex",
        "type"
      ],
      "type": "object"
    },
    "ResolutionBehavior": {
      "description": "`\"independent\"` and `\"shared\"` behave similarly to Vega-Lite. `\"excluded\"` behaves like `\"shared\"`, but is not pulled towards the root. `\"forced\"` behaves like `\"shared\"`, but is forced towards the root even if the parent has `\"independent\"` behavior.",
      "enum": [
        "independent",
        "shared",
        "excluded",
        "forced"
      ],
      "type": "string"
    },
    "RuleConfig": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "RuleProps": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "rule",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "SampleParams": {
      "additionalProperties": false,
      "properties": {
        "size": {
          "description": "The maximum sample size.\n\n**Default:** `500`",
          "type": "number"
        },
        "type": {
          "const": "sample",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "Scalar": {
      "type": [
        "string",
        "number",
        "boolean"
      ]
    },
    "ScalarDomain": {
      "anyOf": [
        {
          "$ref": "#/definitions/NumericDomain"
        },
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "boolean"
          },
          "type": "array"
        }
      ]
    },
    "Scale": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "assembly": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/InlineLocusAssembly"
            }
          ],
          "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
        },
        "base": {
          "description": "The logarithm base of the `log` scale (default `10`).",
          "type": "number"
        },
        "bins": {
          "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "clamp": {
          "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
          "type": "boolean"
        },
        "constant": {
          "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "domain": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScalarDomain"
            },
            {
              "$ref": "#/definitions/ComplexDomain"
            },
            {
              "$ref": "#/definitions/SelectionDomainRef"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
        },
        "domainMax": {
          "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
          "type": "number"
        },
        "domainMid": {
          "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
          "type": "number"
        },
        "domainMin": {
          "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
          "type": "number"
        },
        "domainTransition": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "additionalProperties": {},
              "type": "object"
            }
          ],
          "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
        },
        "exponent": {
          "description": "The exponent of the `pow` scale.",
          "type": "number"
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScaleInterpolate"
            },
            {
              "$ref": "#/definitions/ScaleInterpolateParams"
            }
          ],
          "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
        },
        "name": {
          "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
          "type": "string"
        },
        "nice": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "number"
            },
            {
              "additionalProperties": false,
              "properties": {
                "interval": {
                  "type": "string"
                },
                "step": {
                  "type": "number"
                }
              },
              "required": [
                "interval",
                "step"
              ],
              "type": "object"
            }
          ],
          "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
        },
        "numberingOffset": {
          "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
          "type": "number"
        },
        "padding": {
          "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
          "minimum": 0,
          "type": "number"
        },
        "paddingInner": {
          "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "paddingOuter": {
          "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "range": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            },
            {
              "items": {
                "$ref": "#/definitions/ExprRef"
              },
              "type": "array"
            }
          ],
          "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
        },
        "reverse": {
          "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
          "type": "boolean"
        },
        "round": {
          "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
          "type": "boolean"
        },
        "scheme": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/SchemeParams"
            }
          ],
          "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
        },
        "type": {
          "$ref": "#/definitions/ScaleType",
          "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
        },
        "zero": {
          "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
          "type": "boolean"
        },
        "zoom": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ZoomParams"
            }
          ],
          "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
        }
      },
      "type": "object"
    },
    "ScaleConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "assembly": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/InlineLocusAssembly"
            }
          ],
          "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
        },
        "base": {
          "description": "The logarithm base of the `log` scale (default `10`).",
          "type": "number"
        },
        "bins": {
          "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "clamp": {
          "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
          "type": "boolean"
        },
        "constant": {
          "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "domain": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScalarDomain"
            },
            {
              "$ref": "#/definitions/ComplexDomain"
            },
            {
              "$ref": "#/definitions/SelectionDomainRef"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
        },
        "domainMax": {
          "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
          "type": "number"
        },
        "domainMid": {
          "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
          "type": "number"
        },
        "domainMin": {
          "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
          "type": "number"
        },
        "domainTransition": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "additionalProperties": {},
              "type": "object"
            }
          ],
          "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
        },
        "exponent": {
          "description": "The exponent of the `pow` scale.",
          "type": "number"
        },
        "index": {
          "additionalProperties": false,
          "description": "Defaults for GenomeSpy's `index` scales.",
          "properties": {
            "align": {
              "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            "assembly": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/InlineLocusAssembly"
                }
              ],
              "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
            },
            "base": {
              "description": "The logarithm base of the `log` scale (default `10`).",
              "type": "number"
            },
            "bins": {
              "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "clamp": {
              "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
              "type": "boolean"
            },
            "constant": {
              "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
              "type": "number"
            },
            "domain": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScalarDomain"
                },
                {
                  "$ref": "#/definitions/ComplexDomain"
                },
                {
                  "$ref": "#/definitions/SelectionDomainRef"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
            },
            "domainMax": {
              "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainMid": {
              "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
              "type": "number"
            },
            "domainMin": {
              "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainTransition": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "additionalProperties": {},
                  "type": "object"
                }
              ],
              "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
            },
            "exponent": {
              "description": "The exponent of the `pow` scale.",
              "type": "number"
            },
            "interpolate": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScaleInterpolate"
                },
                {
                  "$ref": "#/definitions/ScaleInterpolateParams"
                }
              ],
              "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
            },
            "name": {
              "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
              "type": "string"
            },
            "nice": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "interval": {
                      "type": "string"
                    },
                    "step": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "interval",
                    "step"
                  ],
                  "type": "object"
                }
              ],
              "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
            },
            "numberingOffset": {
              "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
              "type": "number"
            },
            "padding": {
              "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
              "minimum": 0,
              "type": "number"
            },
            "paddingInner": {
              "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "paddingOuter": {
              "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "range": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "string"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ExprRef"
                  },
                  "type": "array"
                }
              ],
              "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
            },
            "reverse": {
              "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "round": {
              "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/SchemeParams"
                }
              ],
              "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
            },
            "type": {
              "$ref": "#/definitions/ScaleType",
              "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
            },
            "zero": {
              "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
              "type": "boolean"
            },
            "zoom": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/ZoomParams"
                }
              ],
              "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
            }
          },
          "type": "object"
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScaleInterpolate"
            },
            {
              "$ref": "#/definitions/ScaleInterpolateParams"
            }
          ],
          "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
        },
        "locus": {
          "additionalProperties": false,
          "description": "Defaults for GenomeSpy's `locus` scales.",
          "properties": {
            "align": {
              "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            "assembly": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/InlineLocusAssembly"
                }
              ],
              "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
            },
            "base": {
              "description": "The logarithm base of the `log` scale (default `10`).",
              "type": "number"
            },
            "bins": {
              "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "clamp": {
              "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
              "type": "boolean"
            },
            "constant": {
              "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
              "type": "number"
            },
            "domain": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScalarDomain"
                },
                {
                  "$ref": "#/definitions/ComplexDomain"
                },
                {
                  "$ref": "#/definitions/SelectionDomainRef"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
            },
            "domainMax": {
              "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainMid": {
              "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
              "type": "number"
            },
            "domainMin": {
              "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainTransition": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "additionalProperties": {},
                  "type": "object"
                }
              ],
              "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
            },
            "exponent": {
              "description": "The exponent of the `pow` scale.",
              "type": "number"
            },
            "interpolate": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScaleInterpolate"
                },
                {
                  "$ref": "#/definitions/ScaleInterpolateParams"
                }
              ],
              "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
            },
            "name": {
              "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
              "type": "string"
            },
            "nice": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "interval": {
                      "type": "string"
                    },
                    "step": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "interval",
                    "step"
                  ],
                  "type": "object"
                }
              ],
              "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
            },
            "numberingOffset": {
              "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
              "type": "number"
            },
            "padding": {
              "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
              "minimum": 0,
              "type": "number"
            },
            "paddingInner": {
              "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "paddingOuter": {
              "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "range": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "string"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ExprRef"
                  },
                  "type": "array"
                }
              ],
              "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
            },
            "reverse": {
              "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "round": {
              "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/SchemeParams"
                }
              ],
              "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
            },
            "type": {
              "$ref": "#/definitions/ScaleType",
              "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
            },
            "zero": {
              "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
              "type": "boolean"
            },
            "zoom": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/ZoomParams"
                }
              ],
              "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
            }
          },
          "type": "object"
        },
        "name": {
          "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
          "type": "string"
        },
        "nice": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "number"
            },
            {
              "additionalProperties": false,
              "properties": {
                "interval": {
                  "type": "string"
                },
                "step": {
                  "type": "number"
                }
              },
              "required": [
                "interval",
                "step"
              ],
              "type": "object"
            }
          ],
          "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
        },
        "nominal": {
          "additionalProperties": false,
          "description": "Defaults for nominal scales.",
          "properties": {
            "align": {
              "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            "assembly": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/InlineLocusAssembly"
                }
              ],
              "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
            },
            "base": {
              "description": "The logarithm base of the `log` scale (default `10`).",
              "type": "number"
            },
            "bins": {
              "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "clamp": {
              "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
              "type": "boolean"
            },
            "constant": {
              "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
              "type": "number"
            },
            "domain": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScalarDomain"
                },
                {
                  "$ref": "#/definitions/ComplexDomain"
                },
                {
                  "$ref": "#/definitions/SelectionDomainRef"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
            },
            "domainMax": {
              "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainMid": {
              "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
              "type": "number"
            },
            "domainMin": {
              "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainTransition": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "additionalProperties": {},
                  "type": "object"
                }
              ],
              "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
            },
            "exponent": {
              "description": "The exponent of the `pow` scale.",
              "type": "number"
            },
            "interpolate": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScaleInterpolate"
                },
                {
                  "$ref": "#/definitions/ScaleInterpolateParams"
                }
              ],
              "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
            },
            "name": {
              "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
              "type": "string"
            },
            "nice": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "interval": {
                      "type": "string"
                    },
                    "step": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "interval",
                    "step"
                  ],
                  "type": "object"
                }
              ],
              "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
            },
            "numberingOffset": {
              "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
              "type": "number"
            },
            "padding": {
              "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
              "minimum": 0,
              "type": "number"
            },
            "paddingInner": {
              "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "paddingOuter": {
              "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "range": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "string"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ExprRef"
                  },
                  "type": "array"
                }
              ],
              "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
            },
            "reverse": {
              "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "round": {
              "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/SchemeParams"
                }
              ],
              "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
            },
            "type": {
              "$ref": "#/definitions/ScaleType",
              "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
            },
            "zero": {
              "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
              "type": "boolean"
            },
            "zoom": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/ZoomParams"
                }
              ],
              "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
            }
          },
          "type": "object"
        },
        "nominalColorScheme": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Default color scheme for nominal color scales."
        },
        "numberingOffset": {
          "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
          "type": "number"
        },
        "ordinal": {
          "additionalProperties": false,
          "description": "Defaults for ordinal scales.",
          "properties": {
            "align": {
              "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            "assembly": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/InlineLocusAssembly"
                }
              ],
              "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
            },
            "base": {
              "description": "The logarithm base of the `log` scale (default `10`).",
              "type": "number"
            },
            "bins": {
              "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "clamp": {
              "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
              "type": "boolean"
            },
            "constant": {
              "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
              "type": "number"
            },
            "domain": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScalarDomain"
                },
                {
                  "$ref": "#/definitions/ComplexDomain"
                },
                {
                  "$ref": "#/definitions/SelectionDomainRef"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
            },
            "domainMax": {
              "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainMid": {
              "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
              "type": "number"
            },
            "domainMin": {
              "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainTransition": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "additionalProperties": {},
                  "type": "object"
                }
              ],
              "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
            },
            "exponent": {
              "description": "The exponent of the `pow` scale.",
              "type": "number"
            },
            "interpolate": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScaleInterpolate"
                },
                {
                  "$ref": "#/definitions/ScaleInterpolateParams"
                }
              ],
              "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
            },
            "name": {
              "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
              "type": "string"
            },
            "nice": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "interval": {
                      "type": "string"
                    },
                    "step": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "interval",
                    "step"
                  ],
                  "type": "object"
                }
              ],
              "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
            },
            "numberingOffset": {
              "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
              "type": "number"
            },
            "padding": {
              "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
              "minimum": 0,
              "type": "number"
            },
            "paddingInner": {
              "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "paddingOuter": {
              "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "range": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "string"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ExprRef"
                  },
                  "type": "array"
                }
              ],
              "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
            },
            "reverse": {
              "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "round": {
              "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/SchemeParams"
                }
              ],
              "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
            },
            "type": {
              "$ref": "#/definitions/ScaleType",
              "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
            },
            "zero": {
              "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
              "type": "boolean"
            },
            "zoom": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/ZoomParams"
                }
              ],
              "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
            }
          },
          "type": "object"
        },
        "ordinalColorScheme": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Default color scheme for ordinal color scales."
        },
        "padding": {
          "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
          "minimum": 0,
          "type": "number"
        },
        "paddingInner": {
          "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "paddingOuter": {
          "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "quantitative": {
          "additionalProperties": false,
          "description": "Defaults for quantitative scales.",
          "properties": {
            "align": {
              "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            "assembly": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/InlineLocusAssembly"
                }
              ],
              "description": "Genome assembly definition for locus scales.\n\nThis can be:\n\n- A string reference to a named assembly (built-in or root-configured).\n- An inline anonymous assembly that defines either `contigs` or `url`.\n\nIf undefined, the default genome from the genome store is used."
            },
            "base": {
              "description": "The logarithm base of the `log` scale (default `10`).",
              "type": "number"
            },
            "bins": {
              "description": "An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "clamp": {
              "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default).",
              "type": "boolean"
            },
            "constant": {
              "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`",
              "type": "number"
            },
            "domain": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScalarDomain"
                },
                {
                  "$ref": "#/definitions/ComplexDomain"
                },
                {
                  "$ref": "#/definitions/SelectionDomainRef"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values.  [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."
            },
            "domainMax": {
              "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainMid": {
              "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.",
              "type": "number"
            },
            "domainMin": {
              "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.",
              "type": "number"
            },
            "domainTransition": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "additionalProperties": {},
                  "type": "object"
                }
              ],
              "description": "Controls whether domain updates are applied immediately or with a smooth transition.\n\nSet this to `false` to apply domain updates immediately. The default is `true`, except for domains defined by an `ExprRef`, which default to `false` unless overridden.\n\n__Default value:__ `true`, except `false` for ExprRef-driven domains."
            },
            "exponent": {
              "description": "The exponent of the `pow` scale.",
              "type": "number"
            },
            "interpolate": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ScaleInterpolate"
                },
                {
                  "$ref": "#/definitions/ScaleInterpolateParams"
                }
              ],
              "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n__Default value:__ `hcl`"
            },
            "name": {
              "description": "The name of the scale. Names are optional but allow the scales to be referenced and found with the API.",
              "type": "string"
            },
            "nice": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "interval": {
                      "type": "string"
                    },
                    "step": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "interval",
                    "step"
                  ],
                  "type": "object"
                }
              ],
              "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."
            },
            "numberingOffset": {
              "description": "The numbering offset used when formatting tick labels on index and locus scales.\n\n__Default value:__ `0`",
              "type": "number"
            },
            "padding": {
              "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`.  By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
              "minimum": 0,
              "type": "number"
            },
            "paddingInner": {
              "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "paddingOuter": {
              "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "range": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "string"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ExprRef"
                  },
                  "type": "array"
                }
              ],
              "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
            },
            "reverse": {
              "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "round": {
              "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
              "type": "boolean"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/SchemeParams"
                }
              ],
              "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
            },
            "type": {
              "$ref": "#/definitions/ScaleType",
              "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
            },
            "zero": {
              "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
              "type": "boolean"
            },
            "zoom": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/ZoomParams"
                }
              ],
              "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
            }
          },
          "type": "object"
        },
        "quantitativeColorScheme": {
          "$ref": "#/definitions/ColorSchemeConfig",
          "description": "Default color scheme for quantitative color scales when no named range such as `\"heatmap\"` or `\"ramp\"` applies."
        },
        "range": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "string"
            },
            {
              "items": {
                "$ref": "#/definitions/ExprRef"
              },
              "type": "array"
            }
          ],
          "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
        },
        "reverse": {
          "description": "If true, reverses the order of the scale range.\n\n__Default value:__ `false`.",
          "type": "boolean"
        },
        "round": {
          "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",
          "type": "boolean"
        },
        "scheme": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/SchemeParams"
            }
          ],
          "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
        },
        "type": {
          "$ref": "#/definitions/ScaleType",
          "description": "The type of scale.  Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
        },
        "zero": {
          "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",
          "type": "boolean"
        },
        "zoom": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ZoomParams"
            }
          ],
          "description": "If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."
        }
      },
      "type": "object"
    },
    "ScaleInterpolate": {
      "enum": [
        "rgb",
        "lab",
        "hcl",
        "hsl",
        "hsl-long",
        "hcl-long",
        "cubehelix",
        "cubehelix-long"
      ],
      "type": "string"
    },
    "ScaleInterpolateParams": {
      "additionalProperties": false,
      "properties": {
        "gamma": {
          "type": "number"
        },
        "type": {
          "enum": [
            "rgb",
            "cubehelix",
            "cubehelix-long"
          ],
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ScaleType": {
      "enum": [
        "null",
        "linear",
        "log",
        "pow",
        "sqrt",
        "symlog",
        "identity",
        "sequential",
        "quantize",
        "threshold",
        "ordinal",
        "point",
        "band",
        "index",
        "locus"
      ],
      "type": "string"
    },
    "SchemeParams": {
      "additionalProperties": false,
      "properties": {
        "count": {
          "description": "The number of colors to use in the scheme. This can be useful for scale types such as `\"quantize\"`, which use the length of the scale range to determine the number of discrete bins for the scale domain.",
          "type": "number"
        },
        "extent": {
          "description": "The extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "name": {
          "description": "A color scheme name for ordinal scales (e.g., `\"category10\"` or `\"blues\"`).\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.",
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "SearchDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldDefWithoutScale"
        },
        {
          "items": {
            "$ref": "#/definitions/FieldDefWithoutScale"
          },
          "type": "array"
        }
      ]
    },
    "SecondaryChromPosDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/GenomeAxis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "chrom": {
          "$ref": "#/definitions/FieldName",
          "description": "The field having the chromosome or contig."
        },
        "domainInert": {
          "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "offset": {
          "description": "An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\n\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\n\n**Default:** `0`",
          "type": "number"
        },
        "pos": {
          "$ref": "#/definitions/FieldName",
          "description": "The field having an intra-chromosomal position."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "chrom"
      ],
      "type": "object"
    },
    "SecondaryPositionalChannel": {
      "enum": [
        "x2",
        "y2"
      ],
      "type": "string"
    },
    "SelectionDomainRef": {
      "additionalProperties": false,
      "properties": {
        "encoding": {
          "description": "Selection interval channel to use.\n\nIf omitted, GenomeSpy infers the channel from the scale channel when possible (e.g., `x` -> `x`, `x2` -> `x`, `y` -> `y`, `y2` -> `y`).",
          "enum": [
            "x",
            "y"
          ],
          "type": "string"
        },
        "initial": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScalarDomain"
            },
            {
              "$ref": "#/definitions/ComplexDomain"
            }
          ],
          "description": "Initial configured domain for the linked scale when the linked interval selection is empty.\n\nOnly supported when the linked scale is zoomable.\n\nClearing the linked interval selection resets the domain to the normal default/data-derived domain instead of restoring `initial`."
        },
        "param": {
          "description": "Name of an interval selection parameter that provides the domain.",
          "type": "string"
        }
      },
      "required": [
        "param"
      ],
      "type": "object"
    },
    "SelectionFilterParams": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "If true, the filter retains all data objects when the selection is empty.\n\n**Default:** `true`",
          "type": "boolean"
        },
        "fields": {
          "additionalProperties": {
            "$ref": "#/definitions/Field"
          },
          "description": "An optional mapping of positional channels to fields. Used to determine which fields are checked against the selection intervals.",
          "properties": {
            "x": {
              "$ref": "#/definitions/Field"
            },
            "x2": {
              "$ref": "#/definitions/Field"
            },
            "y": {
              "$ref": "#/definitions/Field"
            },
            "y2": {
              "$ref": "#/definitions/Field"
            }
          },
          "type": "object"
        },
        "param": {
          "description": "A selection parameter. The data object is removed if it is not part of the selection.",
          "type": "string"
        },
        "type": {
          "const": "filter",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "param",
        "type"
      ],
      "type": "object"
    },
    "SelectionInitIntervalMapping": {
      "additionalProperties": false,
      "properties": {
        "x": {
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "y": {
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        }
      },
      "type": "object"
    },
    "SelectionParameter": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \"$\", or \"_\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \"datum\".",
          "type": "string"
        },
        "persist": {
          "description": "Whether the parameter should be persisted in bookmarks and provenance.\n\nThis primarily affects GenomeSpy App behavior. Set to `false` for ephemeral params (e.g., hover selections) or when the selection cannot be persisted due to missing `encoding.key`.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "push": {
          "const": "outer",
          "type": "string"
        },
        "select": {
          "anyOf": [
            {
              "$ref": "#/definitions/SelectionType"
            },
            {
              "$ref": "#/definitions/PointSelectionConfig"
            },
            {
              "$ref": "#/definitions/IntervalSelectionConfig"
            }
          ],
          "description": "Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`."
        },
        "value": {
          "$ref": "#/definitions/SelectionInitIntervalMapping",
          "description": "Initial value for the selection."
        }
      },
      "required": [
        "name",
        "select"
      ],
      "type": "object"
    },
    "SelectionType": {
      "enum": [
        "point",
        "interval"
      ],
      "type": "string"
    },
    "SeparatorProps": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "includePlotMargin": {
          "description": "Whether separators extend into the plot margin (axes/padding) around the grid.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "rule",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "zindex": {
          "description": "Z-order of the separator relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "SequenceGenerator": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "sequence": {
          "$ref": "#/definitions/SequenceParams",
          "description": "Generate a sequence of numbers."
        }
      },
      "required": [
        "sequence"
      ],
      "type": "object"
    },
    "SequenceParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldName"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The name of the generated sequence field.\n\n__Default value:__ `\"data\"`"
        },
        "start": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The starting value of the sequence (inclusive)."
        },
        "step": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The step value between sequence entries.\n\n__Default value:__ `1`"
        },
        "stop": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The ending value of the sequence (exclusive)."
        }
      },
      "required": [
        "start",
        "stop"
      ],
      "type": "object"
    },
    "ShapeDef": {
      "$ref": "#/definitions/MarkPropDef%3C(string%7Cnull)%2CTypeForShape%3E"
    },
    "SizeDef": {
      "additionalProperties": false,
      "properties": {
        "grow": {
          "description": "Share of the remaining space. See [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.",
          "type": "number"
        },
        "px": {
          "description": "Size in pixels",
          "type": "number"
        }
      },
      "type": "object"
    },
    "SortOrder": {
      "enum": [
        "ascending",
        "descending"
      ],
      "type": "string"
    },
    "StackParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "Fields to write the stacked values.\n\n**Default:** `[\"y0\", \"y1\"]`",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "baseField": {
          "$ref": "#/definitions/Field",
          "description": "The field that contains the base or amino acid. Used for information content calculation when the offset is `\"information\"`. The data objects that have `null` in the baseField are considered gaps and they are taken into account when scaling the the locus' information content."
        },
        "cardinality": {
          "description": "Cardinality, e.g., the number if distinct bases or amino acids. Used for information content calculation when the offset is `\"information\"`.\n\n**Default:** `4`",
          "type": "number"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "The field to stack. If no field is defined, a constant value of one is assumed."
        },
        "groupby": {
          "description": "The fields to be used for forming groups for different stacks.",
          "items": {
            "$ref": "#/definitions/Field"
          },
          "type": "array"
        },
        "offset": {
          "description": "How to offset the values in a stack. `\"zero\"` (default) starts stacking at 0. `\"center\"` centers the values around zero. `\"normalize\"` computes intra-stack percentages and normalizes the values to the range of `[0, 1]`. `\"information\"` computes a layout for a sequence logo. The total height of the stack reflects the group's information content.",
          "enum": [
            "zero",
            "center",
            "normalize",
            "information"
          ],
          "type": "string"
        },
        "sort": {
          "$ref": "#/definitions/CompareParams",
          "description": "The sort order of data in each stack."
        },
        "type": {
          "const": "stack",
          "description": "The type of the transform to be applied",
          "type": "string"
        }
      },
      "required": [
        "groupby",
        "type"
      ],
      "type": "object"
    },
    "Step": {
      "additionalProperties": false,
      "properties": {
        "step": {
          "type": "number"
        }
      },
      "required": [
        "step"
      ],
      "type": "object"
    },
    "StringDatumDef": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "format": {
          "description": "When used with the default `\"number\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.",
          "type": "string"
        },
        "resolutionChannel": {
          "$ref": "#/definitions/ChannelWithScale",
          "description": "An alternative channel for scale resolution.\n\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "$ref": "#/definitions/Type"
        }
      },
      "type": "object"
    },
    "StringFieldDef": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "domainInert": {
              "description": "Whether the field or evaluated expr should be excluded from the scale's domain. Prefer the view-level `domainInert` when an entire subtree should be excluded.\n\n**Default value:** `false`",
              "type": "boolean"
            },
            "field": {
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
              "type": "string"
            },
            "format": {
              "description": "When used with the default `\"number\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.",
              "type": "string"
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "field": {
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.",
              "type": "string"
            },
            "format": {
              "description": "When used with the default `\"number\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.",
              "type": "string"
            },
            "title": {
              "description": "A title for the field. If `null`, the title will be removed.",
              "type": [
                "string",
                "null"
              ]
            },
            "type": {
              "$ref": "#/definitions/Type"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        }
      ]
    },
    "StyleConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "The horizontal alignment of the text. One of `\"left\"`, `\"center\"`, or `\"right\"`.\n\n**Default value:** `\"left\"`"
            },
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment for title text. One of `\"left\"`, `\"center\"`, or `\"right\"`."
            }
          ]
        },
        "anchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title and subtitle text. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
        },
        "angle": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "The rotation angle in degrees.\n\n**Default value:** `0`"
            },
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Angle in degrees of title and subtitle text."
            }
          ]
        },
        "arcFadingDistance": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "maxItems": 2,
              "minItems": 2,
              "type": "array"
            },
            {
              "const": false,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The range of the `\"arc\"` shape's fading distance in pixels. This property allows for making the arc's opacity fade out as it extends away from the chord. The fading distance is interpolated from one to zero between the interval defined by this property. Both `false` and `[0, 0]` disable fading.\n\n**Default value:** `false`"
        },
        "arcHeightFactor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Scaling factor for the `\"arc`\" shape's height. The default value `1.0` produces roughly circular arcs.\n\n**Default value:** `1.0`"
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/Baseline",
              "description": "The vertical alignment of the text.  One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n**Default value:** `\"bottom\"`"
            },
            {
              "$ref": "#/definitions/Baseline",
              "description": "Vertical text baseline for title and subtitle text. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, or `\"bottom\"`."
            }
          ]
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "chromGrid": {
          "description": "A boolean flag indicating if chromosome grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "chromGridCap": {
          "description": "The stroke cap for the chromosome grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "chromGridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "chromGridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed chromosome grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromGridDashOffset": {
          "description": "The pixel offset at which to start drawing with the chromosome grid mark dash array.",
          "type": "number"
        },
        "chromGridFillEven": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridFillOdd": {
          "description": "Fill color of odd chromosomes.\n\n__Default value:__ (none)",
          "type": "string"
        },
        "chromGridOpacity": {
          "description": "The opacity of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromGridWidth": {
          "description": "Width of the chromosome grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "chromLabelAlign": {
          "$ref": "#/definitions/Align"
        },
        "chromLabelColor": {
          "type": "string"
        },
        "chromLabelFont": {
          "type": "string"
        },
        "chromLabelFontSize": {
          "type": "number"
        },
        "chromLabelFontStyle": {
          "$ref": "#/definitions/FontStyle"
        },
        "chromLabelFontWeight": {
          "$ref": "#/definitions/FontWeight"
        },
        "chromLabelPadding": {
          "type": "number"
        },
        "chromLabels": {
          "type": "boolean"
        },
        "chromTickColor": {
          "type": "string"
        },
        "chromTickDash": {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "chromTickDashOffset": {
          "type": "number"
        },
        "chromTickSize": {
          "type": "number"
        },
        "chromTickWidth": {
          "type": "number"
        },
        "chromTicks": {
          "type": "boolean"
        },
        "clampApex": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Whether the apex of the `\"dome\"` shape is clamped to the viewport edge. When over a half of the dome is located outside the viewport, clamping allows for more accurate reading of the value encoded by the apex' position.\n\n**Default value:** `false`"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
            },
            {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Text color for title text."
            }
          ]
        },
        "cornerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the rounded corners.\n\n**Default value:** `0`"
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the bottom right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top left rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Radius of the top right rounded corner. Has higher precedence than `cornerRadius`.\n\n**Default value:** (None)"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "domainColor": {
          "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`.",
          "type": "string"
        },
        "domainDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "domainDashOffset": {
          "description": "The pixel offset at which to start drawing with the domain dash array.",
          "type": "number"
        },
        "domainWidth": {
          "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
          "type": "number"
        },
        "dx": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Horizontal offset in pixels.\n\n**Default value:** `0`"
            },
            {
              "description": "The horizontal offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
              "type": "number"
            },
            {
              "description": "Delta offset for title and subtitle text x-coordinate.",
              "type": "number"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Vertical offset in pixels.\n\n**Default value:** `0`"
            },
            {
              "description": "The vertical offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
              "type": "number"
            },
            {
              "description": "Delta offset for title and subtitle text y-coordinate.",
              "type": "number"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color."
        },
        "fillGradientStrength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Gradient strength controls the amount of the gradient eye-candy effect in the fill color. Valid values are between `0` and `1`.\n\n**Default value:** `0`"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill opacity. Value between `0` and `1`."
        },
        "filled": {
          "description": "Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).",
          "type": "boolean"
        },
        "fitToBand": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, sets the secondary positional channel that allows the text to be squeezed (see the `squeeze` property). Can be used when: 1) `\"band\"`, `\"index\"`, or `\"locus\"` scale is being used and 2) only the primary positional channel is specified.\n\n**Default value:** `false`"
        },
        "flushX": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `x` and `x2` intersect the viewport."
        },
        "flushY": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `y` and `y2` intersect the viewport."
        },
        "font": {
          "anyOf": [
            {
              "description": "The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\n\n**Default value:** `\"Lato\"`",
              "type": "string"
            },
            {
              "description": "Font name for title text.",
              "type": "string"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font size in pixels for title text.",
          "minimum": 0
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style. Valid values: `\"normal\"` and `\"italic\"`.\n\n**Default value:** `\"normal\"`"
            },
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style for title text."
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. The following strings and numbers are valid values: `\"thin\"` (`100`), `\"light\"` (`300`), `\"regular\"` (`400`), `\"normal\"` (`400`), `\"medium\"` (`500`), `\"bold\"` (`700`), `\"black\"` (`900`)\n\n**Default value:** `\"regular\"`"
            },
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight for title text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            }
          ]
        },
        "format": {
          "description": "The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.",
          "type": "string"
        },
        "frame": {
          "$ref": "#/definitions/TitleFrame",
          "description": "The reference frame for the anchor position, one of `\"bounds\"` (to anchor relative to the full bounding box) or `\"group\"` (to anchor relative to the group width or height)."
        },
        "geometricZoomBound": {
          "description": "Enables geometric zooming. The value is the base two logarithmic zoom level where the maximum point size is reached.\n\n**Default value:** `0`",
          "type": "number"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "gridCap": {
          "description": "The stroke cap for the grid line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "gridColor": {
          "description": "Color of grid lines.\n\n__Default value:__ `lightgray`",
          "type": "string"
        },
        "gridDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed grid mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "gridDashOffset": {
          "description": "The pixel offset at which to start drawing with the grid mark dash array.",
          "type": "number"
        },
        "gridOpacity": {
          "description": "The opacity of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "gridWidth": {
          "description": "Width of the grid lines.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "hatch": {
          "anyOf": [
            {
              "const": "none",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "antiDiagonal",
              "type": "string"
            },
            {
              "const": "cross",
              "type": "string"
            },
            {
              "const": "vertical",
              "type": "string"
            },
            {
              "const": "horizontal",
              "type": "string"
            },
            {
              "const": "grid",
              "type": "string"
            },
            {
              "const": "dots",
              "type": "string"
            },
            {
              "const": "rings",
              "type": "string"
            },
            {
              "const": "ringsLarge",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A hatch pattern drawn inside the mark using the stroke width, color, and opacity. The pattern is aligned in screen space and scaled by the stroke width.\n\n**Default value:** `\"none\"`"
        },
        "inwardStroke": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Should the stroke only grow inwards, e.g, the diameter/outline is not affected by the stroke width. Thus, a point that has a zero size has no visible stroke. This allows strokes to be used with geometric zoom, etc.\n\n**Default value:** `false`"
        },
        "labelAlign": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
        },
        "labelAngle": {
          "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`."
        },
        "labelColor": {
          "description": "The color of the tick label, can be in hex color code or regular color name.",
          "type": "string"
        },
        "labelFont": {
          "description": "The font of the tick label.",
          "type": "string"
        },
        "labelFontSize": {
          "description": "The font size of the label, in pixels.",
          "minimum": 0,
          "type": "number"
        },
        "labelFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "labelFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of axis tick labels."
        },
        "labelLimit": {
          "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
          "type": "number"
        },
        "labelPadding": {
          "description": "The padding, in pixels, between axis and text labels.\n\n__Default value:__ `2`",
          "type": "number"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "linkShape": {
          "anyOf": [
            {
              "const": "arc",
              "type": "string"
            },
            {
              "const": "diagonal",
              "type": "string"
            },
            {
              "const": "line",
              "type": "string"
            },
            {
              "const": "dome",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The shape of the link path.\n\nThe `\"arc\"` shape draws a circular arc between the two points. The apex of the arc resides on the left side of the line that connects the two points. The `\"dome\"` shape draws a vertical or horizontal arc with a specific height. The primary positional channel determines the apex of the arc and the secondary determines the endpoint placement. The `\"diagonal\"` shape draws an \"S\"-shaped curve between the two points. The `\"line\"` shape draws a straight line between the two points. See an [example](#different-link-shapes-and-orientations) of the different shapes below.\n\n**Default value:** `\"arc\"`"
        },
        "logoLetters": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stretch letters so that they can be used with [sequence logos](https://en.wikipedia.org/wiki/Sequence_logo), etc..."
        },
        "maxChordLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of `\"arc\"` shape's chord in pixels. The chord is the line segment between the two points that define the arc. Limiting the chord length serves two purposes when zooming in close enough: 1) it prevents the arc from becoming a straight line and 2) it mitigates the limited precision of floating point numbers in arc rendering.\n\n**Default value:** `50000`"
        },
        "maxExtent": {
          "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
          "type": "number"
        },
        "minArcHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of an `\"arc\"` shape. Makes very short links more clearly visible.\n\n**Default value:** `1.5`"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minExtent": {
          "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
          "type": "number"
        },
        "minHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum height of a rectangle in pixels. The property clamps rectangles' heights.\n\n**Default value:** `0`"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "minOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Clamps the minimum size-dependent opacity. The property does not affect the `opacity` channel. Valid values are between `0` and `1`.\n\nWhen a rectangle would be smaller than what is specified in `minHeight` and `minWidth`, it is faded out proportionally. Example: a rectangle would be rendered as one pixel wide, but `minWidth` clamps it to five pixels. The rectangle is actually rendered as five pixels wide, but its opacity is multiplied by 0.2. With this setting, you can limit the factor to, for example, 0.5 to keep the rectangles more clearly visible.\n\n**Default value:** `0`"
        },
        "minPickingSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\n\n**Default value:** `3.0` for `\"link\"` and `2.0` for `\"point\"`"
        },
        "minWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum width of a rectangle in pixels. The property clamps rectangles' widths when the viewport is zoomed out.\n\nThis property also reduces flickering of very narrow rectangles when zooming. The value should generally be at least one.\n\n**Default value:** `1`"
        },
        "noFadingOnPointSelection": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Disables fading of the link when an mark instance is subject to any point selection. As the fading distance is unavailable as a visual channel, this property allows for enhancing the visibility of the selected links.\n\n**Default value:** `true`"
        },
        "offset": {
          "anyOf": [
            {
              "description": "The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.",
              "type": "number"
            },
            {
              "description": "The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.",
              "type": "number"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "orient": {
          "anyOf": [
            {
              "description": "The orientation of the tick mark.\n\nIf omitted, GenomeSpy infers the orientation when one positional channel uses a band-like scale and the other does not, or when the orthogonal channel is omitted. Specify `orient` explicitly when both `x` and `y` use band-like scales.\n\n**Default value:** inferred",
              "enum": [
                "vertical",
                "horizontal"
              ],
              "type": "string"
            },
            {
              "anyOf": [
                {
                  "const": "vertical",
                  "type": "string"
                },
                {
                  "const": "horizontal",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "The orientation of the link path. Either `\"vertical\"` or `\"horizontal\"`. Only applies to diagonal links.\n\n**Default value:** `\"vertical\"`"
            },
            {
              "$ref": "#/definitions/AxisOrient",
              "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
            },
            {
              "$ref": "#/definitions/TitleOrient",
              "description": "Default title orientation (`\"none\"`, `\"top\"`, `\"bottom\"`, `\"left\"`, or `\"right\"`)"
            }
          ]
        },
        "paddingX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal padding, in pixels, when the `x2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "paddingY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical padding, in pixels, when the `y2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "sampleFacetPadding": {
          "description": "Additional padding used by sample facets.\n\n**Default value:** `0.1`",
          "type": "number"
        },
        "segments": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The number of segments in the bézier curve. Affects the rendering quality and performance. Use a higher value for a smoother curve.\n\n**Default value:** `101`"
        },
        "semanticScore": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The semantic score used by semantic zooming in the point mark. This is primarily intended for internal use.\n\n**Default value:** `0`"
        },
        "semanticZoomFraction": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "TODO\n\n**Default value:** `0.02`"
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "shape": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "One of `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, `\"triangle-left\"`, `\"tick-up\"`, `\"tick-down\"`, `\"tick-right\"`, or `\"tick-left\"`\n\n**Default value:** `\"circle\"`"
        },
        "size": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "Stroke width of `\"link\"` and `\"rule\"` marks in pixels, the area of the bounding square of `\"point\"` mark, or the font size of `\"text\"` mark."
            },
            {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "The font size in pixels.\n\n**Default value:** `11`"
            }
          ]
        },
        "squeeze": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If the `squeeze` property is true and secondary positional channels (`x2` and/or `y2`) are used, the text is scaled to fit mark's width and/or height.\n\n**Default value:** `true`"
        },
        "stroke": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color"
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke opacity. Value between `0` and `1`."
        },
        "strokeWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke width in pixels."
        },
        "style": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
            },
            {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              ],
              "description": "A mark style property to apply to the title text mark. If not specified, a default style of `\"group-title\"` is applied."
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The text to display. The format of numeric data can be customized by setting a [format specifier](https://github.com/d3/d3-format#locale_format) to channel definition's `format` property.\n\n**Default value:** `\"\"`"
        },
        "thickness": {
          "description": "The thickness of the tick mark in pixels. Equivalent to the `size` of the underlying rule mark.\n\n**Default value:** `1`",
          "type": "number"
        },
        "tickCap": {
          "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "type": "string"
        },
        "tickColor": {
          "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`",
          "type": "string"
        },
        "tickCount": {
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of `2`, `5`, `10`) and lie within the underlying scale's range.",
          "minimum": 0,
          "type": "number"
        },
        "tickDash": {
          "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "tickDashOffset": {
          "description": "The pixel offset at which to start drawing with the tick mark dash array.",
          "type": "number"
        },
        "tickMinStep": {
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.",
          "type": "number"
        },
        "tickSize": {
          "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "tickWidth": {
          "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "description": "A title for the axis (none by default). Set to `null` to remove it.",
          "type": [
            "string",
            "null"
          ]
        },
        "titleColor": {
          "description": "Color of the title, can be in hex color code or regular color name.",
          "type": "string"
        },
        "titleFont": {
          "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
          "type": "string"
        },
        "titleFontSize": {
          "description": "Font size of the title.",
          "minimum": 0,
          "type": "number"
        },
        "titleFontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style of the title."
        },
        "titleFontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleOpacity": {
          "description": "Opacity of the axis title.",
          "type": "number"
        },
        "titlePadding": {
          "description": "The padding, in pixels, between title and axis.",
          "type": "number"
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "values": {
          "description": "Explicitly set the visible axis tick and label values.",
          "items": {},
          "type": "array"
        },
        "viewportEdgeFadeDistanceBottom": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceLeft": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceRight": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceTop": {
          "type": "number"
        },
        "viewportEdgeFadeWidthBottom": {
          "type": "number"
        },
        "viewportEdgeFadeWidthLeft": {
          "type": "number"
        },
        "viewportEdgeFadeWidthRight": {
          "type": "number"
        },
        "viewportEdgeFadeWidthTop": {
          "type": "number"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "zindex": {
          "anyOf": [
            {
              "description": "Z-order of the axis relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`, or `10` when the view content is clipped or scrollable.",
              "type": "number"
            },
            {
              "description": "Z-order of the title relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `1`",
              "type": "number"
            }
          ]
        }
      },
      "type": "object"
    },
    "TemplateImport": {
      "additionalProperties": false,
      "properties": {
        "template": {
          "description": "Imports a specification from the current view hierarchy, searching first in the current view, then ascending through ancestors.",
          "type": "string"
        }
      },
      "required": [
        "template"
      ],
      "type": "object"
    },
    "TextConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "The horizontal alignment of the text. One of `\"left\"`, `\"center\"`, or `\"right\"`.\n\n**Default value:** `\"left\"`"
        },
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The rotation angle in degrees.\n\n**Default value:** `0`"
        },
        "baseline": {
          "$ref": "#/definitions/Baseline",
          "description": "The vertical alignment of the text.  One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n**Default value:** `\"bottom\"`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "dx": {
          "description": "The horizontal offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
          "type": "number"
        },
        "dy": {
          "description": "The vertical offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
          "type": "number"
        },
        "fitToBand": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, sets the secondary positional channel that allows the text to be squeezed (see the `squeeze` property). Can be used when: 1) `\"band\"`, `\"index\"`, or `\"locus\"` scale is being used and 2) only the primary positional channel is specified.\n\n**Default value:** `false`"
        },
        "flushX": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `x` and `x2` intersect the viewport."
        },
        "flushY": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `y` and `y2` intersect the viewport."
        },
        "font": {
          "description": "The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\n\n**Default value:** `\"Lato\"`",
          "type": "string"
        },
        "fontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "The font style. Valid values: `\"normal\"` and `\"italic\"`.\n\n**Default value:** `\"normal\"`"
        },
        "fontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "The font weight. The following strings and numbers are valid values: `\"thin\"` (`100`), `\"light\"` (`300`), `\"regular\"` (`400`), `\"normal\"` (`400`), `\"medium\"` (`500`), `\"bold\"` (`700`), `\"black\"` (`900`)\n\n**Default value:** `\"regular\"`"
        },
        "logoLetters": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stretch letters so that they can be used with [sequence logos](https://en.wikipedia.org/wiki/Sequence_logo), etc..."
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "paddingX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal padding, in pixels, when the `x2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "paddingY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical padding, in pixels, when the `y2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font size in pixels.\n\n**Default value:** `11`"
        },
        "squeeze": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If the `squeeze` property is true and secondary positional channels (`x2` and/or `y2`) are used, the text is scaled to fit mark's width and/or height.\n\n**Default value:** `true`"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The text to display. The format of numeric data can be customized by setting a [format specifier](https://github.com/d3/d3-format#locale_format) to channel definition's `format` property.\n\n**Default value:** `\"\"`"
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "viewportEdgeFadeDistanceBottom": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceLeft": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceRight": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceTop": {
          "type": "number"
        },
        "viewportEdgeFadeWidthBottom": {
          "type": "number"
        },
        "viewportEdgeFadeWidthLeft": {
          "type": "number"
        },
        "viewportEdgeFadeWidthRight": {
          "type": "number"
        },
        "viewportEdgeFadeWidthTop": {
          "type": "number"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "TextDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/StringFieldDef"
        },
        {
          "$ref": "#/definitions/StringDatumDef"
        },
        {
          "$ref": "#/definitions/ExprDef"
        },
        {
          "$ref": "#/definitions/ValueDef%3Cstring%3E"
        }
      ]
    },
    "TextProps": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "The horizontal alignment of the text. One of `\"left\"`, `\"center\"`, or `\"right\"`.\n\n**Default value:** `\"left\"`"
        },
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The rotation angle in degrees.\n\n**Default value:** `0`"
        },
        "baseline": {
          "$ref": "#/definitions/Baseline",
          "description": "The vertical alignment of the text.  One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n**Default value:** `\"bottom\"`"
        },
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "dx": {
          "description": "The horizontal offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
          "type": "number"
        },
        "dy": {
          "description": "The vertical offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.",
          "type": "number"
        },
        "fitToBand": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, sets the secondary positional channel that allows the text to be squeezed (see the `squeeze` property). Can be used when: 1) `\"band\"`, `\"index\"`, or `\"locus\"` scale is being used and 2) only the primary positional channel is specified.\n\n**Default value:** `false`"
        },
        "flushX": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `x` and `x2` intersect the viewport."
        },
        "flushY": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, the text is kept inside the viewport when the range of `y` and `y2` intersect the viewport."
        },
        "font": {
          "description": "The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\n\n**Default value:** `\"Lato\"`",
          "type": "string"
        },
        "fontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "The font style. Valid values: `\"normal\"` and `\"italic\"`.\n\n**Default value:** `\"normal\"`"
        },
        "fontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "The font weight. The following strings and numbers are valid values: `\"thin\"` (`100`), `\"light\"` (`300`), `\"regular\"` (`400`), `\"normal\"` (`400`), `\"medium\"` (`500`), `\"bold\"` (`700`), `\"black\"` (`900`)\n\n**Default value:** `\"regular\"`"
        },
        "logoLetters": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Stretch letters so that they can be used with [sequence logos](https://en.wikipedia.org/wiki/Sequence_logo), etc..."
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "paddingX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal padding, in pixels, when the `x2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "paddingY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical padding, in pixels, when the `y2` channel is used for ranged text.\n\n**Default value:** `0`"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font size in pixels.\n\n**Default value:** `11`"
        },
        "squeeze": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If the `squeeze` property is true and secondary positional channels (`x2` and/or `y2`) are used, the text is scaled to fit mark's width and/or height.\n\n**Default value:** `true`"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scalar"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The text to display. The format of numeric data can be customized by setting a [format specifier](https://github.com/d3/d3-format#locale_format) to channel definition's `format` property.\n\n**Default value:** `\"\"`"
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "text",
          "type": "string"
        },
        "viewportEdgeFadeDistanceBottom": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceLeft": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceRight": {
          "type": "number"
        },
        "viewportEdgeFadeDistanceTop": {
          "type": "number"
        },
        "viewportEdgeFadeWidthBottom": {
          "type": "number"
        },
        "viewportEdgeFadeWidthLeft": {
          "type": "number"
        },
        "viewportEdgeFadeWidthRight": {
          "type": "number"
        },
        "viewportEdgeFadeWidthTop": {
          "type": "number"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "TickConfig": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "orient": {
          "description": "The orientation of the tick mark.\n\nIf omitted, GenomeSpy infers the orientation when one positional channel uses a band-like scale and the other does not, or when the orthogonal channel is omitted. Specify `orient` explicitly when both `x` and `y` use band-like scales.\n\n**Default value:** inferred",
          "enum": [
            "vertical",
            "horizontal"
          ],
          "type": "string"
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "thickness": {
          "description": "The thickness of the tick mark in pixels. Equivalent to the `size` of the underlying rule mark.\n\n**Default value:** `1`",
          "type": "number"
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "TickProps": {
      "additionalProperties": false,
      "properties": {
        "buildIndex": {
          "description": "Whether the x channel should build an index for efficient subset rendering. If omitted, GenomeSpy enables indexing automatically for positional x encodings.",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "never",
              "type": "string"
            }
          ],
          "description": "If true, the mark is clipped to the UnitView's rectangle. By default, clipping is enabled for marks that have zoomable positional scales."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is over the mark. Mark cursor takes precedence over enclosing view cursors.\n\n__Default value:__ browser default"
        },
        "minBufferSize": {
          "description": "Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\n\nThis property is intended for internal use.",
          "type": "number"
        },
        "minLength": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum stroke length in pixels. Use this property to ensure that very short strokes remain visible even when the user zooms out.\n\n**Default value:** `0`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."
        },
        "orient": {
          "description": "The orientation of the tick mark.\n\nIf omitted, GenomeSpy infers the orientation when one positional channel uses a band-like scale and the other does not, or when the orthogonal channel is omitted. Specify `orient` explicitly when both `x` and `y` use band-like scales.\n\n**Default value:** inferred",
          "enum": [
            "vertical",
            "horizontal"
          ],
          "type": "string"
        },
        "strokeCap": {
          "anyOf": [
            {
              "const": "butt",
              "type": "string"
            },
            {
              "const": "square",
              "type": "string"
            },
            {
              "const": "round",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The style of stroke ends. Available choices: `\"butt\"`, `\"round`\", and `\"square\"`.\n\n**Default value:** `\"butt\"`"
        },
        "strokeDash": {
          "description": "An array of of alternating stroke and gap lengths or `null` for solid strokes.\n\n**Default value:** `null`",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "An offset for the stroke dash pattern.\n\n**Default value:** `0`",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones."
        },
        "thickness": {
          "description": "The thickness of the tick mark in pixels. Equivalent to the `size` of the underlying rule mark.\n\n**Default value:** `1`",
          "type": "number"
        },
        "tooltip": {
          "$ref": "#/definitions/Tooltip",
          "description": "Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."
        },
        "type": {
          "const": "tick",
          "type": "string"
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the x axis."
        },
        "xOffset": {
          "description": "Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Position on the y axis."
        },
        "yOffset": {
          "description": "Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\n\n**Default value:** `0`",
          "type": "number"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "Title": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment for title text. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "anchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title and subtitle text. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
        },
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Angle in degrees of title and subtitle text."
        },
        "baseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline for title and subtitle text. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, or `\"bottom\"`."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Text color for title text."
        },
        "dx": {
          "description": "Delta offset for title and subtitle text x-coordinate.",
          "type": "number"
        },
        "dy": {
          "description": "Delta offset for title and subtitle text y-coordinate.",
          "type": "number"
        },
        "font": {
          "description": "Font name for title text.",
          "type": "string"
        },
        "fontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font size in pixels for title text.",
          "minimum": 0
        },
        "fontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style for title text."
        },
        "fontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight for title text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "frame": {
          "$ref": "#/definitions/TitleFrame",
          "description": "The reference frame for the anchor position, one of `\"bounds\"` (to anchor relative to the full bounding box) or `\"group\"` (to anchor relative to the group width or height)."
        },
        "offset": {
          "description": "The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.",
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/TitleOrient",
          "description": "Default title orientation (`\"none\"`, `\"top\"`, `\"bottom\"`, `\"left\"`, or `\"right\"`)"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A mark style property to apply to the title text mark. If not specified, a default style of `\"group-title\"` is applied."
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The title text."
        },
        "zindex": {
          "description": "Z-order of the title relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `1`",
          "type": "number"
        }
      },
      "required": [
        "text"
      ],
      "type": "object"
    },
    "TitleAnchor": {
      "enum": [
        null,
        "start",
        "middle",
        "end"
      ],
      "type": [
        "null",
        "string"
      ]
    },
    "TitleConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment for title text. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "anchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title and subtitle text. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
        },
        "angle": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Angle in degrees of title and subtitle text."
        },
        "baseline": {
          "$ref": "#/definitions/Baseline",
          "description": "Vertical text baseline for title and subtitle text. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, or `\"bottom\"`."
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Text color for title text."
        },
        "dx": {
          "description": "Delta offset for title and subtitle text x-coordinate.",
          "type": "number"
        },
        "dy": {
          "description": "Delta offset for title and subtitle text y-coordinate.",
          "type": "number"
        },
        "font": {
          "description": "Font name for title text.",
          "type": "string"
        },
        "fontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font size in pixels for title text.",
          "minimum": 0
        },
        "fontStyle": {
          "$ref": "#/definitions/FontStyle",
          "description": "Font style for title text."
        },
        "fontWeight": {
          "$ref": "#/definitions/FontWeight",
          "description": "Font weight for title text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "frame": {
          "$ref": "#/definitions/TitleFrame",
          "description": "The reference frame for the anchor position, one of `\"bounds\"` (to anchor relative to the full bounding box) or `\"group\"` (to anchor relative to the group width or height)."
        },
        "offset": {
          "description": "The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.",
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/TitleOrient",
          "description": "Default title orientation (`\"none\"`, `\"top\"`, `\"bottom\"`, `\"left\"`, or `\"right\"`)"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A mark style property to apply to the title text mark. If not specified, a default style of `\"group-title\"` is applied."
        },
        "zindex": {
          "description": "Z-order of the title relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `1`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "TitleFrame": {
      "enum": [
        "bounds",
        "group"
      ],
      "type": "string"
    },
    "TitleOrient": {
      "enum": [
        "none",
        "left",
        "right",
        "top",
        "bottom"
      ],
      "type": "string"
    },
    "Tooltip": {
      "anyOf": [
        {
          "$ref": "#/definitions/HandledTooltip"
        },
        {
          "type": "null"
        },
        {
          "const": false,
          "type": "boolean"
        }
      ]
    },
    "TransformParams": {
      "anyOf": [
        {
          "$ref": "#/definitions/AggregateParams"
        },
        {
          "$ref": "#/definitions/CollectParams"
        },
        {
          "$ref": "#/definitions/CoverageParams"
        },
        {
          "$ref": "#/definitions/FlattenDelimitedParams"
        },
        {
          "$ref": "#/definitions/FormulaParams"
        },
        {
          "$ref": "#/definitions/FilterParams"
        },
        {
          "$ref": "#/definitions/FilterScoredLabelsParams"
        },
        {
          "$ref": "#/definitions/FlattenParams"
        },
        {
          "$ref": "#/definitions/FlattenCompressedExonsParams"
        },
        {
          "$ref": "#/definitions/FlattenSequenceParams"
        },
        {
          "$ref": "#/definitions/IdentifierParams"
        },
        {
          "$ref": "#/definitions/LinearizeGenomicCoordinateParams"
        },
        {
          "$ref": "#/definitions/MeasureTextParams"
        },
        {
          "$ref": "#/definitions/MergeFacetsParams"
        },
        {
          "$ref": "#/definitions/PileupParams"
        },
        {
          "$ref": "#/definitions/ProjectParams"
        },
        {
          "$ref": "#/definitions/RegexExtractParams"
        },
        {
          "$ref": "#/definitions/RegexFoldParams"
        },
        {
          "$ref": "#/definitions/SampleParams"
        },
        {
          "$ref": "#/definitions/StackParams"
        }
      ]
    },
    "Type": {
      "enum": [
        "quantitative",
        "ordinal",
        "nominal",
        "index",
        "locus"
      ],
      "type": "string"
    },
    "TypeForShape": {
      "enum": [
        "ordinal",
        "nominal"
      ],
      "type": "string"
    },
    "UnitSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "mark": {
          "anyOf": [
            {
              "$ref": "#/definitions/MarkType"
            },
            {
              "$ref": "#/definitions/MarkProps"
            }
          ],
          "description": "The graphical mark presenting the data objects."
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "opacity": {
          "$ref": "#/definitions/ViewOpacityDef",
          "description": "Opacity of the view and all its children.\n\nThis can be:\n\n- a fixed number between `0` and `1`\n- an expression reference (`ExprRef`)\n- a `DynamicOpacity` definition for zoom-dependent opacity\n\nDynamic opacity is useful for semantic zooming where layers are faded in and out as the user zooms.\n\nExample:\n\n```json \"opacity\": {   \"unitsPerPixel\": [100000, 40000],   \"values\": [0, 1] } ```\n\nIn this example, the view fades in while zooming in from 100 000 to 40 000 units per pixel.\n\n__Default value:__ `1.0`"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "The background of the view, including fill, stroke, and stroke width."
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "mark"
      ],
      "type": "object"
    },
    "UrlData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/UrlList"
            }
          ],
          "description": "An URL or an array of URLs from which to load the data set. Gzip-compressed resources are decompressed transparently when the URL, MIME type, or payload indicates gzip content. Use the `format.type` property to ensure the loaded data is correctly parsed."
        }
      },
      "required": [
        "url"
      ],
      "type": "object"
    },
    "UrlGenomeConfig": {
      "additionalProperties": false,
      "deprecated": "Use `GenomeDefinition` in root `genomes` entries and `scale.assembly`.",
      "properties": {
        "name": {
          "description": "Name of the genome assembly, e.g., `hg19` or `hg38`.",
          "type": "string"
        },
        "url": {
          "description": "A URL to a `chrom.sizes` file, which is a tab-separated file with two columns: the sequence name and its size.\n\nYou may want to strip alternative loci, haplotypes, and other non-canonical contigs from the file.\n\nExample: `\"https://genomespy.app/data/genomes/hg19/chrom.sizes\"`",
          "type": "string"
        }
      },
      "required": [
        "name",
        "url"
      ],
      "type": "object"
    },
    "UrlGenomeDefinition": {
      "additionalProperties": false,
      "properties": {
        "url": {
          "description": "A URL to a `chrom.sizes` file, which is a tab-separated file with two columns: the sequence name and its size.\n\nYou may want to strip alternative loci, haplotypes, and other non-canonical contigs from the file.\n\nExample: `\"https://genomespy.app/data/genomes/hg19/chrom.sizes\"`",
          "type": "string"
        }
      },
      "required": [
        "url"
      ],
      "type": "object"
    },
    "UrlImport": {
      "additionalProperties": false,
      "properties": {
        "url": {
          "description": "Imports a specification from the specified URL.",
          "type": "string"
        }
      },
      "required": [
        "url"
      ],
      "type": "object"
    },
    "UrlList": {
      "additionalProperties": false,
      "properties": {
        "type": {
          "description": "The format of the data in the list. If the type is `\"json\"`, the list is expected to be an array of strings. If the type is `\"csv\"` or `\"tsv\"`, the list is expected to be a table with a single column named `url`.\n\n__Default value:__ `\"txt\"`",
          "enum": [
            "json",
            "csv",
            "tsv"
          ],
          "type": "string"
        },
        "urlsFromFile": {
          "description": "A URL that returns a list of URLs to load the data set. The URLs in the list can be absolute or relative to the URL of the list.",
          "type": "string"
        }
      },
      "required": [
        "urlsFromFile"
      ],
      "type": "object"
    },
    "VConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "baseUrl": {
          "description": "The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view's base URL equals to the visualization specification's base URL.",
          "type": "string"
        },
        "config": {
          "$ref": "#/definitions/GenomeSpyConfig",
          "description": "Configures defaults for this view subtree.\n\nProperties in child views override properties inherited from ancestors."
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Mouse cursor shown while the pointer is inside the view. The deepest matching cursor wins: mark cursor first, then the pointed view, then ancestor views outward toward the root.\n\n__Default value:__ browser default"
        },
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."
        },
        "description": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."
        },
        "domainInert": {
          "description": "If true, this view and its descendants do not contribute to scale domains. Child views inherit this flag automatically.\n\n**Default value:** `false`",
          "type": "boolean"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default value:** `\"container\"`"
        },
        "name": {
          "description": "An explicit name used to address the view. It is recommended to keep names unique among siblings. In the App (where view state is bookmarkable), the name must be unique within its import scope for views with configurable visibility, etc.",
          "type": "string"
        },
        "padding": {
          "$ref": "#/definitions/PaddingConfig",
          "description": "Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\n\nExamples:\n- `padding: 10`\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\n\n**Default value:** `0`"
        },
        "params": {
          "description": "Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.",
          "items": {
            "$ref": "#/definitions/Parameter"
          },
          "type": "array"
        },
        "resolve": {
          "additionalProperties": false,
          "description": "Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.",
          "properties": {
            "axis": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            },
            "scale": {
              "additionalProperties": {
                "$ref": "#/definitions/ResolutionBehavior"
              },
              "properties": {
                "angle": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "color": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "default": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dx": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "dy": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "facetIndex": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fill": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "fillOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "key": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "opacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "sample": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "search": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "semanticScore": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "shape": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "size": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "stroke": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeOpacity": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "strokeWidth": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "text": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "uniqueId": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "x2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y": {
                  "$ref": "#/definitions/ResolutionBehavior"
                },
                "y2": {
                  "$ref": "#/definitions/ResolutionBehavior"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "separator": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/SeparatorProps"
            }
          ],
          "description": "Draws separator rules between visible child views. The separators are centered within the spacing gaps and do not affect layout.\n\nIf `true`, the defaults are equivalent to: `{\"type\":\"rule\",\"size\":1,\"color\":\"#ccc\",\"opacity\":1,\"strokeDash\":[4,4],\"strokeCap\":\"butt\"}` Use `includePlotMargin` to control whether the separators extend into the plot margin.\n\n__Default value:__ `false`"
        },
        "spacing": {
          "description": "The gap between the views, in pixels.",
          "type": "number"
        },
        "templates": {
          "additionalProperties": {
            "$ref": "#/definitions/ViewSpec"
          },
          "type": "object"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Title"
            }
          ],
          "description": "View title. N.B.: Currently, GenomeSpy doesn't do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."
        },
        "transform": {
          "description": "An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.",
          "items": {
            "$ref": "#/definitions/TransformParams"
          },
          "type": "array"
        },
        "vconcat": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/ViewSpec"
              },
              {
                "$ref": "#/definitions/ImportSpec"
              }
            ]
          },
          "type": "array"
        },
        "viewportHeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `height`)"
        },
        "viewportWidth": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\n\n**Default:** `null` (same as `width`)"
        },
        "visible": {
          "description": "The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\n\n**Default:** `true`",
          "type": "boolean"
        },
        "width": {
          "anyOf": [
            {
              "$ref": "#/definitions/SizeDef"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/Step"
            },
            {
              "const": "container",
              "type": "string"
            }
          ],
          "description": "Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\n\n**Default:** `\"container\"`"
        }
      },
      "required": [
        "vconcat"
      ],
      "type": "object"
    },
    "ValueDef<number>": {
      "additionalProperties": false,
      "properties": {
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "value"
      ],
      "type": "object"
    },
    "ValueDef<string>": {
      "additionalProperties": false,
      "properties": {
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "value"
      ],
      "type": "object"
    },
    "ValueDefWithCondition<(string|null),Type>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CMarkPropFieldDef%3CType%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CScaleDatumDef%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CMarkPropExprDef%3CType%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<(string|null),TypeForShape>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CMarkPropFieldDef%3CTypeForShape%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CScaleDatumDef%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CMarkPropExprDef%3CTypeForShape%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<number,Type>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/Conditional%3CMarkPropFieldDef%3CType%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CScaleDatumDef%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CMarkPropExprDef%3CType%3E%3E"
            },
            {
              "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
            },
            {
              "items": {
                "$ref": "#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "title": {
          "description": "A title for the field. If `null`, the title will be removed.",
          "type": [
            "string",
            "null"
          ]
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"`, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "VariableParameter": {
      "additionalProperties": false,
      "properties": {
        "bind": {
          "$ref": "#/definitions/Binding",
          "description": "Binds the parameter to an external input element such as a slider, selection list or radio button group."
        },
        "expr": {
          "description": "An expression for the value of the parameter. This expression may include other parameters, in which case the parameter will automatically update in response to upstream parameter changes.",
          "type": "string"
        },
        "name": {
          "description": "A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \"$\", or \"_\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \"datum\".",
          "type": "string"
        },
        "persist": {
          "description": "Whether the parameter should be persisted in bookmarks and provenance.\n\nThis primarily affects GenomeSpy App behavior. Set to `false` for ephemeral params (e.g., hover selections) or when the selection cannot be persisted due to missing `encoding.key`.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "push": {
          "const": "outer",
          "type": "string"
        },
        "value": {
          "description": "The [initial value](http://vega.github.io/vega-lite/docs/value.html) of the parameter.\n\n__Default value:__ `undefined`"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "VcfData": {
      "additionalProperties": false,
      "properties": {
        "addChrPrefix": {
          "description": "Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\n\n__Default value:__ `false`",
          "type": [
            "boolean",
            "string"
          ]
        },
        "channel": {
          "$ref": "#/definitions/PrimaryPositionalChannel",
          "description": "Which channel's scale domain to monitor.\n\n__Default value:__ `\"x\"`"
        },
        "debounce": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\n\n__Default value:__ `200`"
        },
        "debounceDomainChange": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Debounce time for scale-domain driven data updates, in milliseconds.\n\n__Default value:__ `200`"
        },
        "debounceMode": {
          "description": "The debounce mode for data updates. If set to `\"domain\"`, domain change events (panning and zooming) will be debounced. If set to `\"window\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced.  If your data is small, the `\"window\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\n\n__Default value:__ `\"window\"`",
          "enum": [
            "domain",
            "window"
          ],
          "type": "string"
        },
        "indexUrl": {
          "description": "Url of the tabix index file.\n\n__Default value:__ `url` + `\".tbi\"`.",
          "type": "string"
        },
        "type": {
          "const": "vcf",
          "type": "string"
        },
        "url": {
          "description": "Url of the bgzip compressed file.",
          "type": "string"
        },
        "windowSize": {
          "description": "Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\n\n__Default value:__ `30000000`",
          "type": "number"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "type": "object"
    },
    "ViewBackground": {
      "additionalProperties": false,
      "properties": {
        "fill": {
          "description": "Fill color of the view background.",
          "type": "string"
        },
        "fillOpacity": {
          "description": "Opacity of the view background fill.",
          "type": "number"
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "stroke": {
          "description": "Stroke color of the view background.",
          "type": "string"
        },
        "strokeOpacity": {
          "description": "Opacity of the view background stroke.",
          "type": "number"
        },
        "strokeWidth": {
          "description": "Stroke width of the view background border.",
          "type": "number"
        },
        "strokeZindex": {
          "description": "Z-order of the background stroke relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`, or `10` when the view content is clipped or scrollable.",
          "type": "number"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Named style reference(s) resolved from `config.style`. If an array is provided, later styles override earlier ones.\n\n__Default value:__ `\"cell\"`"
        },
        "zindex": {
          "description": "Z-order of the background fill relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks.\n\n__Default value:__ `0`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "ViewBackgroundProps": {
      "additionalProperties": false,
      "properties": {
        "fill": {
          "description": "Fill color of the view background.",
          "type": "string"
        },
        "fillOpacity": {
          "description": "Opacity of the view background fill.",
          "type": "number"
        },
        "shadowBlur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The blur radius of the drop shadow in pixels. Higher values produce a more diffuse shadow.\n\n**Default value:** `0`"
        },
        "shadowColor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the drop shadow. Any valid CSS color string is allowed.\n\n**Default value:** `\"black\"`"
        },
        "shadowOffsetX": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal offset of the drop shadow in pixels. Positive values move the shadow to the right.\n\n**Default value:** `0`"
        },
        "shadowOffsetY": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical offset of the drop shadow in pixels. Positive values move the shadow downward.\n\n**Default value:** `0`"
        },
        "shadowOpacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The opacity of the drop shadow. Value between `0` (fully transparent) and `1` (fully opaque).\n\n**Default value:** `0` (disabled)"
        },
        "stroke": {
          "description": "Stroke color of the view background.",
          "type": "string"
        },
        "strokeOpacity": {
          "description": "Opacity of the view background stroke.",
          "type": "number"
        },
        "strokeWidth": {
          "description": "Stroke width of the view background border.",
          "type": "number"
        },
        "strokeZindex": {
          "description": "Z-order of the stroke relative to the view content.\n\nValues greater than `0` render the stroke after the view marks. Values less than or equal to `0` render before the marks. The default value depends on the element type.",
          "type": "number"
        },
        "zindex": {
          "description": "Z-order relative to the view content.\n\nValues greater than `0` render after the view marks. Values less than or equal to `0` render before the marks. The default value depends on the element type.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "ViewConfig": {
      "$ref": "#/definitions/ViewBackgroundProps"
    },
    "ViewOpacityDef": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "$ref": "#/definitions/DynamicOpacity"
        },
        {
          "$ref": "#/definitions/ExprRef"
        }
      ]
    },
    "ViewSpec": {
      "anyOf": [
        {
          "$ref": "#/definitions/UnitSpec"
        },
        {
          "$ref": "#/definitions/LayerSpec"
        },
        {
          "$ref": "#/definitions/MultiscaleSpec"
        },
        {
          "$ref": "#/definitions/VConcatSpec"
        },
        {
          "$ref": "#/definitions/HConcatSpec"
        },
        {
          "$ref": "#/definitions/ConcatSpec"
        }
      ]
    },
    "ZoomParams": {
      "additionalProperties": false,
      "properties": {
        "extent": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScalarDomain"
            },
            {
              "$ref": "#/definitions/ComplexDomain"
            }
          ],
          "description": "The boundaries that limit the zoom and pan interactions."
        }
      },
      "type": "object"
    }
  }
}

